Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 当窗口的该部分被始终位于顶部的窗口遮挡时,如何防止自定义工具提示代码绘制?_C#_.net_Winforms - Fatal编程技术网

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窗口。)