2

USB キーボード構成ツールの場合、すべてのキーボード入力を傍受し、どの修飾キーと通常のキーが同時に押されたかを検出する必要があります。したがって、Windows の低レベル フック (WH_KEYBOARD_LL) を使用しますが、これは正常に動作しますが、WIN キー (VK_LWIN / VK_RWIN) が押されている (コントロール / シフトと alt が機能している) かどうかを判断できません。

問題を表示するための小さなコマンドライン ツールを作成しました。

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

using namespace std;

HHOOK hKeyboardHook;


LRESULT CALLBACK LowLevelKeyboardProc( int nCode, WPARAM wParam, LPARAM lParam )
{
    if (nCode < 0 || nCode != HC_ACTION )
        return CallNextHookEx( hKeyboardHook, nCode, wParam, lParam);

    KBDLLHOOKSTRUCT* p = (KBDLLHOOKSTRUCT*)lParam;

    if(wParam == WM_KEYDOWN || wParam == WM_SYSKEYDOWN)
    {
        // working
        if(GetAsyncKeyState(VK_CONTROL) & 0x8000)
            cout << "CONTROL" << endl;
        if(GetAsyncKeyState(VK_SHIFT) & 0x8000)
            cout << "SHIFT" << endl;
        if(GetAsyncKeyState(VK_MENU) & 0x8000) // ALT
            cout << "ALT" << endl;

        // VK_xWIN not working at all
        if((GetAsyncKeyState(VK_LWIN) & 0x8000) || (GetAsyncKeyState(VK_RWIN) & 0x8000))
            cout << "WIN" << endl;

        // working for ALTGR/right-handed ALT
        if((GetAsyncKeyState(VK_LCONTROL) & 0x8000) || (GetAsyncKeyState(VK_RCONTROL) & 0x8000))
            cout << "LRCONTROL" << endl;

        // not working at all
        if((GetAsyncKeyState(VK_LSHIFT) & 0x8000) || (GetAsyncKeyState(VK_RSHIFT) & 0x8000))
            cout << "LRSHIFT" << endl;
        if((GetAsyncKeyState(VK_LMENU) & 0x8000) || (GetAsyncKeyState(VK_RMENU) & 0x8000))
            cout << "LRMENU" << endl;
    }

    //return CallNextHookEx( hKeyboardHook, nCode, wParam, lParam);
    return 1;
}



int main(int argc, char* argv[])
{
    hKeyboardHook = SetWindowsHookEx(WH_KEYBOARD_LL, LowLevelKeyboardProc, GetModuleHandle(NULL), 0 );

    MSG message;
    while (GetMessage(&message,NULL,0,0)) {
        TranslateMessage( &message );
        DispatchMessage( &message );
    }

    UnhookWindowsHookEx(hKeyboardHook);
    return 0;
}

LowLevelKeyboardProc から「1」を返すと、キーを押すたびに「飲み込まれ」ます (CTRL + ALT + DEL と WIN + L を除く)。コールバック関数の最後で next フックを呼び出すと、動作が変わります (そして、明らかにキーが飲み込まれなくなります)。次に、WINキーを別のキーと一緒に押すと、WINキーが押されたという情報が得られます。

すべてのキーボード入力をインターセプトし、WIN キーの押下を (GetAsyncKeyState を使用して) 検出するにはどうすればよいですか? または、押されたすべての (inkl. WIN) 修飾キーを取得する別の方法はありますか?

4

2 に答える 2

0

のドキュメントにLowLevelKeyboardProcは、戻り値について次のように記載されています。

フック プロシージャがメッセージを処理した場合、システムがフック チェーンの残りまたはターゲット ウィンドウ プロシージャにメッセージを渡さないようにするために、0 以外の値が返される場合があります。

それで、return 1「私は情報を処理しました。これらのキーで行うべきことは他にありません」と言います。

WINキーの検出に関する問題を独自に修正する方法がわかりません.2番目のキーが押されるまで、システムは単にキーボードイベントを転送しないと思われます.

于 2013-09-20T13:28:54.693 に答える