Winapi 如何使用Win32API SendMessage更改保存对话框文件位置?

Winapi 如何使用Win32API SendMessage更改保存对话框文件位置?,winapi,sendmessage,savefiledialog,Winapi,Sendmessage,Savefiledialog,我正在编写一个程序,根据通用的“保存/另存为”对话框,自动将数据保存到特定位置 有两种攻击方法。这两种方法都需要在Spyxx下对消息进行监视句柄(因此本质上我们正在尝试复制sendmages) 使用Win32 SendMessage API设置带有目标路径的文件名的第一种方法。本例中的HWnd是文件名旁边的编辑字段 [DllImport("user32.dll")] public static extern IntPtr SendMessage(IntPtr hWnd, UInt32 Msg,

我正在编写一个程序,根据通用的“保存/另存为”对话框,自动将数据保存到特定位置

有两种攻击方法。这两种方法都需要在Spyxx下对消息进行监视句柄(因此本质上我们正在尝试复制sendmages)

使用Win32 SendMessage API设置带有目标路径的文件名的第一种方法。本例中的HWnd是文件名旁边的
编辑
字段

[DllImport("user32.dll")]
public static extern IntPtr SendMessage(IntPtr hWnd, UInt32 Msg, IntPtr wParam, [MarshalAs(UnmanagedType.LPStr)] string lParam);

SendMessage(HWnd, (int)WindowMessage.WM_SETTEXT, IntPtr.Zero, @"Address: %UserProfile%\Desktop\Target.txt");
这种方法的问题在于,它并不总是在Windows7和Windows8.1下设置文本(我在Windows10中的运气更好)。我试图设置一些等待时间,但无论我等待多长时间,这似乎都无关紧要(另外SendMessage是同步操作,所以应该设置文本,或者根本不设置文本)

第二种方法是在对话框顶部设置位置。同样,我们使用SendMessage来实现这一点,在本例中,HWnd引用
工具栏窗口32
对象,它是
面包屑父对象的子对象

SendMessage(HWnd, (int)WindowMessage.WM_SETTEXT, IntPtr.Zero, @"Address: %UserProfile%\Desktop");

不幸的是,这种方法似乎不起作用(也就是说,我可以发送消息,但对话框不会改变它的位置),我还没有弄清楚我遗漏了哪些步骤


我的问题是,如何使用Win32 API与第三方应用程序的“另存为”对话框交互,从而保证将文件保存在所需位置?非常感谢您的阅读

UI自动化有帮助吗?还有,您试图“攻击”什么?为什么要以
LPStr
的形式封送?这是一个8位ANSI字符串。尝试改用
LPWStr
,因为系统本机对话框可能使用Unicode窗口。正如andlabs所说,UI自动化将比原始窗口消息更好。但如果这不起作用,您可能不得不求助于将DLL注入第三方进程,并让它通过一个迂回的方法钩住
CoCreateInstance()
,实现COM委托以包装
IFileSaveDialog
,并用自定义逻辑覆盖其
Show()
方法,然后在
Show()时您可以做任何您想做的事情
调用时没有实际显示真正的对话框。@andlabs没有尝试破解应用程序。只想通过保存几次鼠标点击来自动化这个过程。仅此而已,自己编写代码比依赖现有UI更有趣Automation@RemyLebeau你知道一个关于DLL注入以及
CoCreateInstance
的好教程吗?DLL注入的问题是,我甚至不知道要注入哪个DLL。IDA Pro没有指出包含文件保存例程的DLL文件的确切函数您试图自动执行的对话框没有在DLL函数中实现。它是作为COM对象实现的。您可以插入自己的DLL(有许多方法可以实现),其中包含实现
IFileSaveDialog
接口的自定义类。一旦被注入,DLL就可以截获本机的
Ole32.CoCreateInstance()
函数。当应用程序调用
CoCreateInstance()
请求
IFileSaveDialog
对象时,将调用函数,返回类的实例。应用程序不会知道区别,因为它看到的只是界面。。。
SendMessage(HWnd, (int)WindowMessage.WM_SETTEXT, IntPtr.Zero, @"Address: Desktop"); // replicated message found on Spyxx