我正在编写一个程序,根据常见的“保存/另存为”对话框自动将数据保存到特定位置。
有两种攻击方法。这两种方法都需要监视Spyxx下的消息句柄(基本上我们试图复制SendMessage)
第一个方法,使用Win32 SendMessage API将文件名设置为目标路径。在这种情况下,HWnd是文件名旁边的Edit
字段。
[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");
这种方法的问题在于,它并不总是在Windows 7和Windows 8.1下设置文本(我确实在Windows 10中运气更好)。我试着设置一些等待时间,但不管我等了多久,它似乎都不重要(除了SendMessage是同步操作,所以文本应该设置,或者根本不设置)
第二方法是在对话框顶部设置位置。同样,我们使用SendMessage来完成此任务,在这种情况下,HWnd引用ToolbarWindow32
对象,它是Breadcrumb Parent
对象的子对象。
SendMessage(HWnd, (int)WindowMessage.WM_SETTEXT, IntPtr.Zero, @"Address: %UserProfile%\Desktop");
或
SendMessage(HWnd, (int)WindowMessage.WM_SETTEXT, IntPtr.Zero, @"Address: Desktop"); // replicated message found on Spyxx
不幸的是,这种方法似乎不起作用(即我可以发送消息,但是Dialog没有改变它的位置),我还没弄明白我缺少哪些步骤。
我的问题是,如何使用Win32 API与第三方应用的“另存为”对话框进行交互,以便保证将文件保存在所需的位置?非常感谢和感谢阅读!