1

タブレットの「ホットキー」ボタンの1つから送信されたキーシーケンスをキャプチャし、その機能を再プログラムするための簡単なコードを作成しようとしています。ボタンを押すと、LWin + LCtrl+Tabが送信されます。

しばらく探し回った後、WH_KEYBOARD_LLフックを試してみることにしましたが、数時間経っても、実際の機能は言うまでもなく、フックを機能させることができません。

現在、私は次のものを持っています:

// TestHook2.cpp

#include "stdafx.h"

HHOOK hook;
BOOL gotKey;
LRESULT WINAPI KeyTrap(int, WPARAM, LPARAM);
BOOL CtrlHandler(DWORD);

int _tmain(int argc, _TCHAR* argv[])
{
    SetConsoleCtrlHandler((PHANDLER_ROUTINE)CtrlHandler, TRUE);
    HMODULE currentProcess = GetModuleHandle(NULL);
    hook = SetWindowsHookEx(WH_KEYBOARD_LL, KeyTrap, currentProcess, 0);

    if (!hook) {
        printf("No hook, quitting!\n");
        return 1;
    }

    while(1) {
        if(gotKey) printf("Got Key!\n");
        gotKey = FALSE;
    }

    return 0;
}

LRESULT CALLBACK KeyTrap(int nCode, WPARAM wParam, LPARAM lParam)
{
    gotKey = TRUE;
    return  CallNextHookEx(hook, nCode, wParam, lParam);
}

BOOL CtrlHandler(DWORD fdwCtrlType)
{
    if (fdwCtrlType == CTRL_C_EVENT)
    {
        printf("Got CTRL+C, unhooking...\n");
        UnhookWindowsHookEx(hook);
    }

    return FALSE;
}

SetWindowsHookExによって返されるハンドルは間違いなくNULLではありませんが、何らかの理由で、押しようとしたキーの数に関係なく、KeyTrapがまったく呼び出されません。また、コールバックをDLLに入れて、実行時にLoadLibraryを使用しようとしましたが、これでもまったく同じ結果が得られます。

私はこのすべてのWin32プログラミングに慣れていないので、非常にばかげた間違いかもしれません。

どうもありがとう!

(PS:コードはWin7で実行されています。現時点では実際のキーボードにアクセスできませんが、オンスクリーンキーボード、リモート(RDP)入力、およびタブレットのハードウェアホットキーからキーストロークを生成しようとしました。これが問題でしょうか? )。

4

1 に答える 1

3

問題は、フック メッセージを処理するためのメッセージ ループがコンソール アプリケーションにないことです。

while(1)ループを次のように置き換えて、それが機能するかどうかを確認します。

   MSG msg;
   while( GetMessage( &msg, NULL, 0, 0 ) != 0 ) 
   {
      TranslateMessage( &msg );
      DispatchMessage( &msg );

      if(gotKey) 
        printf("Got Key!\n");        

      gotKey = FALSE;
   }
于 2011-07-18T23:57:20.753 に答える