お人形がCtrlキーを踏んでいるらしくキーがおかしい。のでキーボードをグローバルフックかけて入力無効にしてみた。
GetModuleHandle(NULL)は自分自身。普通は外部DLLにしてDLLの名前を指定する(こうしないとスレッドセーフになんないらしい そんなん考慮しねぇwww きちんと別スレッドからexe ロードしてる気がするが...)。AfxGetApp()->m_hInstance でも良かったかな...
HHOOK m_hHook; LRESULT CALLBACK MyKeyboardProc(int code, WPARAM wParam, LPARAM lParam) { return TRUE; } void CKeyboardHookDlg::OnBnClickedButton1() { if(m_hHook != NULL) return; #if (_WIN32_WINNT >= 0x0400) m_hHook = SetWindowsHookEx( WH_KEYBOARD_LL, MyKeyboardProc, GetModuleHandle(NULL), 0); /* 低レベルHook */ #else m_hHook = SetWindowsHookEx( WH_KEYBOARD, MyKeyboardProc, GetModuleHandle(NULL), 0); #endif SetWindowText(_T("キーボードHooked")); } BOOL CKeyboardHookDlg::DestroyWindow() { UnhookWindowsHookEx(m_hHook); m_hHook = NULL; return CDialog::DestroyWindow(); }
これだけじゃだめで、Hook解除しながらソフトウェアキーボードで二、三回Ctrlを押してあげなきゃダメだったけど。
配慮する場合は...
; KeyboardHookDll.def : DLL のモジュール パラメータを宣言します。 LIBRARY "KeyboardHookDll" EXPORTS ; 明示的なエクスポートはここへ記述できます MyKeyboardProc LRESULT CALLBACK MyKeyboardProc(int code, WPARAM wParam, LPARAM lParam) { return TRUE; }
#ifdef DEBUG # pragma comment(lib, "./Debug/KeyboardHookDll.lib") #else # pragma comment(lib, "./Release/KeyboardHookDll.lib") #endif LRESULT __declspec(dllimport) CALLBACK MyKeyboardProc(int, WPARAM, LPARAM); ... m_hHook = SetWindowsHookEx( WH_KEYBOARD_LL, MyKeyboardProc, GetModuleHandle(_T("KeyboardHookDll.dll")), 0); /* 低レベルHook */
まぁ注意点はDestroyWindowできちんとunhookかけましょうっと。