C#检测光标是否隐藏

C#检测光标是否隐藏,c#,windows,C#,Windows,是的,我知道有很多这样的问题,但没有一个对我有用。 我需要检查系统光标是否隐藏 我尝试了Cursor.Current==null。它什么也没做。(我用全屏Youtube、Discord和Krita隐藏了光标) 我还尝试从user32.dll使用GetCursorInfo,并检查标志是否为0(隐藏)。没什么 [StructLayout(LayoutKind.Sequential)] 结构点{ 公共Int32 x; 公共利益; } [StructLayout(LayoutKind.Sequentia

是的,我知道有很多这样的问题,但没有一个对我有用。 我需要检查系统光标是否隐藏

我尝试了
Cursor.Current==null
。它什么也没做。(我用全屏Youtube、Discord和Krita隐藏了光标)

我还尝试从user32.dll使用
GetCursorInfo
,并检查标志是否为0(隐藏)。没什么

[StructLayout(LayoutKind.Sequential)]
结构点{
公共Int32 x;
公共利益;
}
[StructLayout(LayoutKind.Sequential)]
结构游标信息{
公共Int32 cbSize;
32面国旗;
公共IntPtr hCursor;
公共点;
}
[DllImport(“user32.dll”)]
静态外部bool GetCursorInfo(out CURSORINFO pci);
公共静态布尔游标隐藏(){
草书信息;
cinfo.cbSize=Marshal.SizeOf(typeof(CURSORINFO));
GetCursorInfo(输出cinfo);
返回cinfo.flags==0;
}
我的目标是在光标隐藏时隐藏屏幕覆盖UI

那么,如何检查系统光标是否以其他方式隐藏

编辑:

好吧,我在艾哈迈德·阿卜杜勒·哈米德的帮助下发现了一件事。基本上,浏览器等不会呈现光标,但系统仍然认为它是可见的。但是,句柄已更改。默认情况下,系统提供的句柄数量有限(
Cursors..Handle
),而不可见的浏览器光标不使用任何句柄

enum游标类型{…}
...
草书信息;
... // 参见上面的代码
游标[]游标=新游标[]{…};//以与游标类型相同的顺序列出所有这些类型
int型=1;
foreach(游标中的游标){
if(cinfo.hCursor==cursor.Handle){
返回(游标类型)类型;
}
类型++;
}
返回游标类型。其他;
然而,这并不是一个完整的解决方案,因为浏览器和其他软件可以创建一种新类型的光标,而不是不可见的(如VS中的向后倾斜),它也将返回
光标类型。其他

正如Herohtar所指出的,隐藏游标通常具有较大的指针值(在我的例子中,
Math.Abs(pointer)>10000000
大部分时间都有效)。这涵盖了大多数浏览器


老实说,我不认为在检测隐藏光标方面我们能做的更多。在罕见的情况下,cusor没有隐藏,但我的应用程序认为它是隐藏的或相反,我决定只允许用户在设置中单击一个按钮,在一段时间后,将当前光标句柄添加到异常中。

检测光标是否隐藏的方法不止一种。有时,系统会被告知不要渲染它,有时软件本身不会渲染它,有时它会将它渲染为非光标的东西(例如数字艺术画笔轮廓)

在最常见的情况下,当系统本身不呈现光标时,您所要做的就是检查光标标志是否为0(隐藏)。(或进行shrotcut并检查Cursor.Current==null

[StructLayout(LayoutKind.Sequential)]
结构点{
公共Int32 x;
公共利益;
}
[StructLayout(LayoutKind.Sequential)]
结构游标信息{
公共Int32 cbSize;
32面国旗;
公共IntPtr hCursor;
公共点;
}
[DllImport(“user32.dll”)]
静态外部bool GetCursorInfo(out CURSORINFO pci);
CURSORINFO GetCinfo(){
草书信息;
cinfo.cbSize=Marshal.SizeOf(typeof(CURSORINFO));
GetCursorInfo(输出cinfo);
返回cinfo;
}
public bool flagshidden(){
CURSORINFO cinfo=GetCinfo();
return cingo.flags==0 | | Cursor.Current==null;//为了额外的安全起见,将两者都使用
}
现在我们遇到了网络浏览器。浏览器不会渲染隐藏的光标,但会更改光标句柄。大多数时候,但不一定总是句柄的值很大

公共bool浏览器隐藏(){
CURSORINFO cinfo=GetCinfo();
返回Math.Abs(cinfo.hCursor.ToInt64())>10000000;
}
现在,我们几乎完成了,但别忘了会有例外。例如,Krita在隐藏光标时渲染笔刷轮廓,但就系统而言,光标仍然可见。没有一种简单、通用的方法来处理这个问题,所以我们必须明确地告诉我们的软件注意这些特殊情况

List exceptions=新列表{…};//将所有常见的异常放在这里,实现一些添加/删除它们的方法
公共布尔值异常(){
CURSORINFO cinfo=GetCinfo();
返回异常.Contains(cinfo.hCursor);
}
公共布尔光标隐藏(){
bool hidden=FlagHidden()| | BrowserHidden();
return hidden!=IsException();//隐藏的xor异常(如果是异常,则反转隐藏)
}

可能有这样一种情况,指针X表示a指向软件B,但C指向软件D。这是不太可能的,但如果您想更加安全,例外列表应该是应用程序和句柄的列表。

您是否尝试过使用
System.Windows.Forms.Cursor
,并检查其位置是否在窗口的可见区域内?当光标被大多数程序隐藏时,
标志
hCursor
(句柄)的值CURSORINFO结构的值应为零。但是,当浏览器隐藏光标时,
flags
的值似乎没有改变(保持为1),而
hCursor
的值被设置为一个自定义句柄,每个浏览器的句柄似乎都不同。我不确定是否有办法检测到这一点。如果我发现了什么,会让你知道。网页主要使用CSS(即,
光标:无
)临时“隐藏”光标。
cursor:none
的作用是告诉浏览器t