【问题标题】:Is there a WINAPI or P/Invoke method to clip/mask a window in C#?是否有 WINAPI 或 P/Invoke 方法来剪辑/屏蔽 C# 中的窗口?
【发布时间】:2019-06-04 20:08:58
【问题描述】:

我的 C# 项目启动了一些其他进程,这些进程创建了自己的窗口。显示所有这些窗口很麻烦 - 有没有办法剪辑/遮盖这些窗口(我的项目不拥有),以便只显示其中的一小部分并能够与之交互?

例如将 wHnd 与 Rectangle 一起传递的东西。

这是存在的吗?

【问题讨论】:

  • 你可以用ShowWindow隐藏它们吗?
  • 您是否尝试创建类似于 MDI 窗口的东西,但使用来自不同进程的子窗口?
  • 因此您将启动进程,调用WaitForInputIdle,然后将MainWindowHandle 传递给上述 ShowWindow() API。
  • 是的。只需 Win32 即可完成 MDI。 docs.microsoft.com/en-us/windows/desktop/winmsg/…
  • 您可以拥有一个与父窗口不同进程的子窗口。 Google Chrome、Internet Explorer、Edge 和我公司的主要产品(彭博终端)广泛执行此操作。然而,这有许多的陷阱。而且我从来没有尝试过使用 MDI 窗口来做到这一点。

标签: c# winapi window pinvoke dwm


【解决方案1】:

非常非常感谢@Michael Gunter,MDI 确实允许进行这样的构造!

对于多年后偶然发现这个问题的任何人,以下是有效的方法:

IntPtr finalhWnd; // the window to clip's handle

Form mdiP = new MDIParent(); // MDIParent is custom, just a simple form without a border
mdiP.Show();

SetParent(finalhWnd, mdiP.Handle); // set the target form as a child of our own
SetWindowPos(finalhWnd, (IntPtr)0, -30, -50, 100, 100, 0x0200); // clip a 100x100 block, starting at (30,50)

Application.Run();

这是一个使用它来裁剪 Chrome 实例边框的示例:

【讨论】:

  • 如果您只托管一个子窗口,则不需要 MDI 容器。原始帖子的措辞方式听起来像是您想在某种容器中显示多个窗口。
猜你喜欢
  • 2011-10-20
  • 1970-01-01
  • 1970-01-01
  • 2021-12-06
  • 2015-05-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多