0

私はしばらくの間、基本的なUIのことで苦労してきました。親ウィンドウといくつかの子ウィンドウがあります。ボタン(BS_CHECKBOXスタイル)や編集などの子ウィンドウを使用すると、ESCキーイベントを押すためのメッセージを処理できません。子ウィンドウをサブクラス化することはできますが、1つのイベントを処理するだけではやり過ぎのようです。リストビューの子もあり、何らかの理由でVK_ESCAPEを正しく処理できます。また、spy ++を確認したところ、ESCキーが押されたとき(および子がフォーカスされたとき)に親ウィンドウにメッセージが送信されないことに気付きました。spy ++を子メッセージのみをログに記録するように設定した場合、キーを押すと正しいメッセージが生成されます。それらは親に渡されません。何をすべきか(しない)のアイデアはありますか?

メインウィンドウループ:

  MSG Msg;
  while (GetMessage(&Msg, NULL, 0, 0))
  {
    TranslateMessage (&Msg);
    DispatchMessage (&Msg);
  }

リストビューキーの押下を処理するための親のWndProcの作業コード:

case WM_NOTIFY:
    switch (((LPNMHDR)lParam)->code)
    {
    case LVN_KEYDOWN:
        if (((LPNMLVKEYDOWN)lParam)->wVKey == VK_ESCAPE)
            Exit();
        break;
    }
    break;

ありがとう、

クラ

4

1 に答える 1

1

これを行う1つの方法は、フォーカスウィンドウにディスパッチされる前に、メッセージループでキャッチすることです。例:

MSG Msg;
while (GetMessage(&Msg, NULL, 0, 0))
{
    if (Msg.message == WM_KEYDOWN && Msg.wParam == VK_ESCAPE)
    {
        // process escape key
    }
    else
    {
        TranslateMessage(&Msg);
        DispatchMessage(&Msg);
    }
}

もちろん他の方法もありますが、これは非常に簡単な解決策です。

于 2012-11-29T09:38:26.803 に答える