【发布时间】:2012-05-27 09:40:05
【问题描述】:
我想将表单附加到另一个窗口(另一个进程)。我尝试通过使用来做到这一点
[DllImport("user32.dll", SetLastError = true)]
private static extern IntPtr SetParent(IntPtr hWndChild, IntPtr hWndNewParent);
setParentWindow(myWindowHwnd, newParentHwnd);
这样做时,我的表单会被附加,但也是不可见。问题"Attach window .." 解决了 WPF 窗口的这个问题,基本上是通过使用
HwndSourceParameters parameters = new HwndSourceParameters();
...
HwndSource src = new HwndSource(parameters);
我已尝试将其转移到我的表单中,但我无法这样做(例如如何处理 src.RootVisual = (Visual)window.Content; ?-> Complete source)。
Another comment说,我需要修改windows样式:
出于兼容性原因,SetParent 不会修改正在更改其父级的窗口的 WS_CHILD 或 WS_POPUP 窗口样式。因此,如果 hWndNewParent 为 NULL,还应在调用 SetParent 后清除 WS_CHILD 位并设置 WS_POPUP 样式。反之,如果 hWndNewParent 不为 NULL 且窗口之前是桌面的子窗口,则应在调用 SetParent 之前清除 WS_POPUP 样式并设置 WS_CHILD 样式。
这里我错过了相应的 API,我可以直接从 C# 中完成,还是让我再次使用另一个 DllImport?
Good or evil - SetParent() win32 API between different processes 建议不要在不同的进程中附加窗口,但至少我想尝试。
问题:
我需要做什么才能使表单窗口可见?如果WS_Child 的方法是正确的,我将如何设置它?或者WPF approach 是要走的路,但我如何将它应用到 Windows 窗体?
-- 发现(后来添加)--
Modify the windows style of another application using winAPI 展示了如何从 C# / PInvoke 修改样式
在这里找到所有windows styles,C# 语法在底部。
-- 与 Alan 讨论的结果--
我确实在 Win XP 上运行了我的程序以进行交叉检查(请参阅下面 Alan 的回答和 cmets)。至少我现在确实看到了一些东西。由于我已经添加了 Alan 示例中的坐标,因此当在左上角附近的另一个窗口上移动时,我的窗口现在在记事本中闪耀。您仍然可以看到在记事本中键入的文本作为覆盖。在 Win 7 (32) 下,我什么都看不到。
- 现在我需要确定这是否可以以稳定的方式编写,也出现在 Win 7 上。
- 尽管如此,我仍然无法单击表单上的任何按钮,也需要解决。
【问题讨论】:
-
出于好奇,我遵循了这些指南并实施了一个似乎可行的原始解决方案,当然还有一些常见的警告(例如,指针在其他进程中无效等)。那么,既然您基本上已经自己回答了,那么您的问题仍然相关吗?
-
我仍然看不到我的表单窗口。我试图将值设置为“WS_Child 评论”中的值,但没有成功。如果您在 C# 中有一个正在运行/工作的示例,如果您发布它,我将不胜感激。这是很多线索和错误,也许我错过了一些东西。我根本无法将表单窗口放在前面/可见。
-
没问题,等一下。