問題タブ [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.

0 投票する
2 に答える
1068 参照

multithreading - EnumWindows と EnumChildWindows で Treeview を最新の状態に保つ

Winspector Spy に似たプログラムを作成しようとしています。私の問題は、仮想ツリービューを常に更新したいということです。つまり、ウィンドウが作成されたとき、ウィンドウが破棄されたときなどに更新します。もちろん、すべての外部 HWND です。

そのために、すべてのハンドル + 情報を含むデータ コンテナーを作成し、EnumWindows と EnumChildWindows を別のスレッドで実行して、データ コンテナーに上記の情報を入力することを考えていました。

そのようにすることをお勧めしますか、それとも別の解決策がありますか? このようにすると、プログラムのライフタイム全体でスレッドを実行しExecute、データコンテナをクリアして、毎秒、または何かを埋める無限ループを作成する必要がありますか?

ここに私のデータコンテナがあります:

0 投票する
1 に答える
1492 参照

c++ - WM_KEYDOWN メッセージで lParam パラメータの 30 番目のビットを取得します

WM_KEYDOWN メッセージで渡された lParam パラメータの 30 番目のビットを取得する必要があります。ここに書かれているこのビットにより、キーが以前に押されたかどうかを知ることができます。このコードはそれを取得するのに適していますか?

0 投票する
2 に答える
1922 参照

c# - Windows メッセージを使用して Alt ボタンを押し続ける

Windows メッセージで、ALT ボタンを押したままにするにはどうすればよいですか?

WM_KEYHOLD などはありますか?

これはスクリーンショットのコードですが、何かが間違っていると思います。使用しているキー コードが悪いと思います。0x70 の場合は F1 を送信します。0x46 の場合、迷惑なウィンドウ サウンドを送信します。

0 投票する
1 に答える
669 参照

c# - C#でWindowsメッセージの文字列を取得しますか?

Windows メッセージで文字列を送信できることがわかりました。
しかし、処理された Windows メッセージからそれらを読み取るにはどうすればよいでしょうか?

0 投票する
3 に答える
1579 参照

multithreading - ウィンドウ ハンドルを持たないオブジェクトをスレッドが通知するにはどうすればよいですか?

私はマルチスレッドは初めてですが、完全な初心者ではありません。ワーカー スレッドで Web サービスの呼び出しを実行する必要があります。

メイン スレッドには、ワーカー スレッドのみが書き込むプライベート データ メンバ (プライベート文字列) を持つフォーム (TForm) があります (スレッドが再開する前に、そのポインタをスレッドに渡します)。ワーカー スレッドが Web サービス呼び出しを終了し、結果の応答 xml をフォームのプライベート メンバーに書き込むと、ワーカー スレッドは PostMessage を使用してメッセージをフォームのハンドルに送信します (これは、再開前にスレッドにも渡しました)。

それはうまく機能しますが、今はデータモジュール(ハンドルを持たない)から同じことをしたいので、私が持っている作業モデルを補足する便利なコードを本当に感謝しています。

編集

私が本当に欲しいのは、(可能であれば)行を置き換えることができるコードです

0 投票する
1 に答える
906 参照

delphi - Delphiでメッセージの送信元の場所を見つけるにはどうすればよいですか?

プログラムでグリッドとして使用しているサードパーティのツリーパッケージ(LMD InnovativeによるElXTree)があります。セルを選択するたびに、その行にフォーカスが移り、必要に応じて強調表示されます。

グリッド内のセルをクリックして付属のインプレースエディターを呼び出すと、その行にフォーカスが移ります。セルは編集モードで選択されているため、必要に応じて、セルのみが強調表示されます(行全体ではありません)。

必要ないのはこれです。あるセルをインプレース編集していて、別のセルをクリックしてインプレースエディターを呼び出すと、最初に古いセルの行にフォーカスが移され、強調表示されます。次に、すぐにフォーカスが削除されて強調表示が解除され、新しいセルのある行にフォーカスが移されて強調表示されます。次に、その新しい行は、インプレース編集されているセルを除いて、すぐにハイライト解除されます。これは迷惑な二重点滅を引き起こします、そして私はそれを取り除きたいです。

私はパッケージのソースコードを持っていて、それを通してデバッグしてきました。ダブルフォーカシングを引き起こしているものを見つけることができれば、それを防ぐための簡単な変更を行う方法を理解できると確信しています。

ブレークポイントを設定すると、FormsユニットのTApplication.Runのメッセージ処理ループにいることがわかります。このループが処理している多くのメッセージのうちの2つは、フォーカスを設定するためのメッセージです。メッセージがディスパッチされるClassesユニットのStdWndProcまで、プログラムを1行ずつトレースできます。メッセージに関するすべての情報(ハンドル、パラメーターなど)があります。

私が持っていないこととわからないことは、メッセージがどこから開始されたかです。コールスタックには、私を手がかりにするElXTreeユニットがありません。これらのルーチンの1つは、現在のコールスタックとは無関係にメッセージを送信している必要があります。

そのメッセージがどこから送信されたのか(つまり、どのルーチンがメッセージを送信したのか)を知ることができれば、私はオフになって実行されます。

メッセージの送信元を見つける方法はありますか?あるいは、私が抱えているこのダブルフォーカシングの問題を回避できる他の方法はありますか?

参考までに、Delphi2009を使用しています。


さらに詳しい情報:

ElXTreeには、動作する独自のWindowsメッセージが数十あります。私の場合、関連する2つは次のとおりです。

たとえば、WMSetFocusルーチンにブレークポイントを設定すると、次の呼び出しスタックが取得されます。

コールスタック

呼び出しスタック内の他の唯一のElXTreeルーチンは、4行目のルーチンです。

このルーチンにブレークポイントを設定すると、「継承された」行に渡されてからシステム関数が呼び出され、最終的にメッセージが処理されるStdWndProcに到達するように見えます(元の質問で説明したように)。

これを正確にトレースする際の問題は、コードをデバッグしながら、マウスをクリックしてプログラムのビジュアルコントロール上にマウスポインタを置いたままにする必要があることです。デバッグ中にマウスを動かしたり使用したりする際に間違いがあると、処理に影響を与える追加のマウスイベントが発生する可能性があります。これにより、デバッグが非常に困難になります。

しかし、StdWndProcを注意深く追跡して、回線に焦点を合わせてディスパッチされるイベントを確認できます。私ができないように見えるのは、メッセージの問題を見つけることです。

さて、なぜ私はメッセージを発行するのかわからないのですか?さて、Davidが言うように、それはPostMessageまたはSendMessageコマンドからのものだと思います。ElXTreeでこれらすべての呼び出しが行われる場所を探すと、次の10個しか見つかりません。

最初の7つはスクロールバーを扱います。次の3つはColorChangeです。

メッセージの発行について、他のすべてのLMDコンポーネントルーチンも調べましたが、有望なものはありません。

だから私はまだ立ち往生していて、行に焦点を合わせるように求めているそのメッセージの送信者を見つける方法についてのヒントまたは手がかりが必要です。


回避策:

さて、Windowsがマウスイベントを開始していることに気づいたら、ほとんどの点滅を止める何かをすることができました。しかし、それは本当のハックです。誰かがもっと良いことを知っているなら、私はそれについて聞きたいです。

TElXTreeView.WndProcで、継承されたステートメントを次のように置き換えました。

これが行うことは、呼び出されたルーチン内でマルチフォーカスが発生するのを防ぐことです。

編集可能なエントリをクリックしている場合を除いて、それは仕事をします。編集モードに入る前に、最初にエントリを強調表示します。これは、ハイライトがMouseDownで発生するのに対し、編集モードに入るのはMouseUpで発生するためです。私はこれを回避する方法を見つけることができるかもしれませんが、最初の試みは失敗しました。しかし、それは二重点滅ほど悪くはなく、必要に応じて私はそれと一緒に暮らすことができました。

私の脳を押し上げるのを手伝ってくれた皆さんに感謝します。受け入れられた答えは、私に重要な手がかりを与えてくれたデビッドに行きます。


...多分私はあまりにも早く話しました。他のいくつかのコントロール、たとえばグリッドが表示されているページは、コントロール間でページングするときに更新されないことがわかりました。EndUpdateの後にRefreshコマンドを追加してみました。それをしたら、またダブル点滅しました。これは本当に厄介な問題です。

ページングの回避策を得ることができるかもしれませんが、そのコントロールの開発者がより良い修正で私に応答することを願っています。

このようなことは、プログラミングの喜びの1つではありません。:-(

0 投票する
1 に答える
2754 参照

c# - WM_KEYUPメッセージをウィンドウに送信すると、OverflowExceptionが発生します

特定のキーを押し続けた場合に送信されるウィンドウに同じメッセージを送信するプログラムを実装しようとしています。これは、アプリケーションのコードの一部です(Form1.csコード全体はここにあります)。

コード内のWM_KEYUPSendMessageに到達すると、プログラムがクラッシュし、エラーが発生します。

このエラーを修正するにはどうすればよいですか?WM_KEYUPの前に4つのSendMessageが呼び出され、1つは正常に機能し、2文字の「a」をメモ帳に送信します。

返信ありがとうございます

0 投票する
1 に答える
481 参照

windows - ダイアログ プロシージャ メッセージの順序付け

ダイアログ プロシージャでのメッセージ シーケンスが原因と思われる問題が発生しました。グローバル変数が増えるのを避けるために、WM_USER メッセージをダイアログに追加して、コントロールの色を設定しました。メッセージ処理コードは、単純に COLORREF を静的変数に格納しました。INITDIALOG で、(ダイアログ自体に対して) SendMessage(hDlg,WM_User...) を実行し、続いてダイアログ内の静的コントロールの SetDlgItemText を実行しました。WM_CTLCOLORSTATIC メッセージ処理コードは、静的コントロールの色、背景色、およびフォントを設定します。タスクバーからアプリを別のアプリに重ねるまで、すべてが期待どおりに機能しているように見えました. アプリを再構築すると、非表示になっていた静的コントロールの部分が目的の色から黒に変わりました。WM_CTLCOLORSTATIC メッセージによって変更されたフォント サイズも影響を受けないことに注意してください。この情報を再生成する方法はないため、ウィンドウのダイアログ処理でどこかに保存する必要があります。これはもちろん、アプリと Visual Studio の間の相互作用のため、デバッグすることはできません。グローバル変数を設定するだけで色を送信する SendMessage メソッドを置き換えると、問題はなくなりました。

それで、ダイアログに送信されるメッセージと、それらが送信される順序に興味がありますか? MSDN によると、メッセージがウィンドウによって処理されるまで、SendMessage は返されません。だから私はメッセージがこのように見える必要があると思います

一方、静的コントロールは、WM_CTLCOLORSTATIC メッセージの前後に WM_SETTEXT メッセージを処理しています。WM_COMMAND/EN_CHANGE などの他のメッセージも生成および処理されると思います。

その場合、問題の原因や、SendMessages を削除することでどのように修正されたのかわかりません。

0 投票する
0 に答える
1266 参照

c++ - WindowsはMFCのスリープメッセージから再開します

私はWindows用のプログラムに取り組んでいますが、WindowsXP32ビットでのみバグが発生します。

問題は、Windowsがスリープモードになっていて、それを起こしてGUIがめちゃくちゃになっているときです。

私のプログラムはサーバーに接続されており、コンピューターがウェイクアップしているときに接続が切断されます。GUIはログインパネルに移動して再接続を実行しますが、何らかの理由で、GUIディスプレイには再接続のアニメーションのみが表示され、最後の画面の残りのすべてのコンポーネントも表示されます。

表示されるはずののは、アニメーションを再接続する空白の画面です。

システムがウェイクアップしているときにシステムがアプリケーションに渡しているイベント/メッセージをキャッチして、再接続する前に画面をクリアしたいと思います。

そうする方法はありますか?

0 投票する
2 に答える
125 参照

c# - C#からネイティブWindowsアプリのwm_windowmovingを取得します

C ++で記述されたアプリを監視し、それがいつ移動するかを知って、c#Windowsフォームアプリが一緒に移動できるようにする必要があります。

タイマーを使用してC++アプリの位置をポーリングできますが、より良い解決策が必要です。

1つのアプリのWindowsメッセージを監視して、アプリが移動したかどうかを確認するにはどうすればよいですか?

できますか?

または、それを行うためにC ++ dllを見つける必要がありますか、それとも作成する必要がありますか?