我想将一个表单附加到另一个窗口(另一个进程).我试着通过使用来做到这一点
[DllImport("user32.dll", SetLastError = true)]
private static extern IntPtr SetParent(IntPtr hWndChild, IntPtr hWndNewParent);
setParentWindow(myWindowHwnd, newParentHwnd);
Run Code Online (Sandbox Code Playgroud)
这样做我的表格变得紧密,但也是看不见的.问题"附加窗口.."解决了WPF窗口的这个问题,基本上是通过使用
HwndSourceParameters parameters = new HwndSourceParameters();
...
HwndSource src = new HwndSource(parameters);
Run Code Online (Sandbox Code Playgroud)
我试图将它转移到我的表单,但我无法这样做(例如如何处理src.RootVisual = (Visual)window.Content;? - > 完整的源代码).
另一条评论说,我需要修改windows风格:
出于兼容性原因,SetParent不会修改其父级正在更改的窗口的WS_CHILD或WS_POPUP窗口样式.因此,如果hWndNewParent为NULL,则还应清除WS_CHILD位并在调用SetParent后设置WS_POPUP样式.相反,如果hWndNewParent不为NULL且窗口以前是桌面的子窗口,则应在调用SetParent之前清除WS_POPUP样式并设置WS_CHILD样式.
在这里,我错过了相应的API,我可以直接从C#中进行,还是让我DllImport再次使用另一个?
好或坏 - 不同进程之间的SetParent()win32 API建议不要在不同进程中附加窗口,但至少我想尝试.
题:
要使表单窗口可见,我需要做什么?如果方法WS_Child是正确的,我将如何设置它?或者WPF方法是否可行,但我如何将其应用于Windows窗体?
- 调查结果(后来添加) -
使用winAPI修改另一个应用程序的Windows样式显示如何从C#/ PInvoke修改样式
在这里找到所有窗口样式,底部是C#语法.
- 与Alan讨论的调查结果 -
我确实在Win XP上运行我的程序进行交叉检查(参见下面的Alan的回答和评论).至少我现在看到的东西.由于我已经添加了Alan的例子中的坐标,当我移动到左上角附近的另一个窗口时,我的窗口现在在记事本中闪耀.您仍然可以在记事本中看到键入的文本作为叠加层.在Win 7(32)下,我什么也看不见.
我有一个WPF窗口,它必须表现为第三方正在运行的应用程序中窗口的叠加.我的WPF窗口必须大部分是透明的,带有一些可见的控件,总是位于z顺序的另一个窗口的顶部,随之移动等等.简而言之:我希望它的行为就像一个子窗口.
我已经回顾了这里提供的技术(WPF HwndSource技术)和这里(WPF SetParent技术).HwndSource技术根本不起作用.SetParent技术适用于Windows 7,但仅适用于基本主题.使用Windows 7 Aero主题时,它不起作用:我的子窗口是不可见的.
我正在寻找一个适用于所有Windows 7主题的解决方案.
我的测试应用程序创建一个测试窗口并调用SetParent使其成为记事本窗口(硬编码的HWND)的子窗口.
在基本主题下,它看起来像这样:

在Windows 7主题下,我没有看到它:

子窗口XAML:
<Window x:Class="WpfApplication22.TestWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="TestWindow" Height="300" Width="300" Background="#63000000" ShowInTaskbar="False" WindowStyle="None" Initialized="Window_Initialized" Loaded="Window_Loaded" AllowsTransparency="True">
<Grid>
<Ellipse Height="87" HorizontalAlignment="Left" Margin="12,12,0,0" Name="ellipse1" Stroke="Black" VerticalAlignment="Top" Width="167" Fill="#FFBE3A3A" />
</Grid>
</Window>
Run Code Online (Sandbox Code Playgroud)
子窗口表单加载处理程序代码:
var parentHwnd = new IntPtr(0x01DE0DFC); // Running Notepad
var guestHandle = new WindowInteropHelper(this).Handle;
var style = WS_VISIBLE | WS_CLIPSIBLINGS | WS_CHILD | WS_POPUP;
SetWindowLong(guestHandle, GWL_STYLE, (int)(style));
SetParent(guestHandle, …Run Code Online (Sandbox Code Playgroud)