【问题标题】:Cannot send VK_SHIFT using P/INVOKE from C#无法使用 C# 中的 P/INVOKE 发送 VK_SHIFT
【发布时间】: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 - 你可能不应该这样做。

标签: c# .net winapi interop


【解决方案1】:

改用keybd_event API 函数。

【讨论】:

  • "此功能已被取代。请改用 SendInput。"
  • @lysergic-acid 调用keybd_event 比调用SendInput 容易得多。
猜你喜欢
  • 2021-12-06
  • 2012-01-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多