- ベストアンサー
ファンクションキーのキャンセル方法
教えてください。。 環境:Microsoft Visual C++ .NET 2003です。 フォーム画面上でF10が押された場合、 KeyDownイベントで処理をさせようとしているのですが、 処理が走ると同時に、フォーカスがフォーム内のコントロールから外れ、タイトルバーのメニューに移動してしまいます。 Windows本来のファンクション割り当てによる機能のようですが、これを回避(フォーカスが移動しない)するにはどの様にすればよいのでしょうか?
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
一番簡単な方法は、メッセージループで処理を切ることです。 F10などのシステムキーを押したとき、ウィンドウには WM_SYSKEYDOWN メッセージが飛んできます。 これを Translate & Dispatch することでフォーカスがメニューに移ります。 なので、WinSDKであれば while( GetMessage(&msg, NULL, 0, 0) ) { if( msg.message == WM_SYSKEYDOWN && msg.wParam == VK_F10 ) { 処理 } else { TranslateMessage DispatchMessage } } という感じです。(エラーチェックとか無視してます) MFCならば、PretranslateMessageをオーバーライドして BOOL CXXX::PreTranslateMessage(MSG* pMsg) { if( pMsg->message == WM_SYSKEYDOWN && pMsg->wParam == VK_F10 ) { return TRUE; } return CXXXWnd::PreTranslateMessage(pMsg); } みたいな感じで、TRUEを返してやります。 要するに、TranslateされることでWindows標準の処理がされるので、その前にメッセージをきります。 ウィンドウプロシージャには、TranslateおよびDispatchされたあとにメッセージが飛んでくるので、どうやっても対処できません。
その他の回答 (2)
- sha-girl
- ベストアンサー率52% (430/816)
#1です。 補足です。 ::RegisterHotKey( hWnd , id , 0 , VK_F10 ); を使った後F10を押すとWM_HOTKEYが飛んできます。 そこでKeyDownイベントの処理をしてください。 RegisterHotKeyで複数登録してもWPARAMにidが入っているのでどのキーかの判断が可能です。 詳細はMSDNを参照してください。
お礼
ありがとうございます。 確認してみます。
- sha-girl
- ベストアンサー率52% (430/816)
WinAPIのRegisterHotKeyでF10を無効化できると思います。 他にも同じくWinAPIのSetWindowHookEx( WH_KEYBOARD_LL ・・・ でキーボード入力をフックする方法もあります。 // ユニークなID取得 static int id = ::GlobalAddAtom(_T("RegisterHotKey")); // F10を無効化 ::RegisterHotKey( hWnd , id , 0 , VK_F10 ); // F10を有効に戻す ::UnregisterHotKey( hWnd , id );
お礼
お返事遅くなりました。 ありがとうございます。やってみます。