Как отправить ключи F12 из текущей формы/приложения .NET

Я почти уверен, что следующий код формы, активируемый кнопкой, должен вызывать Control-F12 в моем приложении C#:

ОтправитьКлючи("^{F12}");

Но, похоже, он не переходит к оболочке Windows и не активирует другую программу, которая ее прослушивает. Моя клавиатура работает. Похоже, что sendkeys где-то перехватывается, а не отправляется таким образом, который фактически имитирует нажатие клавиши. Любая помощь?


person Community    schedule 12.01.2009    source источник


Ответы (1)


SendKeys не может отправлять ключи за пределы активного приложения.

Чтобы действительно и по-настоящему имитировать нажатие клавиши в масштабе всей системы, вам нужно P/Invoke либо keybd_event, либо SendInput из user32.dll. (Согласно MSDN SendInput является «правильным» способом, но keybd_event работает и проще для P/Invoke.)

Пример (я думаю, что эти коды клавиш верны... первый в каждой паре — это код VK_, а второй — код сканирования клавиатуры... "2" – это KEYEVENTF_KEYUP)

[DllImport("user32.dll")]
private static extern void keybd_event(byte bVk, byte bScan,
    int dwFlags, int dwExtraInfo);

...

keybd_event(0xa2, 0x1d, 0, 0); // Press Left CTRL
keybd_event(0x7b, 0x58, 0, 0); // Press F12
keybd_event(0x7b, 0xd8, 2, 0); // Release F12
keybd_event(0xa2, 0x9d, 2, 0); // Release Left CTRL

Альтернативой является активация приложения, в которое вы отправляете сообщения, перед использованием SendKeys. Для этого вам нужно снова использовать P/Invoke, чтобы найти окно приложения и сфокусировать его.

person Eric Rosenberger    schedule 12.01.2009
comment
Можете ли вы объяснить разницу между кодами make и break и почему вы выбрали для этого коды? Я только что запустил приложение, очень похожее на это (Alt+D вместо Ctrl+F12), где я использовал коды прерывания во всех четырех вызовах keybd_event, и, похоже, оно работает так, как ожидалось. - person stack; 18.02.2010
comment
Собственно, скан-код вообще ни для чего не используется. ОС и приложения обычно просто смотрят код ВК. Таким образом, вы, вероятно, могли бы обойтись без передачи практически чего угодно для этого параметра (на самом деле, многие примеры в Интернете просто передают 0). Тем не менее, драйвер клавиатуры предоставляет правильные коды сканирования, поэтому для гарантии 100% совместимости, возможно, стоит включить их на тот случай, если какое-то приложение действительно их проверит. - person Eric Rosenberger; 19.02.2010
comment
В Интернете есть различные списки кодов сканирования, например codeproject.com/KB/system. /keyboard.aspx, а код прерывания для данного ключа — это код make плюс 0x80. Есть также функции API для преобразования туда и обратно, но я ими не пользовался. - person Eric Rosenberger; 19.02.2010
comment
Чтобы уточнить, код сборки — это код, который клавиатура отправляет при нажатии определенной клавиши, а код останова — это код, который она отправляет, когда эта клавиша отпущена. - person Eric Rosenberger; 19.02.2010