1

重複の可能性:
SetParent を使用して HWND を外部プロセスに埋め込む

関数を使用して自分のプロセスから外部プロセスのウィンドウにウィンドウを埋め込もうとしていますが、SetParent誰かが私を助けてくれることを望んでいるいくつかの問題に遭遇しました。まず、ウィンドウをアプリケーションに埋め込むために現在行っていることの概要を次に示します。

WND myWindow; //Handle to my application window
HWND externalWindow; //Handle to external application window

SetParent(myWindow,externalWindow);

//Remove WS_POPUP style and add WS_CHILD style
DWORD style = GetWindowLong(myWindow,GWL_STYLE);
style = style & ~(WS_POPUP);
style = style | WS_CHILD;
SetWindowLong(myWindow,GWL_STYLE,style);

このコードは機能し、別のアプリケーションにウィンドウが表示されますが、次の問題が発生します。

  • ウィンドウが入力フォーカスを取得すると、外部プロセスのメイン アプリケーション ウィンドウがフォーカスを失います (つまり、タイトル バーの色が変わります)。
  • ウィンドウにフォーカスがある間、メイン アプリケーションのキーボード ショートカット コマンドが機能しません。

これらの問題の回避策を知っている人はいますか? ウィンドウをメイン アプリケーションの別の子ウィンドウとして扱いたいと思います。

ありがとう。

4

1 に答える 1

1

ウィンドウが入力フォーカスを取得すると、外部プロセスのメイン アプリケーション ウィンドウがフォーカスを失います (つまり、タイトル バーの色が変わります)。

AttachThreadInputプロセスのスレッドをホスト プロセスの入力キューにアタッチするには、 を使用する必要があります。これにより、接続されているすべてのスレッド間でメッセージ処理が同期されるだけでなく、フォーカス、非同期キーの状態、アクティブ化、およびその他の入力関連のプロパティが共有されます。

ウィンドウにフォーカスがある間、メイン アプリケーションのキーボード ショートカット コマンドが機能しません。

ウィンドウにキーボード フォーカスがある場合、ウィンドウを所有するスレッドは、システムからすべてのキーボード メッセージを受け取ります。アクセラレータを処理するためにメイン ウィンドウの UI スレッドが必要な場合は、何らかの方法でキーボード入力を前処理のためにそのスレッドにルーティングする必要があります。これを行う方法は、アプリケーションに使用している UI テクノロジと、アクセラレータをどのように処理する必要があるかによって大きく異なります。

異なるプロセスの複数のスレッドにまたがるユーザー インターフェイスを構築するのは難しく、多くの落とし穴があります。

于 2012-07-06T05:36:27.280 に答える