2011-01-05 2 views

答えて

8

私は以前、Winformsのためにこれをやっていましたが、方法は明るくないので、他の誰も考えられない限り、ここで私がしたことがあります。それなしMoveWindowの呼び出しがありません必要があるため(SetParentSetWindowLongMoveWindowがp /呼び出し経由で呼び出さWin32 API関数である)、睡眠は、ハックとして必要だった

Process p = Process.Start(@"application.exe"); 

p.WaitForInputIdle(); 
IntPtr appWin = p.MainWindowHandle; 

SetParent(appWin, parent); 
SetWindowLong(appWin, GWL_STYLE, WS_VISIBLE); 
System.Threading.Thread.Sleep(100); 
MoveWindow(appWin, 0, 0, ClientRectangle.Width, ClientRectangle.Height, true); 

:コードはかなりこのました効果。

WPFの場合、サードパーティウィンドウのパラレンターになるウィンドウ/コントロールのハンドルが必要です。このようなハンドルを取得する最も簡単な方法は、HwndHostコンテナを使用することです。

私はWPFでこれを達成するためのよりきれいな方法はないと思います。また、私はWPFではなくwinformsでのみこれをテストしたことに注意してください。ただし、WPFでも有効です。ただし、有効なWin32 HWNDが親のものである限りです。

+0

ありがとうございますが、少しハッキーです。ターゲットアプリケーションの動作は未定義です。いくつかのアプリケーションは、たとえUI(すなわち、Office)を持ち、一部が正常に動作しなくなったとしても、OSに非UIアプリケーションとして登録されたものです。私はしばらくの間あなたの答えを受け入れていません。 –

+0

私はあなたが答えを受け入れてコメントを残さないのを見て、これがあなたのためにどのように働いたのか、私は午前中に疑問に思っていました。私はそれがかなりハッキーであることに同意します。これを行うより良い方法があれば私は自分にとって好奇心が強い。残念なことに私がこれを実装する必要があるとき、私は非常に多くの時間を費やし、これ以上のものは見つけられませんでした。その時、これは私の場合は受け入れられましたが、コードの素敵な部分ではありません。答えに言及したように、ここで答えがなかったので私はそれを共有しました。 –

+0

コード/アイデアを共有していただき、ありがとうございます。 –

関連する問題