1

CTRL+Sユーザーがモードレス ダイアログ内を押したときに、何らかのアクションを実行したいと考えています。アクセラレータはこれに最適ですが、スレッドのメッセージ ループ (プラグインと考えてください) を制御できないため、TranslateAccelerator.

メイン アプリケーションは への呼び出しの間に多くの処理を行うため、ネストされたメッセージ ループはオプションではありませんPeekMessage

  • アクセラレータを処理するために既存のメッセージ ループを「強制」する方法はありますか?
  • アクセラレーター以外にキャッチする方法はありますCTRL+Sか?

またはWH_GETMESSAGEから戻る前に呼び出されるWindow フック on を使用することを考えました。しかし、 を正常に呼び出した後に何が起こるかはわかりません。処理したことをアプリケーションに知らせることはできません。 アプリで への呼び出しを実装する必要がありますが、デバッガーで一目でわかるわけではありません。GetMessagePeekMessageTranslateAcelleratorWH_MSGFILTERCallMsgFilter

私の最後のアイデアは、私が避けようとしているコントロールをサブクラス化することでした。これには、keypress イベントを親ウィンドウに通知するメカニズムが必要になりますが、これは優れた設計ではないと思います。また、コントロールをさらに追加すると、すべてのコントロールをサブクラス化する必要があります。

ヒントをありがとう。

4

2 に答える 2

1

これはかなり悪名高い相互運用性の問題であり、Winforms を使用してネイティブ プログラムに UI を実装する場合にも厄介な問題です。Microsoft の推奨事項は大雑把なものです。独自のスレッドを開始してウィンドウを表示し、独自のメッセージ ループをポンピングできるようにします。Z オーダーの問題を回避するには、SetParent() が必要です。恐ろしいことです。これにコミットする前に、モーダル ダイアログを 3 回検討してください。

于 2011-08-19T15:08:29.417 に答える
0

WM_GETDLGCODEを使用できますか?http://msdn.microsoft.com/en-us/library/ms645425(v=vs.85).aspx

于 2011-08-19T14:19:24.543 に答える