C# 当窗口的该部分被始终位于顶部的窗口遮挡时,如何防止自定义工具提示代码绘制?
我们已经实现了一些自定义工具提示绘图代码,可以在计时器的C# 当窗口的该部分被始终位于顶部的窗口遮挡时,如何防止自定义工具提示代码绘制?,c#,.net,winforms,C#,.net,Winforms,我们已经实现了一些自定义工具提示绘图代码,可以在计时器的Tick事件上触发。每当触发此事件时,我们都会检查以确保控件可见(this.visible),并且是前台窗口(GetForeGroundIndow()) 我们遇到的问题涉及“始终在顶部”窗口,如任务管理器或Process Explorer(启用“始终在顶部”选项时)。因为这些窗口始终位于顶部,所以有时我们的应用程序会被这些窗口遮挡/覆盖,但我们的工具提示仍然会弹出并在顶部窗口的顶部绘制 我曾尝试使用Form.TopMost属性,但这是不可接
Tick
事件上触发。每当触发此事件时,我们都会检查以确保控件可见(this.visible
),并且是前台窗口(GetForeGroundIndow()
)
我们遇到的问题涉及“始终在顶部”窗口,如任务管理器或Process Explorer(启用“始终在顶部”选项时)。因为这些窗口始终位于顶部,所以有时我们的应用程序会被这些窗口遮挡/覆盖,但我们的工具提示仍然会弹出并在顶部窗口的顶部绘制
我曾尝试使用Form.TopMost
属性,但这是不可接受的,因为如果任何地方都有“始终在顶部”窗口,则工具提示永远不会出现。在这种情况下,我们的应用程序甚至处于活动状态,因此我们应该显示工具提示
如何检测/确定窗体上鼠标悬停的区域是否有“始终在顶部”窗口?我想阻止工具提示“通过”窗口显示。听起来像是用计时器轮询鼠标位置,然后显示工具提示。那是错误的选择。您应该做的是检测鼠标移动消息。如果收到鼠标移动事件,告诉您鼠标位于某个区域,则设置计时器,如果在计时器触发时鼠标尚未离开该区域,则显示工具提示。(顺便说一句,本机Windows工具提示就是这样工作的。请参阅。) 这就自动解决了“始终在顶部”窗口的问题,因为如果“始终在顶部”窗口遮住了窗口的一部分,则窗体将不会接收该区域的鼠标移动事件,因此您无需检查鼠标是否确实存在 如果设置为使用当前技术,则可以使用API函数确定在屏幕上的任何给定点可以看到哪个窗口。使用该选项可确定窗口是否位于计划显示工具提示的顶部。(与.API函数等价的.NET是这样的,但是它只给了.NET窗体的子代,而您需要考虑所有的顶级窗口,包括非.NET窗口。)