Отправить нажатия клавиш в программу, даже если она в фоновом режиме с помощью C # - PullRequest
5 голосов
/ 13 января 2011

Я хочу отправить нажатие клавиши в программу, даже если она работает в фоновом режиме. Но я могу сделать это только для NOTEPAD, как это,

[DllImport("user32.dll")]
protected static extern byte VkKeyScan(char ch);

[DllImport("user32.dll", SetLastError = true)]
protected static extern IntPtr FindWindowEx(IntPtr hwndParent, IntPtr hwndChildAfter, string lpszClass, string lpszWindow);

[DllImport("User32.Dll", EntryPoint = "PostMessageA")]
protected static extern bool PostMessage(IntPtr hWnd, uint msg, int wParam, int lParam);

char Key = // key value to send

IntPtr hWnd = FindWindowEx(_handle, IntPtr.Zero, "edit", null);   // _handle is the windows handle of the program (here its notepad)
PostMessage(hWnd, WM_KEYDOWN, VkKeyScan(Key), 0);

Но для всех других приложений я не могу отправлять нажатия клавиш, если он работает в фоновом режиме. Поскольку я не знаю lpszClass этой программы (я думаю, что это имя userControl области ввода в этой программе. Для NotePad это "edit". Я нашел этот интернет для серфинга).

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

[DllImport("USER32.DLL")]
public static extern bool SetForegroundWindow(IntPtr hWnd);

SetForegroundWindow(_handle);       // _handle is the windows handle of the program

System.Threading.Thread.Sleep(50);       // Waiting few milliseconds till application coming to foreground.                    
wsh.SendKeys(Key.ToString(), ref wait);  // wsh is WshShellClass wsh= new WshShellClass();
SetForegroundWindow(_mainHandle);    // _mainHandle is the windows handle of my application

Но этот способ не работает. некоторые ключи пропускаются и программа переднего плана-> фон-> передний план-> фон ...... как ее танцы ...

Как отправить ключи другим приложениям, если они работают в фоновом режиме. или есть какой-нибудь способ / источник, чтобы найти lpszClass программы?

Извините, если я пропустил любую необходимую информацию. это большое приложение. Я разместил здесь только необходимые запчасти. Если кому-то нужна дополнительная информация, пожалуйста, спросите.

Ответы [ 2 ]

3 голосов
/ 13 января 2011

Я думаю, вам понадобится, чтобы фоновая программа установила низкоуровневый хук клавиатуры через функцию Win32 SetWindowsHookEx ().

Вот документация MSDN для SetWindowsHookEX ()

http://msdn.microsoft.com/en-us/library/ms644990(v=vs.85).aspx

А вот статья в КБ о том, как сделать это из C #

http://support.microsoft.com/kb/318804

Эта статья также содержит некоторые детали: http://www.codeguru.com/columns/vb/article.php/c4829

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

Удачи.

2 голосов
/ 13 января 2011

Вы можете определить lpszClass программы, используя инструмент проверки, такой как WinSpy ++ .Это дает вам перекрестие, которое вы можете перетащить и расположить над нужным элементом управления.Это позволило мне легко указать имя класса «edit» для блокнота.

Если что-то не работает, нажмите кнопку «Дополнительно >>» в правом нижнем углу WinSpy ++, затем нажмите «Найти»кнопка для просмотра иерархии элементов управления;вам может понадобиться отправить сообщение WM_KEYDOWN одному из родительских или дочерних элементов управления.

...