【问题标题】:hWnd PostMessage simulation of a left keypress doesn't work左键按下的 hWnd PostMessage 模拟不起作用
【发布时间】:2020-04-15 12:17:03
【问题描述】:

我正在尝试制作一个程序来模拟对窗口的LEFT 按键。

我正在使用这个:

PostMessage(hwnd, WM_KEYDOWN, new IntPtr(0x25), new IntPtr(0));

还有这个:

PostMessage(hwnd, WM_KEYUP, new IntPtr(0x25), new IntPtr(0));

但是这两行代码的结果和正常在窗口按LEFT的结果不一样...

正常按LEFT(WORKS):

P WM_KEYDOWN nVirtKey:VK_LEFT cRepeat:1 ScanCode:4B fExtended:1 fAltDown:0 fRepeat:0 fUp:0
P WM_KEYUP nVirtKey:VK_LEFT cRepeat:1 ScanCode:4B fExtended:1 fAltDown:0 fRepeat:1 fUp:1

PostMessageLEFT 按键(不起作用):

P WM_KEYDOWN nVirtKey:VK_LEFT cRepeat:0 ScanCode:00 fExtended:0 fAltDown:0 fRepeat:0 fUp:0
P WM_KEYUP nVirtKey:VK_LEFT cRepeat:0 ScanCode:00 fExtended:0 fAltDown:0 fRepeat:0 fUp:0

这是为什么呢?是不是因为cRepeatScanCodefExtendedfRepeatfUp 不一样?如果是这样,我该如何正确设置它们?

【问题讨论】:

标签: c# winapi sendmessage hwnd


【解决方案1】:

首先,对于cRepeat...,根据WM_KEYDOWNWM_KEYUP 它位于lParam 的不同位中。 设置它们:

//WM_KEYDOWN
UINT scan = 0x1 | 0x4b << 16 | 0x1 << 24 | 0x0 << 30 | 0x0 << 31;
//WM_KEYUP
scan = 0x1 | 0x4b << 16 | 0x1 << 24 | 0x1 << 30 | 0x1 << 31;

那么,正如Raymond's article 中提到的,使用PostMessage 模拟键盘输入是不可靠的。 相反,您可以使用SendInput 方法。当然你可以使用包裹在表单中的SendKeys

在此之前,您需要获得键盘焦点。

SetForegroundWindow(hwnd);

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-07-20
  • 1970-01-01
  • 1970-01-01
  • 2016-10-07
  • 2017-11-29
  • 1970-01-01
  • 2012-08-07
相关资源
最近更新 更多