hWnd PostMessage симуляция левого нажатия клавиш не работает - PullRequest
0 голосов
/ 15 апреля 2020

Я пытаюсь создать программу, которая будет имитировать нажатие клавиши LEFT в окне.

Я использую это:

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

и это:

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

Но результаты этих двух строк кода не идентичны результатам обычного нажатия LEFT в окне ...

Обычного нажатия LEFT (РАБОТАЕТ):

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

PostMessage LEFT нажатие клавиши (НЕ РАБОТАЕТ):

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

Почему это так? Это из-за того, что cRepeat, ScanCode, fExtended, fRepeat и fUp не совпадают? если да, то как мне их правильно настроить?

1 Ответ

0 голосов
/ 16 апреля 2020

Во-первых, для cRepeat ..., в соответствии с WM_KEYDOWN и WM_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;

Тогда, как отмечено в статье Рэймонда , использование PostMessage для имитации ввода с клавиатуры ненадежно. Вместо этого вы можете использовать SendInput метод. Конечно, вы можете использовать SendKeys , завернутый в формы.

Перед этим вам нужно получить фокус клавиатуры.

SetForegroundWindow(hwnd);
...