C# 在.NET中实现粘性覆盖

C# 在.NET中实现粘性覆盖,c#,.net,overlay,C#,.net,Overlay,我正在寻找一种在本机Windows窗体上渲染覆盖的好方法,最好使用.NET可用的库(WinForms,GTK#,…)。确切地说,我希望在窗口的给定位置显示一些标签或文本框 设备上下文和系统.Drawing:我目前正在做的是直接绘制到其他窗口的设备上下文,这会导致闪烁,因为其他应用程序的某些部分会以不可预测的间隔重新绘制。因此,我必须用钩子魔术来捕捉它的WM_绘画事件,但这实际上并没有我想去的那么远,除非没有更简单的方法 带有可见子标签的透明窗口覆盖:我尝试的另一种技术是创建一个具有其他窗口大小的

我正在寻找一种在本机Windows窗体上渲染覆盖的好方法,最好使用.NET可用的库(WinForms,GTK#,…)。确切地说,我希望在窗口的给定位置显示一些标签或文本框

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

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


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

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


创建您感兴趣的窗口所拥有的窗口,它将始终位于目标的顶部,并像一个无模式对话框一样工作。也就是说,只有当拥有的窗口可见时,它才可见。

谢谢你的回答,但我还是有点困惑。如何将窗口的所有者设置为不属于您自己的应用程序的任何内容?我想当另一个应用程序处于非托管状态时,这是不可能的,是吗

编辑:

我现在更接近了。示例代码是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)

现在只有透明键似乎不起作用了。相反,当设置值时,表单是完全不可见的。

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

Form.Show(IWin32Window w)
其中,w向父窗口公开句柄