1

自分の制御下にないプログラムに DDE を送信しています。応答するプログラムには複数のインスタンスがあり、すべてのインスタンスが同じトピック名、リンクなどを持っています。そのため、私の DDE 要求に応答しているインスタンスを知りたいのです。

私のコードは次のとおりです。

textBox1.LinkTopic = "MT4|BID"
textBox1.LinkItem = Combo1.Text
textBox1.LinkMode = 1
textBox1.LinkRequest

これは、ミリ秒ごとに発生する Timer イベントであり、完全に機能します。

問題は、どのプログラムでも DDE 応答を返すことができるということです :(

ですから、どのプログラムが DDE 応答を返しているのか知りたいのです。応答している dde ​​プログラムのアプリ ID (ハンドル) を取得することは可能ですか?

4

1 に答える 1

2

サーバーはWM_DDE_ACKの wparam パラメータでウィンドウ ハンドルを送信します。古いウィンドウ プロシージャを呼び出す前に、独自のウィンドウ プロシージャでメイン ウィンドウをサブクラス化して、ウィンドウ ハンドルをキャッシュすることができます。

編集: VB は、会話ごとに DDEMLAnsiClient をホストする非表示の DDEMLMom ウィンドウを作成するようです。EnumWindows を使用し、GetWindowThreadProcessId の結果と GetCurrentProcessId の結果を比較して、独自のプロセスの最上位のウィンドウを見つけ、クラス名でフィルター処理して DDELMom ウィンドウを見つけることができます。DDEMLMom ウィンドウを取得したら、EnumChildWindows 経由で DDEMLAnsiClient を見つけます。

SetForegroundWindowを介して "切り替え" 機能を実装して、ユーザーがソース アプリケーションを識別できるようにすることができます。

于 2012-12-21T00:39:21.833 に答える