dポイントプレゼントキャンペーン実施中!

教えてください。。
環境:Microsoft Visual C++ .NET 2003です。

フォーム画面上でF10が押された場合、
KeyDownイベントで処理をさせようとしているのですが、
処理が走ると同時に、フォーカスがフォーム内のコントロールから外れ、タイトルバーのメニューに移動してしまいます。

Windows本来のファンクション割り当てによる機能のようですが、これを回避(フォーカスが移動しない)するにはどの様にすればよいのでしょうか?

A 回答 (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されたあとにメッセージが飛んでくるので、どうやっても対処できません。
    • good
    • 1
この回答へのお礼

お返事遅くなりました。
ありがとうございます。やってみます。

お礼日時:2006/09/27 09:23

#1です。


補足です。
::RegisterHotKey( hWnd , id , 0 , VK_F10 );
を使った後F10を押すとWM_HOTKEYが飛んできます。
そこでKeyDownイベントの処理をしてください。
RegisterHotKeyで複数登録してもWPARAMにidが入っているのでどのキーかの判断が可能です。
詳細はMSDNを参照してください。
    • good
    • 0
この回答へのお礼

ありがとうございます。
確認してみます。

お礼日時:2006/09/22 15:07

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 );
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!