【问题标题】:Detecting mousewheel over non-focused window?在非聚焦窗口上检测鼠标滚轮?
【发布时间】:2009-09-23 23:29:51
【问题描述】:

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

MouseWheel += new MouseEventHandler(Form1_MouseWheel);

我遇到的问题是鼠标滚轮处理程序仅在我的应用程序具有焦点时才被调用。这意味着用户必须先单击,然后再单击鼠标滚轮。这对我想做的事情不起作用。

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

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

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

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

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

那么:我如何才能看到那些鼠标滚轮事件,而无需用户先单击以聚焦我的应用程序?

【问题讨论】:

    标签: c# winforms mousewheel


    【解决方案1】:

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

    【讨论】:

    • Thomas,谢谢 - 这是非常接近的,但不是一直到那里。您链接的代码可以检测到鼠标滚轮的移动,但它并没有告诉我滚轮的哪条路。我看到它放入了自己的 MouseFunc 处理程序,查找 WM_MOUSEWHEEL 消息表明 wparam 应该包含 delta 和修饰键。然而,对我来说,它似乎总是 522 - 所以高位词中的 0 而不是我期望的增量。看来我需要更多帮助才能找到解决方案!协助将不胜感激:)
    • 522 是 WM_MOUSEWHEEL 常量的值...这个实现肯定有问题,似乎消息 id 作为 wparam 参数传递给 HookCallback,而不是 code 参数: S
    • 我的错; WM_MOUSEWHEEL 的文档实际上并没有描述在 MouseProc 中得到什么。 lParam 是 522,wParam 是指向 MOUSEHOOKSTRUCT 的指针。不过,该结构似乎与鼠标滚轮没有任何关系:文档 (msdn.microsoft.com/en-us/library/ms644968%28VS.85%29.aspx) 仅列出了一个点、窗口句柄、命中测试和未记录的数据。所以这个问题仍然没有答案:我怎么知道鼠标滚轮的移动方式?
    • 好的,我终于明白了。诀窍是挂钩 WH_MOUSE_LL 并将 lparam 转换为 MSLLHOOKSTRUCT,或者挂钩 WH_MOUSE 并将 lparam 转换为 MOUSEHOOKSTRUCTEX。
    猜你喜欢
    • 2014-08-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-09-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-25
    相关资源
    最近更新 更多