2

我正在寻找一种很好的方法来在我自己不拥有的本机 Windows 窗体上呈现叠加层,最好使用可用于 .NET 的库(WinForms、GTK#、...)。准确地说,我想在窗口的给定位置显示一些标签或文本框。

设备上下文和 System.Drawing:我目前正在做的是直接绘制到其他窗口的设备上下文上,这会导致闪烁,因为其他应用程序的一部分会以不可预测的间隔重绘。因此,我将不得不使用钩子魔法来捕捉它的 WM_PAINT 事件,但这实际上并没有我想去的那么远,除非没有更简单的方法。

带有可见子标签的透明窗口覆盖:我尝试的另一种技术是创建一个具有其他窗口大小的 Windows.Forms.Form,使用 TransparencyKey 使只有子可见。这似乎很难纠正,因为我不希望窗口是最上面的窗口,而只是在外部窗口上方的一个Z 级。好处是,我可以为其添加更多行为,因为我实际上可以处理点击事件等。

您将如何实现它/处理上述两种技术中的问题?

4

3 回答 3

2

绝对使用透明窗口方法,因为它应该更容易实现。创建透明表单非常容易。您已经知道如何使用 TransparenyKey 使背景不被绘制。还要从窗口中删除边框并删除最小/最大/关闭按钮,这样您就不会显示任何镀铬。

将您的窗口创建为感兴趣的窗口所拥有的,它将始终位于目标之上并像无模式对话框一样工作。即只有在拥有窗口可见时才可见。

于 2009-01-12T02:51:09.943 回答
0

谢谢你的回答,但我还是有点困惑。您将如何将窗口的所有者设置为您自己的应用程序不拥有的任何内容?我想当其他应用程序不受管理时,这甚至是不可能的,是吗?

编辑:

我现在离我更近了一步。示例代码在 Boo 中。

[DllImport("user32.dll", SetLastError: true, CharSet: CharSet.Auto)]
public def SetParent(child as IntPtr, parent as IntPtr):
    pass

def createAttachedForm(parentHandle as IntPtr):
  f = Form()
  f.Text = "My overlay"
  f.Show()
  SetParent(f.Handle, parentHandle)
  Application.Run(f)

现在只有 TransparencyKey 的东西似乎不起作用。相反,当设置值时,表单是完全不可见的。

于 2009-01-12T07:54:43.780 回答
0

设置表单的所有者可以通过

Form.Show(IWin32Window w)

其中 w 将句柄公开给父窗口。

于 2009-03-19T00:57:36.860 回答