mouseenter和mousehover有什么区别?

10
在C# Windows应用程序中,有两种不同的鼠标事件MouseEnterMouseHover,当光标悬停在对象上时都会触发。
它们之间有什么区别?

1
我认为鼠标悬停是指鼠标在目标上停留一段时间,类似于工具提示。 - PaulG
16
这是一个非常容易通过谷歌搜索获得答案的问题。 - Jonathan M
1
这些问题和答案的投票数都非常奇怪! - TaW
1
@TaW 我猜这是指"帽子效应"。时间非常重要。 - LarsTech
2个回答

29

假设您正在使用 Windows Forms:

鼠标进入事件:

当鼠标指针进入控件时发生。

(MSDN)

鼠标悬停事件:

当鼠标指针停留在控件上时发生。

MouseHover 的典型用途是在指定区域内(即“悬停矩形”)的控件上暂停鼠标时显示工具提示。此事件被引发所需的暂停时间由 MouseHoverTime 属性以毫秒为单位指定。

(MSDN)

要全局设置 MouseHoverTime (不推荐, 可以查看@IronMan84的链接这里获取更好的解决方案),您可以使用 SystemParametersInfo 函数。因为这是一个 Win32 API 调用,所以您需要使用 PInvoke:

[DllImport("user32.dll", SetLastError = true)]
[return: MarshalAs(UnmanagedType.Bool)]
static extern bool SystemParametersInfo(SPI uiAction, uint uiParam, IntPtr pvParam, SPIF fWinIni);

称为:

SystemParametersInfo(SPI.SPI_SETMOUSEHOVERTIME, 
                     desiredHoverTimeInMs, 
                     null, 
                     SPIF.SPIF_SENDCHANGE );

PInvoke.NET 提供的函数签名: SystemParametersInfo, SPIF (枚举), SPI (枚举)

这里没有包含Enum的签名,因为它们太长了。请使用上面链接到的PInvoke.Net上的签名。

有关SystemParametersInfo API调用及其参数的完整信息,请参见MSDN


如何设置MouseHoverTime属性? - Zahema
@IbrahimHero 有几种方法。IronMan的链接也是我找到的。似乎你还可以更改注册表键以在整个系统中设置它。通常情况下,您应避免更改此值。在Google上搜索“Set MouseHoverTime”即可找到相关页面。 - BradleyDotNET
我知道我很蠢,但IronMan的链接对我不是很有用...你能直接给一个设置的例子吗? - Zahema
@IbrahimHero 完成了。由于您不喜欢另一个链接,我为全局 API 调用发布了一个示例。 - BradleyDotNET

11

MouseEnter是指光标进入区域时触发的事件。

MouseHover是指当光标停留在该区域一段时间后触发的事件(通常用于工具提示)。

就鼠标事件而言,MouseEnter事件是最先发生的。此外,您可以手动设置光标停留在该区域多长时间后触发MouseHover事件。您可以在此处了解更多信息。

编辑:我更改了调整MouseHoverTime的链接。事实证明您不能轻松地这样做,并且强烈建议不要这样做,因为它是系统值,会影响计算机上的所有应用程序。相反,新的链接显示了如何使用一个新的、特定于应用程序的变量手动完成此操作。


1
只是让你知道,我借用了你的链接作为设置“MouseHoverTime”的“正确”方式,因为OP坚持采用不同的方法。我会使用你的方式 :) - BradleyDotNET
我完全理解。谢谢你的提醒。 - Corey Adler

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接