1

私のラップトップのスペースバーが壊れているので、低レベルのキーボードフックを作成して無効にし(常に押されていると主張していたため)、フルストップ/ピリオドキーを新しいスペースバーに変更するという冒険に出ました..それはうまくいきます、2つの問題があります。

1) 新しいスペースバーのキーストロークが常に 2 回送信されます - 理由はわかりません

2)代替入力を読み取るようにこのフックを書き直そうとしていますが、その入力を出力して検証すると、出力が2倍になります。

私は強力な C++ プログラマーではありませんし、Windows API のマスターでもありません。

コードは次のとおりです:-

#include<Windows.h>
#include <stdio.h>
#include <iostream>

using namespace std;

HHOOK hHook = NULL;
INPUT space[2];
bool sendingSpace=false;

void sendSpace()
{
            cout << "Sending space\n";

        space[0].type=INPUT_KEYBOARD;
        space[0].ki.wVk=VK_SPACE;
        space[0].ki.time=0;

        space[1].type=INPUT_KEYBOARD;
        space[1].ki.wVk=VK_SPACE;
        space[1].ki.time=0;
        space[1].ki.dwFlags=KEYEVENTF_KEYUP;

        SendInput(2,space,sizeof(INPUT));


}

LRESULT CALLBACK MyLowLevelHook ( int nCode , WPARAM wParam , LPARAM lParam)
{
    KBDLLHOOKSTRUCT* hs = (KBDLLHOOKSTRUCT*)lParam;
    if(nCode <0)
    return CallNextHookEx(hHook , nCode ,wParam , lParam);

    switch(hs->vkCode)
    {
    case VK_SPACE:
        if(!sendingSpace)
        {
        cout << "Ignoring space bar\n";
            return 1;
        }
        else
        {
            return CallNextHookEx(hHook , nCode ,wParam , lParam);
        }
        break;

        case VK_OEM_PERIOD:
        sendingSpace=true;
        sendSpace();
        sendingSpace=false;

        return 1;


        break;

        default:
            cout << hs->vkCode << " ( " << (char)(hs->vkCode) << ")" << endl;
            break;
    }

        return CallNextHookEx(hHook , nCode ,wParam , lParam);
}

int main()
{
    //FreeConsole();

    MSG msg;
    hHook = SetWindowsHookEx(WH_KEYBOARD_LL, MyLowLevelHook , NULL,NULL);

    while(!PeekMessage(&msg, NULL, 0, 0,PM_REMOVE)>0)
    {

            TranslateMessage(&msg);
            DispatchMessage(&msg);
    }

    UnhookWindowsHookEx(hHook);
    return 0;
} 

PS Im は、私の問題を解決するための試行錯誤として PeekMessage のみを使用しています!

正しい方向を指しているガイダンス、ヘルプ、または指を前もって感謝します!

  • ティミー。
4

1 に答える 1