【发布时间】:2013-01-03 16:24:10
【问题描述】:
我们正在尝试处理 C# 中的文件下载对话框(来自 IE)。
我们想要做的是清除对话框中的文本框,通过向窗口发送消息(Home、CTRL-A、Backspace)。
我在这里粘贴了一些代码,但不是全部,但似乎没有触发 CTRL 键(我没有看到突出显示的实际文本):
// HOME DOWN
NativeMethods.SendMessage(new HandleRef(null, _hwnd), NativeMethods.WM_KEYDOWN, new IntPtr(0x24), IntPtr.Zero);
Thread.Sleep(1000);
// HOME UP
NativeMethods.SendMessage(new HandleRef(null, _hwnd), NativeMethods.WM_KEYUP, new IntPtr(0x24), IntPtr.Zero);
Thread.Sleep(1000);
// CTRL DOWN
NativeMethods.SendMessage(new HandleRef(null, _hwnd), NativeMethods.WM_KEYDOWN, new IntPtr(0x11), IntPtr.Zero);
Thread.Sleep(1000);
// END DOWN
NativeMethods.SendMessage(new HandleRef(null, _hwnd), NativeMethods.WM_KEYDOWN, new IntPtr(0x41), IntPtr.Zero);
Thread.Sleep(1000);
// END UP
NativeMethods.SendMessage(new HandleRef(null, _hwnd), NativeMethods.WM_KEYUP, new IntPtr(0x41), IntPtr.Zero);
Thread.Sleep(1000);
// CTRL UP
NativeMethods.SendMessage(new HandleRef(null, _hwnd), NativeMethods.WM_KEYUP, new IntPtr(0x11), IntPtr.Zero);
Thread.Sleep(5);
将 SendMessage 函数与 WM_KEYUP 和 WM_KEYDOWN 消息结合使用时,我有什么遗漏吗?
SendMessage 函数声明如下:
[DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)]
internal static extern IntPtr SendMessage(HandleRef hWnd, uint Msg, IntPtr wParam, IntPtr lParam);
【问题讨论】:
-
不要使用
SendMessage()模拟输入。使用SendInput()或SendMessage()和适当的消息来实际清除文本 (WM_SETTEXT)。 -
我们尝试过使用 WM_SETTEXT,但结合 IE 下载对话框,似乎设置文本实际上并没有影响对话框(它将文件保存到与编辑位置不同的位置框设置为)。使用密钥发送它工作正常。
-
发布的代码有很多地方你做错了,击键被发布了,没有发送,你不能用 PostMessage 控制另一个进程的修饰键状态。但是从头开始,IE 下载确认对话框很特别。高调的攻击目标,惹不起。
-
您为什么要通过在 IE 上戳关键消息来从 Internet 下载?在不调用野兽的情况下以编程方式完成它是微不足道的。
-
我同意@HansPassant - 你可能不应该这样做。