c# - 检测非聚焦窗口上的鼠标滚轮?

标签 c# winforms mousewheel

我的目标是制作一个 float 工具栏(作为其自己的 C# 应用程序),当用户在我上方使用滚轮时,我想更改可见的按钮。听起来很简单,应该只是这句话的问题:

MouseWheel += new MouseEventHandler(Form1_MouseWheel);

我遇到的问题是,只有当我的应用程序获得焦点时才会调用鼠标滚轮处理程序。这意味着用户必须先单击,然后再单击鼠标滚轮。这对我想做的事情来说是行不通的。

我可以 Hook MouseHover 事件处理程序并调用 form.Activate() 然后获得焦点。这是次优的,因为如果用户将鼠标悬停在我的应用程序上后立即使用滚轮(而不是稍等片刻),焦点仍将位于前一个应用程序上,并且它将获得鼠标滚轮事件。

自然的做法是 Hook MouseEnter 事件并在那里调用 Activate(),但随后我的应用程序并没有出现在前面,而是它的图标开始在任务栏上闪烁。我使用的是 Win7,但这个问题可能比这个更早。

理想情况下,我想做的是检测鼠标滚轮事件,而不必担心我的应用程序是否具有焦点。对于以前的应用程序来说,保持输入焦点确实会更好,因此例如,如果用户在记事本中,他们可以键入,将鼠标悬停在我的应用程序上,使用滚轮,查看他们看到的内容,然后决定继续在记事本中键入。理想情况下,我不希望他们在这种情况下点击一次。

不过,如果没有其他方法,我会选择一种将焦点切换到我的应用程序的解决方案。

到目前为止,我使用的是 C# 和 Windows 窗体,但如果可以解决我的问题,我愿意使用不同的东西。

那么:如何在用户不必先单击以聚焦我的应用程序的情况下查看这些鼠标滚轮事件?

最佳答案

如果您需要在应用程序外部捕获鼠标事件,您可以使用全局系统 Hook 。有一个很好的 .NET 实现 here

关于c# - 检测非聚焦窗口上的鼠标滚轮?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1466702/

相关文章:

jQuery 鼠标滚轮停止传播

c# - 如何在 C# 中创建动态对象

c# - 如何将枚举与标志结合起来?

c# - 表单时未处理计时器

c# - 如何创建、读取和写入 XML C# windows 窗体?

javascript - Three.js 在鼠标滚轮上平滑移动相机

c# - 返回 View (型号 : MyModel); equivalent in ASP.Net Core Razor Pages

c# - 隐藏网格中的列

C# 从 DataGridView 插入 MySQL 数据后被截断

c# - 在 wpf 中禁用 itemscontrol 上的鼠标滚轮