1

ユーザーがWindowsの3Dプログラムで使用するホットキーを設定できるダイアログボックスがあります。私はCHotKeyCtrlを使用しています。これは非常に優れていますが、ユーザーが使用したいいくつかのキー(具体的には、タブとスペース)を処理しません。

ホットキーの処理は、これらのキーを起動できるほどスマートです。必要なのは、それらを設定するためのUIだけです。CHotKeyCtrlに似たコントロールが理想的ですが、他の回避策もありがたいです。

4

1 に答える 1

1

回避策の 1 つのオプションは、メッセージ フック機能を備えた標準の編集コントロールを使用することです。

これにより、そのエディット コントロールに送信されたキーボードWM_KEYDOWNメッセージをトラップできます。

フック関数は次のようになります。

    LRESULT CALLBACK MessageHook(int code, WPARAM wParam, LPMSG lpMsg)
    {
      LRESULT lResult = 0;

      if ((code >= 0) && (code == MSGF_DIALOGBOX))
      {
        if (lpMsg->message == WM_KEYDOWN)
        {
          //-- process the key down message
          lResult = 1;
        }
      }

      // do default processing if required
      if (lResult == 0)
      {
        lResult = CallNextHookEx(MessageFilterHook, code, wParam, (LPARAM)lpMsg);
      }

      return lResult;
    }

エディット コントロールがフォーカスを取得すると、次のようにフックをエディット コントロールにアタッチできます。

    //-- create an instance thunk for our hook callback
    FARPROC FilterProc = (FARPROC) MakeProcInstance((HOOKPROC)(MessageHook),
                                                    hInstance);
    //-- attach the message hook
    FilterHook = SetWindowsHookEx(WH_MSGFILTER, 
                                 (HOOKPROC)FilterProc, 
                                  hInstance, GetCurrentThreadId());

次のように、編集コントロールがフォーカスを失ったときに削除されます。

    //-- remove a message hook
    UnhookWindowsHookEx(MessageFilterHook);

このアプローチを使用すると、編集コントロールにフォーカスがある場合、キーを押すたびにフックに送信されます。

于 2008-10-01T03:23:42.243 に答える