タブレットの「ホットキー」ボタンの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)入力、およびタブレットのハードウェアホットキーからキーストロークを生成しようとしました。これが問題でしょうか? )。