![](/img/trans.png)
[英]How can I add a WPF overlay over an external Win32 application's window?
[英]How can I position a Win32 floating window inside a user control in my WPF application?
使用派生自HwndHost
的類和一些伏都HwndHost
代碼:
protected override HandleRef BuildWindowCore(HandleRef hwndHost)
{
CheckGuestValidity();
var guestHwnd = new HandleRef(GuestHwnd, _guestHwnd);
Win32.SetWindowStyle(guestHwnd.Handle, WindowStyles.WS_CHILD | Win32.GetWindowStyle(guestHwnd.Handle));
WindowsFormsHost.EnableWindowsFormsInterop();
System.Windows.Forms.Application.EnableVisualStyles();
Win32.SetParent(guestHwnd.Handle, hwndHost.Handle);
Win32.SetWindowStyle(_guestHwnd, Win32.GetWindowStyle(_guestHwnd) & ~WindowStyles.WS_CAPTION);
return guestHwnd;
}
我已經設法從Delphi COM服務器獲得了一個其他的無父窗口(Windows主窗口除外),以采用我的WPF應用程序窗口作為父窗口。 問題是它位於WPF窗口最底部的所有其他用戶控件等下。 我想將其大小和位置設置為適合TabControl中選項卡上的矩形。 我該怎么辦? 我意識到這將需要一些調整大小和定位Win32 API調用的位置,甚至可能會包含一些低級別的Windows消息,但是我贊成。
首先,我找到了一個方便的小類,可以在坐標系之間進行轉換。 這是@ Lu55的答案,而不是公認的問題, 如何將WPF大小轉換為物理像素?
然后,我的WindowHostView
XAML如下所示:
<Grid x:Name="WindowContainer" HorizontalAlignment="Stretch" VerticalAlignment="Stretch" Background="Coral" >
<delphi:Win32WindowHost x:Name="Host" />
</Grid>
Win32WindowHost
類是包含在我的問題中的代碼。
現在,我在WindowHostView
有一個簡潔的小例程,以使來賓窗口適合主機的邊界。
private void PositionGuestWindow(IntPtr hWnd)
{
var rect = WindowContainer.GetAbsoltutePlacement();
var winLeft = Win32Calc.PointsToPixels(rect.Left, Win32Calc.Dimension.Width);
var winTop = Win32Calc.PointsToPixels(rect.Top, Win32Calc.Dimension.Height);
var winWidth = Win32Calc.PointsToPixels(rect.Width, Win32Calc.Dimension.Width);
var winHeight = Win32Calc.PointsToPixels(this.ActualHeight - 20, Win32Calc.Dimension.Height);
Win32Api.MoveWindow(Host.GuestHwnd, (int)winLeft, (int)winTop, (int)winWidth + 1, (int)winHeight, true);
}
Win32Api.MoveWindow
很老了:
[DllImport("user32.dll", SetLastError = true)]
public static extern bool MoveWindow(IntPtr hWnd, int X, int Y, int nWidth, int nHeight, bool bRepaint);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.