Как отправить непрерывное нажатие клавиш в программу? - PullRequest
6 голосов
/ 11 июля 2011

Я использовал SendKeys.Send() & SendKeys.SendWait() для отправки ключей в программу переднего плана (программу, отличную от написанной в приложении).

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

Мой вопрос: Как я могу отправить непрерывное нажатие клавиши в программу?Эффект от этого нажатия клавиши должен быть таким же, как нажатие на себя, чтобы непрерывно набирать ключ в приложении.

РЕДАКТИРОВАНИЕ РЕШЕНИЯ

Решением было вызвать метод:

[DllImport("User32.dll")]
static extern int SendMessage(IntPtr hWnd, uint wMsg, UIntPtr wParam, IntPtr lParam);

с параметрами, полученными из:

public System.Diagnostics.Process [] p = System.Diagnostics.Process.GetProcessesByName ("process");

p [0] .MainWindowHandle равен hWnd

и использует Spy в окне:

, щелкнув правой кнопкой мыши строку сообщения в Spyпоказывает wMsg , wParam и lParam (все 3 в шестнадцатеричном формате)

SendMessage (p [0] .MainWindowHandle, (uint) 0x0100, (UIntPtr) 0x00000041, (IntPtr) (0x001E0001));

Посылая только одно сообщение WM_KEYDOWN, эффект заключается в непрерывном нажатии клавиши.Чтобы остановить программу, работающую, когда клавиша постоянно нажата, мне нужно нажать эту клавишу на клавиатуре и отпустить ее, чтобы сгенерировать WM_KEYUP.Отправка WM_KEYUP в коде дает System.OverFlow «Арифметическая операция, приведшая к переполнению».исключение.Любая идея, почему это может произойти?

Спасибо за ваши ответы: Ation и takrl

Ответы [ 2 ]

3 голосов
/ 11 июля 2011

Попробуйте использовать Win API SendMessage с WM_KEYDOWN и WM_KEYUP. Между этими сообщениями должна быть правильная задержка. Также вы можете использовать PostMessage для асинхронной отправки.

[DllImport("User32.dll")]
            public static extern int SendMessage(IntPtr hWnd, uint msg, int wparam, int lparam);
2 голосов
/ 11 июля 2011

Если я правильно понял, вы хотите имитировать эффект нажатия клавиши в приложении, а затем удерживать ее нажатой до тех пор, пока ОС не начнет повторять нажатия клавиш?Если это так, то подход API, такой как @Ation, предлагает путь.

Однако вы должны проанализировать, что получает приложение, используя инструмент типа Spy ++ или аналогичный.Я полагаю, что для повторяющегося ОС нажатия клавиш WM_KEYUP не будет, пока ключ не будет выпущен.И я не думаю, что вы можете повторить это поведение, используя SendKeys.Send или SendKEys.SendWait.

EDIT

Вот выдержка из журнала Spy ++ , взятого из TextBox элемента управления при нажатии буквы A:

<00168> 00010590 P WM_KEYDOWN nVirtKey:'A' cRepeat:1 ScanCode:1E fExtended:0 fAltDown:0 fRepeat:0 fUp:0
<00173> 00010590 P WM_CHAR chCharCode:'97' (97) cRepeat:1 ScanCode:1E fExtended:0 fAltDown:0 fRepeat:0 fUp:0
<00182> 00010590 P WM_KEYDOWN nVirtKey:'A' cRepeat:1 ScanCode:1E fExtended:0 fAltDown:0 fRepeat:1 fUp:0
<00187> 00010590 P WM_CHAR chCharCode:'97' (97) cRepeat:1 ScanCode:1E fExtended:0 fAltDown:0 fRepeat:1 fUp:0
<00196> 00010590 P WM_KEYDOWN nVirtKey:'A' cRepeat:3 ScanCode:1E fExtended:0 fAltDown:0 fRepeat:1 fUp:0
<00201> 00010590 P WM_CHAR chCharCode:'97' (97) cRepeat:3 ScanCode:1E fExtended:0 fAltDown:0 fRepeat:1 fUp:0
<00210> 00010590 P WM_KEYDOWN nVirtKey:'A' cRepeat:4 ScanCode:1E fExtended:0 fAltDown:0 fRepeat:1 fUp:0
<00215> 00010590 P WM_CHAR chCharCode:'97' (97) cRepeat:4 ScanCode:1E fExtended:0 fAltDown:0 fRepeat:1 fUp:0
<00224> 00010590 P WM_KEYDOWN nVirtKey:'A' cRepeat:3 ScanCode:1E fExtended:0 fAltDown:0 fRepeat:1 fUp:0
<00229> 00010590 P WM_CHAR chCharCode:'97' (97) cRepeat:3 ScanCode:1E fExtended:0 fAltDown:0 fRepeat:1 fUp:0
<00238> 00010590 P WM_KEYDOWN nVirtKey:'A' cRepeat:4 ScanCode:1E fExtended:0 fAltDown:0 fRepeat:1 fUp:0
<00243> 00010590 P WM_CHAR chCharCode:'97' (97) cRepeat:4 ScanCode:1E fExtended:0 fAltDown:0 fRepeat:1 fUp:0
<00252> 00010590 P WM_KEYDOWN nVirtKey:'A' cRepeat:3 ScanCode:1E fExtended:0 fAltDown:0 fRepeat:1 fUp:0
<00257> 00010590 P WM_CHAR chCharCode:'97' (97) cRepeat:3 ScanCode:1E fExtended:0 fAltDown:0 fRepeat:1 fUp:0
<00266> 00010590 P WM_KEYDOWN nVirtKey:'A' cRepeat:1 ScanCode:1E fExtended:0 fAltDown:0 fRepeat:1 fUp:0
<00271> 00010590 P WM_CHAR chCharCode:'97' (97) cRepeat:1 ScanCode:1E fExtended:0 fAltDown:0 fRepeat:1 fUp:0
<00280> 00010590 P WM_KEYUP nVirtKey:'A' cRepeat:1 ScanCode:1E fExtended:0 fAltDown:0 fRepeat:1 fUp:1

Как видите, есть несколько WM_KEYDOWN, за которыми следует WM_CHAR (это может относиться только к TextBox, который я использовал для этого, я не уверен в этом), и WM_KEYUP в самом конце.В журнале было несколько других сообщений, которые, казалось, не были связаны с нажатием клавиши (они постоянно нумеруются), но это может варьироваться в зависимости от вашего приложения или элемента управления, для которого вы собираетесь использовать это.

Обратите внимание на fRepeat:1 на WM_KEYUP и на всех предыдущих WM_KEYDOWN, за исключением первого, который, по-видимому, обозначает автоматическое повторение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...