Регистрация Global HotKey без отключения его ключа

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

Но сейчас у меня проблема. Регистрация горячей клавиши отключает клавишу на клавиатуре, поэтому я могу только отправить эту клавишу в программу, в то время как я не могу набирать текст в любой другой программе (например, в блокноте).

Это мой код:

#include <iostream>
#include <windows.h>
using namespace std;

int main(int argc, char* argv[]) {
    RegisterHotKey(NULL, 1, NULL, 0x41); //Register A
    MSG msg = {0};

    while (GetMessageA(&msg, NULL, 0, 0) != 0) {
        if (msg.message == WM_HOTKEY) {
            cout << "A"; //Print A if I pressed it
        }
    }

    UnregisterHotKey(NULL, 1);
    return 0;
}

// and now I can't type A's

Есть ли простое решение этой проблемы? Спасибо

 Deanna13 июн. 2012 г., 12:26
Ну, в этом и состоит разница между крючком и горячей клавишей. Ловушка сообщает вам, когда она нажата, горячая клавиша отменяет обработку по умолчанию.
 SmRndGuy13 июн. 2012 г., 23:43
Благодаря комментариям выше я сделал это. Спасибо !
 chris13 июн. 2012 г., 02:26
Если недостатки не имеют значения, вы можете использовать не-DLL-хук (сWH_KEYBOARD_LL). Все это пара звонков, чтобы подключить / отцепить и обратный вызов. Сделай что-нибудь с этим, передай это.
 chris13 июн. 2012 г., 02:34
Выcould отступить к циклуGetAsyncKeyState тоже.

Ответы на вопрос(1)

Решение Вопроса

равное тому, которое вы фактически выполняли. Это означает:

You press 'A'. The program catches the 'A'. The program simulates the keypress.

Это довольно просто. Единственная проблема заключается в том, что ваша программа также будет ловить симулированное нажатие клавиши. Чтобы избежать этого, вы можете сделать следующее:

You press 'A'. The program catches the 'A'. The program unregisters the hotkey. The program simulates the keypress. (The program does not (!) catch the 'A'.) The program registers the hotkey again.

Вот и весь цикл.

Теперь, чтобы симулировать нажатие клавиши, вам нужно добавить дополнительный код. Посмотри на это:

#include <iostream>
#include <windows.h>
using namespace std;

int main(int argc, char* argv[]) {
    RegisterHotKey(NULL, 1, 0, 0x41);            //Register A; Third argument should also be "0" instead of "NULL", so it is not seen as pointer argument
    MSG msg = {0};
    INPUT ip;
    ip.type = INPUT_KEYBOARD;
    ip.ki.wScan = 0;
    ip.ki.time = 0;
    ip.ki.dwExtraInfo = 0;
    ip.ki.wVk = 0x41;                            //The key to be pressed is A.

    while (GetMessage(&msg, NULL, 0, 0) != 0) {
        if (msg.message == WM_HOTKEY) {
            UnregisterHotKey(NULL, 1);           //Prevents the loop from caring about the following
            ip.ki.dwFlags = 0;                   //Prepares key down
            SendInput(1, &ip, sizeof(INPUT));    //Key down
            ip.ki.dwFlags = KEYEVENTF_KEYUP;     //Prepares key up
            SendInput(1, &ip, sizeof(INPUT));    //Key up
            cout << "A";                         //Print A if I pressed it
            RegisterHotKey(NULL, 1, 0, 0x41);    //you know...
        }
    }

    UnregisterHotKey(NULL, 1);
    return 0;
}

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

 14 нояб. 2016 г., 20:50
Последовательные звонкиSendInput сnInputs Аргумент, равный 1, является ошибкой. Единственная разница междуkeybd_event а такжеSendInput является то, что последний способен вводить весь пакет ввода атомарно во входную очередь, так что он не чередуется с вводом из других источников.

Ваш ответ на вопрос