как отправить ключи в любое приложение, которое в данный момент выполняется из фоновой программы (c ++) - PullRequest
1 голос
/ 07 октября 2010

Мой вопрос: как отправить какой-либо ключ в любое приложение из приложения, работающего в фоновом режиме? Допустим, я сделал ярлык для клавиши СТРЕЛКА ВЛЕВО, которая называется ALT + S, и затем, когда я нахожусь в каком-либо приложении, и когда я нажимаю ALT + S, тот фоновый ответ приложения вызывает это сочетание клавиш и отправляет в открытую в настоящий момент клавишу СТРЕЛКА ВЛЕВО. Вот код, который я сделал в Embarcadero c ++ 2010 для имитации стрелки влево при нажатии alt + s каждые 200 миллисекунд:

void __fastcall TForm1::Timer1Timer(TObject *Sender)
{
     bool bBothPressed = GetAsyncKeyState(VK_MENU)  && GetAsyncKeyState(0x53);
    if(bBothPressed){
        // ShowMessage("control!");
        keybd_event(VK_LEFT, 0, 0, 0);
    }
} 

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

Ответы [ 2 ]

1 голос
/ 07 октября 2010

Я настоятельно рекомендую вам использовать RegisterHotKey вместо GetAsyncKeyState.Таким образом, вам не понадобится ни цикл, ни таймер, что делает ваше приложение более надежным и отзывчивым.

Чтобы имитировать нажатия клавиш в другом приложении / окне, вам необходимо:

A) Сфокусируйтесь на определенном окне:

BringWindowToTop(hwnd);
SetForegroundWindow(hwnd);
SetFocus(hwnd);

B) Отправьте события keydown + keyup:

keybd_event(keycode, 0, KEYEVENTF_KEYDOWN, 0);
keybd_event(keycode, 0, KEYEVENTF_KEYUP, 0);

Этого должно быть достаточно.Однако имейте в виду, что пользователь может уже нажимать одну из клавиш, которые вы имитируете , поэтому результат может оказаться не таким, как вы ожидали.Чтобы избежать этого, вам нужно проверить, нажимаются ли уже клавиши (используйте здесь GetAsyncKeyState), а затем отправить команду прежде, чем делать B .

ОБНОВЛЕНИЕ:

Если вы хотите отправить нажатия клавиш в любое приложение, которое в данный момент находится на переднем плане (в фокусе), вы можете пропустить A .

0 голосов
/ 07 октября 2010

SendInput () похоже, что это может быть полезно для вас.

...