2

キーボードのイベントがいつもアクティブでなくてもキャッチできるプログラムを作りたいです。フックは、動作させるために必要なすべてのこと(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

この問題の簡単な解決策はありますか?ありがとうございました

4

1 に答える 1

4

実際に実行したキープレスと同じキープレスをプログラムにシミュレートさせます。つまり、次のことを意味します。

  1. 「A」を押します。
  2. プログラムは「A」をキャッチします。
  3. プログラムはキープレスをシミュレートします。

とても簡単です。唯一の問題は、プログラムがシミュレートされたキープレスもキャッチすることです。これを回避するには、次のようにします。

  1. 「A」を押します。
  2. プログラムは「A」をキャッチします。
  3. プログラムはホットキーを登録解除します。
  4. プログラムはキープレスをシミュレートします。
  5. (プログラムは (!) 'A' をキャッチしません。)
  6. プログラムはホットキーを再度登録します。

それがループ全体です。

ここで、キープレスをシミュレートするために、追加のコードを追加する必要があります。これを見てください:

#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;
}

私はそれを試してみましたが、うまくいくと思います。私が助けてくれることを願っています;)

于 2013-08-14T00:05:19.163 に答える