4

私のWPFアプリケーションには複数のウィンドウがあります。これらのウィンドウのいくつかを別のプロセスのウィンドウにアタッチしたいと思います。私の問題は、ウィンドウをアタッチするとウィンドウが見えなくなることです。

私は次のコードでこれを試しています:

public static bool setParentWindow(IntPtr hWndChild, IntPtr hWndNewParent)
    {
    IntPtr previousParent = SetParent(hWndChild, hWndNewParent);
    return (previousParent == null ? false : true);
}

[DllImport("user32.dll", SetLastError = true)]
private static extern IntPtr SetParent(IntPtr hWndChild, IntPtr hWndNewParent);

setParentWindow(myWindowHwnd, newParentHwnd);

したがって、上記のコードはウィンドウを正常にアタッチしますが、残念ながらウィンドウは非表示になります。

これを行う理由は、アプリケーションの「ウィジェット」を作成してアプリケーションを拡張しようとしているためです。ウィジェットがフックされ、ユーザーに追加情報が表示されます。

どちらのウィンドウにも、WS_OVERLAPPEDWINDOW、WS_OVERLAPPED、WS_VISIBLE、WS_CLIPSIBLINGS、WS_CLIPCHILDRENのスタイルがあります。

4

3 に答える 3

7

setParent 呼び出しを使用しなくても、これを実行できることがわかりました。次のように HwndSource クラスを使用しました。

MyWindow window = new MyWindow();
window.ShowActivated = true;

HwndSourceParameters parameters = new HwndSourceParameters();

parameters.WindowStyle = 0x10000000 | 0x40000000;
parameters.SetPosition(0, 0);
parameters.SetSize((int)window.Width, (int)window.Height);
parameters.ParentWindow = newParent;
parameters.UsesPerPixelOpacity = true;
HwndSource src = new HwndSource(parameters);

src.CompositionTarget.BackgroundColor = Colors.Transparent;
src.RootVisual = (Visual)window.Content;

これは現在、問題なくうまく機能しています。

于 2012-05-20T23:38:14.550 に答える
1

オーバーラップしたウィンドウで何をする必要があるかわかりませんが、MSDNから:

互換性の理由から、SetParentは、親が変更されているウィンドウのWS_CHILDまたはWS_POPUPウィンドウスタイルを変更しません。したがって、hWndNewParentNULLの場合は、 SetParentを呼び出した後、 WS_CHILDビットもクリアし、 WS_POPUPスタイルを設定する必要があります。逆に、hWndNewParentNULLでなく、ウィンドウが以前はデスクトップの子であった場合は、SetParentを呼び出す前に、 WS_POPUPスタイルをクリアし、 WS_CHILDスタイルを設定する必要があります。

于 2012-05-20T20:21:04.807 に答える