none
フックを解除できない。 RRS feed

  • 質問

  • いつもお世話になります。

    MFC SDIプログラムでローカルキーボードフックする使用していますが、他のプログラムをアクティブにしてもフックを解除できません。

    アドバイスをお願いします。

    void CMainFrame::OnActivate(UINT nState, CWnd* pWndOther, BOOL bMinimized)
    {
    	CFrameWnd::OnActivate(nState, pWndOther, bMinimized);
    
    	// TODO: ここにメッセージ ハンドラー コードを追加します。
    	CString str;
    	str.Format(L"CMainFrame::OnActivate %X\r\n", nState);
    	OutputDebugString(str);
    	if ( nState == WA_ACTIVE || nState == WA_CLICKACTIVE ) {
    		theApp.KeyHookOn();
    	}
    	else{
    		theApp.KeyHookOff();
    	}
    }
    
    void CxxxApp::KeyHookOn()
    {
    	OutputDebugString(L"HookOn\r\n");
    	hHook = SetWindowsHookEx(WH_KEYBOARD_LL, KeyHookProc, NULL, 0);
    	// hHookはCxxxのメンバー変数
    }
    
    void CxxxApp::KeyHookOff()
    {
    	CString str;
    	str.Format(L"HookOff %x\r\n", hHook);
    	OutputDebugString(str);
    
    	UnhookWindowsHookEx(hHook);
    }
    

    2016年7月7日 2:10

回答

  • UnhookWindowsHookEx()が正常動作していないとのことでしたら、戻り値とGetLastError()の値を提示してください。

    2016年7月7日 2:24
  • 私の環境(Win10 x64 & VS2010)でご質問者さんのように関数を追加してみましたが、再現しませんでした。

    以下は検証で作成したプログラムです。(キーボードフックでESCを打つと'A'と入力される、他のウィンドウがアクティブになるとフックは解除される。)

    http://work.vc/KeyboardHook.zip

    Visual Studioのバージョン、再現するOSは何になりますでしょうか?

    2016年7月7日 2:45

すべての返信

  • UnhookWindowsHookEx()が正常動作していないとのことでしたら、戻り値とGetLastError()の値を提示してください。

    2016年7月7日 2:24
  • 私の環境(Win10 x64 & VS2010)でご質問者さんのように関数を追加してみましたが、再現しませんでした。

    以下は検証で作成したプログラムです。(キーボードフックでESCを打つと'A'と入力される、他のウィンドウがアクティブになるとフックは解除される。)

    http://work.vc/KeyboardHook.zip

    Visual Studioのバージョン、再現するOSは何になりますでしょうか?

    2016年7月7日 2:45
  • kenjinoteさんのサンプルでフック処理自体は問題ないと判り、全体を再検討しました。

    佐祐理さんのアドバイスで2重にフックしている箇所を発見でき、解決しました。

    お二方に感謝いたします。

    2016年7月7日 8:10