Отправьте клавиши в программу, даже если она находится в фоне, используя C#

StackOverflow https://stackoverflow.com/questions/4683649

Вопрос

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

[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 об этой программе (я думаю, это название области типизации в этой программе. Для блокнота это "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 программы?

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

Это было полезно?

Решение

Вы можете выяснить lpszClass программы с использованием инструмента проверки, такой как Winspy ++. Анкет Это дает вам перекрестную черту, которую вы можете перетаскивать и позиционировать по желаемому управлению. Это было в состоянии легко предоставить мне имя класса «Редактировать» для блокнота.

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

Другие советы

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

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

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

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

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

Эта статья тоже входит в подробности: http://www.codeguru.com/columns/vb/article.php/c4829

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

Удачи.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top