問題タブ [windows-messages]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
delphi - フォームの特定のイベントをフォームの外部からキャッチするにはどうすればよいですか?
私は多くのフォームの監視を必要とする何かに取り組んでいます。フォームの外部から、フォーム内にコードを配置せずに、これらのフォームから、おそらくWindowsメッセージの形式でイベントをキャプチャする必要があります。しかし、関連するクラスの外部からWindowsメッセージをどのようにキャプチャしますか?
私のプロジェクトには、監視している各フォームをラップするオブジェクトがあり、この処理はこのオブジェクトで行われると思います。基本的に、監視するフォームを作成するときに、対応するオブジェクトを作成します。このオブジェクトは、作成されたすべてのフォームのリストに追加されます。最も重要なことは、そのフォームが閉じられたときに、このフォームのラッパーオブジェクトをリストから削除できるようにする必要があることです。
これらのイベントには次のものが含まれます。
- 最小化
- 最大化
- 戻す
- 選ぶ
- フォーカスイン/フォーカスアウト
私が望まないこと:
- この処理のためのフォームまたはフォームユニット内のコード
- カスタムベースフォームからフォームを継承する
OnClose
他の目的で使用されるためなど、フォームのイベントを使用する
私が欲しいもの:
- これらのイベントのWindowsメッセージの処理
- クラス外からWindowsメッセージを取得する方法に関するヒント
- どのWindowsメッセージを聞く必要があるか
質問は同じ情報で書き直されましたが、アプローチが異なります
c# - Windows メッセージを使用してボタンが押されているかどうかを調べる
ボタンがクリックされているかどうかを知るためにWindowsメッセージを使用するプログラムがあります:
ボタンはどこでも押すことができ、プログラムは引き続きそれらを処理します。
問題は、ユーザーが特定のボタンを押しているときはいつでも、ボタンが実行する機能が短時間に何度も繰り返されることです。また、機能はそれほど重くはありませんが、コンピューターがフリーズしたり、数秒間動作が遅くなったりします。
ボタンが押されていることがわかっている場合は、その機能を 1 回だけ実行します。
ボタンが押されていることを示す Windows メッセージにフラグまたは何かがありますか?
.net - アプリケーションが特定の「メッセージ」を受信しないようにするにはどうすればよいですか?
可能な解決策が見つかりました!
私は解決策を見つけたと信じています!実際に機能することを確認するためにテストを続けますが、期待しています:)質問のEDIT 3で解決策を見つけた方法を詳しく説明しました!
私の問題の背後にある完全な背景と、この質問からの入力の結果として私が試したことを知りたい人は、これを参照してください: http://pastebin.com/nTrEAkVj
私はこれを頻繁に編集します (ほとんどの平日は 1 日 3 回以上) 調査と状況を進めているので、興味がある場合、または私の問題に関する情報や知識がある場合は、チェックし続けてください :)
簡単な背景:
私が作成したこのアプリは、スクリーン セーバーを変更したり、ワーク ステーションをロックしたりすることでクラッシュする可能性があります。
スクリーンセーバーを変更してアプリを一貫してクラッシュさせることができる場合、その一部はアプリに何らかの種類のメッセージを送信しています (必ずしも Windows メッセージではなく、最も一般的な意味でのメッセージを意味します)。応用。このため、問題を引き起こしているメッセージがアプリケーションによって処理されないようにする方法を見つけようとしています。これが解決策として最善の方法ではないことは承知していますので、私に教えていただく必要はありません。背景情報を確認するか、それが気になる場合はその理由を尋ねてください (正当な理由があります)。
私の質問:
関連性に応じてラベル付けされた、問題の解決に役立つ情報がいくつかあります (1 つは最も関連性が高く、3 つはあまり役に立ちません)。
Wndproc() を使用して、次のようにメッセージを除外しようとしています:
ただし、Windspector によると、WM_WININICHANGE メッセージはまだアプリに送信されています (これは理にかなっています)。ただし、0 も返されています...正常に動作していた場合、これは発生しないはずです。何でもないですよね?これが期待どおりに機能しない理由と、それを機能させる方法に関する情報は非常に役立ちます!
メッセージフィルターも使用してみました:
次に、 mybase.load 処理メソッドに追加します。
Application.AddMessageFilter(新しい MyMessageFilter())
ただし、特定のメッセージのみをフィルタリングするように見え、私のようなメッセージは明らかにこれらに含まれていません。WM_メッセージをキャッチするために何らかの種類のフィルターを使用することが絶対に不可能であるかどうか、またはメッセージフィルターを使用して私の目標を達成する他の方法があるかどうかについての情報も役立ちます.
スクリーンセーバーを変更すると、アプリケーションにメッセージを送信できますか? スクリーンセーバーの変更による別の種類のメッセージも致命的である可能性はありますか?
私の状況に関して他に役立つ情報があれば教えてください。それを得るために最善を尽くします! あなたが与えることができるどんな助けにも前もって感謝します:)
編集:
WM_CHANGESETTINGメッセージのみを送信し、メッセージを送信したsendmessagetimeoutのタイムアウトの長さを超えてプログラムを待機させた場合、プログラムはクラッシュしません... RESPONSEがプログラムをクラッシュさせているようです.. 。 面白い。私は間違いなく私の解決策に近づいています!もう少しテストすることで、プログラムがメッセージに応答しないことを確認する方法を見つけられるようになると思います。
編集2:
今日、非常に有望なものを発見しました。wndproc 関数を次のように定義しました。
次に、プログラムを実行してから、次を使用して WM_SETTINGCHANGE メッセージを送信してみました。
私が作った別のプログラムで。それでどうしたの?私はこれを数回試しましたが、メッセージボックスがポップアップするたびに (選択した単語は重要ではありません)、[OK] を押す前にさまざまな時間待機してみました。多くの場合、何も変わらず、それでもクラッシュします。しかし、場合によっては、おそらく 1/5 回、プログラムがまだ応答していることがあります。もしそうなら、私はメッセージをもう一度送信しようとしますが、通常は同じプログラムの実行中に2回目に失敗しますが、時々もう一度、さらに約1/5回、プログラムは送信されませんでした.もう一度クラッシュします。そして、2回クラッシュさせようとしたとき。どちらも間に合いませんでした
約 5 秒待つと、オッズが高くなるように見えました。フリーズ ボタンを押した直後に、メッセージをトリガーするフォームにまだフォーカスがあり (上部のバーは青色)、メッセージボックスがポップアップします。上部も青(焦点が合っていると思います)、両方ともまだ「焦点が合っています」(少なくとも青笑)。すると5秒くらいで元のフォームからフォーカスがずれてきて、それを見てOKを打ってみたり。
私は現在、これを少し待ってからメッセージボックスを確認すると、メッセージがタイムアウトして返されないため、プログラムがクラッシュしないことがあると考えています。ただし、メッセージが返されるかどうかが、プログラムの実際の動作に影響する理由はわかりません。これは、明確化が役立つ領域です:)
編集 3:
そのため、Winspector でもう少し調べてみると、デスクトップ ウィンドウ (Winspector では「sysListView32 'FolderView'」というラベルの付いたウィンドウ) に WM_ERASEBKGND が表示されるのを待ってから、メッセージボックスで「OK」を押すことがわかりました。 、その後、プログラムはクラッシュしません、興味深いです! 通常、WM_ERASEBKGND メッセージが表示されるまでには、sendmessagetimeout のタイムアウトに近い時間がかかります。これはもちろん、自家製のテスト アプリから WM_SETTINGCHANGE メッセージを送信した後です。
それで、この後、Winspector についてもう少し調べることにしました。もっと便利なキューを見つけることができるのではないでしょうか? 明らかに、winspector がデスクトップに送信されるメッセージを表示するのを待つことは、プログラムの実際の修正ではありません。私のプログラム プロセスの下に、変わった名前のウィンドウがいくつか見つかりました。デフォルト IME'".
これらのウィンドウに送信されるメッセージを調べて、WM_SETTINGCHANGE や WM_ERASEBKGND などの認識可能なメッセージを受信しているかどうかを確認することにしました。結局のところ、彼らはメッセージを頻繁に受信するわけではありません.私が見ている間、GDI +はメッセージを受信しませんでしたが、.NET -BroadcastEventWindowはメッセージをいくつか受信しました. BroadcastEventWindow に移動するのは、自分のアプリケーション ウィンドウまたはその後に別のウィンドウをクリックしたときのほとんどが WM_appactivate だけでした。
しかし... .Net BroadcastEventWindow が WM_CHANGESETTING メッセージを受信していることに気付きました!!!! 他に表示されるメッセージを確認します。多くはありませんが、バグが原因でアプリがクラッシュしたときに、認識できないメッセージがあることに気付きました: WM_USER+7194 (0x201A)。うーん、それが何であるか見てみましょう。Google で調べたところ、アプリケーション/ユーザー定義のメッセージであることがわかりました。それに関連する問題についてもう一度検索したところ、誰かがフィルタを使用してこのメッセージを除外し、問題を修正できることに気付きました。彼らの ( http://www.pcreview.co.uk/forums/handling-wm_user-messages-t1315625.html )。少なくとも私にとっては試してみる価値がありますよね?そのため、以前に試したフィルターを再度追加し、フィルターする値を変更します。アプリはクラッシュしませんでした!!!!!!!!
次に、ワークステーションをロックして、それでもクラッシュするかどうかを確認してみます (以前は WM_CHANGESETTING メッセージを送信するだけだったからです)。結局、それでもクラッシュしました:(しかし、そのウィンドウのwinspectorをもう一度見てみると、ああ、2つの新しいWM_USERメッセージがあります:WM_USER+7294(0x207E)とWM_USER+7189(0x2015)。あまりにも...そして、ワークステーションのロックでもクラッシュしません!!! :D
これまでのところ、これが通常のアプリの使用にも悪影響を及ぼしていないことに気付きました! ユーザー定義メッセージが私のプログラムに意図的に関与しているとは思わないので、これは理にかなっています。
私の解決策に問題がなく、うまく機能することを確認するまで、質問をもう少し開いたままにします。デバッグの中間段階でどのように進めるかについて少しアドバイスをくれた皆さんに感謝します:)
c# - ホストされた MFC ウィンドウの C# での PreTranslateMessage
メイン ウィンドウが DLL に実装されている MFC アプリケーションを開発しました。これを改良するために、これを WPF アプリケーションに変更して、「古い」ネイティブ ウィンドウが Wpf ウィンドウで再ホストされるようにすることを考えています。ここまでは順調ですね。
ただし、古い MFC アプリケーションは、アプリケーション レベルでいくつかのメッセージをトラップしました (例: マウス クリックやキーボード入力の防止)。WPF アプリケーション内で MFC ウィンドウを再ホストするには、WPF アプリケーションからこれらをキャッチし、古い MFC ウィンドウにそれらを事前に翻訳するように依頼する方法が必要です...
これはまったく可能ですか?
HwndHost で MFC ウィンドウを再ホストしてから、メッセージ フックを追加することを考えていました。ブリッジング CLR-DLL のコードは次のようになります (目的の結果が得られません)。
誰でも助けることができますか?
windows - メッセージ キューは Win32 でどのように機能しますか?
Win32 とメッセージ ループのしくみに関するいくつかの資料を読みましたが、まだ不明な点があります。メッセージ キューには正確に何が格納されているのでしょうか。メッセージに対応する整数値 ( WM_COMMAND
、WM_CREATE
など)、またはメッセージ整数値と 、 などの他のものを含む構造体へのMSG
ポインタ?wParam
lParam
delphi - デバッグ中に特定のWindowsメッセージまたはAPIで停止する簡単な方法はありますか?
そのため、特定のAPIまたはWindowsメッセージにブレークポイントを設定したいと思います。Delphiのバージョンでコードを記述せずにそれを行う簡単な方法は見つかりません。メモリアクセスにブレークポイントを設定できるのと同様の方法はありますか?
c++ - Windows CE でのメモリ不足の通知
使用可能なメモリが特定の制限 (ユーザー設定可能) を下回ったときに通知を受け取る方法はありますか? WM_HIBERNATE イベントを調べましたが、このイベントの制限はユーザーが設定できず、ハードコードされているようです (160KB??)。私が考えることができる唯一の方法は、GlobalMemoryStats() API を介して利用可能なメモリを定期的に (5 秒ごとに??) OS にポーリングし、利用可能なメモリがユーザーが設定した制限を下回った場合は、ユーザーにイベントを発生させることです。より良い方法はありますか?
この通知は、Windows CE 5.0 および Windows Mobile 6.5 以降のデバイスで機能する必要があります。
.net - WM_CLOSEとSC_CLOSEの違い
これら2つのメッセージング定数の違いを知りたいだけです。WndProc
ボタンを閉じるメッセージを処理するために、オーバーライドするときにメソッドでどちらを使用する必要がありますか。
c# - 非表示フォームへの PostMessage が初めて機能しない
システム トレイに表示される C# WinForms アプリケーションがあります。アプリケーションはロード時にメイン フォームを非表示にしています。
同じメイン フォームについて、WndProc をオーバーライドしてカスタム ウィンドウ メッセージをキャッチしました (そのメッセージはRegisterWindowMessage
Win32 API 呼び出しで Windows に登録されます)。
外部の C++ アプリケーションから、同じカスタム ウィンドウ メッセージを PostMessage でブロードキャストしています。
C# アプリケーションを最初に起動した後に上記のコードを実行すると、WndProc に入りません。メイン フォームが表示された後 (システム トレイ アイコンをダブルクリックすることで、本質的Show()
にHide()
.
イベントハンドラーHide()
からの最初の後に機能しない理由を誰かが説明できますか? MainForm_Load
フォームを非表示にするのが早すぎますか?
EDIT1: Hide on load とは何の関係もないようです。最初の非表示がなくても、私のメイン フォーム WndProc は、非表示にして再表示した後にのみブロードキャスト投稿の受け入れを開始します...
winforms - 特定のボタンクリックの WndProc メッセージをキャプチャする
フォームにキャンセルボタンがあります。WndProc
このCancel
ボタンがクリックされたことをメソッド内で判断し、そのためのコードを記述したいと思います。そうしないと、まだ実行されていない他のすべてのコントロール検証イベントをキャンセルできないため、これは絶対に必要です。
助けてください。
.NET - 2.0、ウィンフォーム