我想将一个表单连接到另一个窗口(来自另一个进程)。我尝试使用以下方法实现:
[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;
? -> 完整代码)。
另一条评论说,我需要修改窗口样式:
由于兼容性原因,SetParent 不会修改其父窗口正在更改的窗口的 WS_CHILD 或 WS_POPUP 窗口样式。 因此,如果 hWndNewParent 为 NULL,则在调用 SetParent 后还应清除 WS_CHILD 位并设置 WS_POPUP 样式。 相反,如果 hWndNewParent 不为 NULL 并且该窗口以前是桌面的子窗口,则在调用 SetParent 之前应清除 WS_POPUP 样式并设置 WS_CHILD 样式。
这里我错过了相应的 API,我能否直接从 C# 进行操作或者我必须再次使用另一个 DllImport
?
好与坏 - 在不同进程间使用 SetParent() win32 API 反对在不同进程中附加窗口,但至少我想尝试一下。
问题:
我需要做什么才能使窗体可见?如果使用 WS_Child
的方法是正确的,那么如何设置它?或者是 WPF 方法 是正确的方法,但如何将其应用于 Windows 窗体?
-- 发现(后添加)--
使用 winAPI 修改另一个应用程序的窗口样式 展示了如何从 C# / PInvoke 修改样式
在此处找到所有窗口样式,C# 语法在底部。
-- 由于与 Alan 的讨论而发现 --
我在 Win XP 上运行了我的程序以进行交叉检查(请参阅下面的 Alan 的答案和评论)。至少我现在看到了一些东西。由于我已经按照 Alan 的示例添加了坐标,所以当在接近左上角的其他窗口上移动时,我的窗口现在会在记事本中闪烁。您仍然可以看到叠加在记事本中键入的文本。在 Win 7(32)下我什么都看不到。
- 现在我需要找出是否可以以稳定的方式编写它,在 Win 7 上也能正常显示。
- 尽管如此,我仍然无法单击我的表单上的任何按钮,这也需要解决。