【问题标题】:detect if mouse's back/forward button was pressed检测是否按下了鼠标的后退/前进按钮
【发布时间】:2014-08-25 11:48:19
【问题描述】:

当我收到鼠标事件时,如何使用GetKeyState 检测鼠标的后退或前进按钮是否按下? MSDN's virtual key code list 似乎只定义了鼠标左键、右键和中键。

传递给 SetWindowsHookEx 的回调方法:

[MethodImpl(MethodImplOptions.NoInlining)]
private IntPtr LowLevelMouseProc(int nCode, UIntPtr wParam, IntPtr lParam)
{
    Debug.WriteLine(wParam.ToUInt32());
    Debug.WriteLine("MK_XBUTTON1: " + (wParam.ToUInt32() & 0x20));
    Debug.WriteLine("MK_XBUTTON2: " + (wParam.ToUInt32() & 0x40));
}

按下后退或前进时输出以下内容:

523
MK_XBUTTON1: 0
MK_XBUTTON2: 0
524
MK_XBUTTON1: 0
MK_XBUTTON2: 0

【问题讨论】:

  • 查看WM_APPCOMMAND 消息。

标签: c# winapi mouseevent


【解决方案1】:

您正在链接到 Windows CE 文档。 Virtual-Key Codes 的桌面 Windows 文档包含 VK_XBUTTON1VK_XBUTTON2 代码。这些是附加鼠标按钮的常量,通常分配给向前和向后导航。

如果您想立即处理 X 按钮消息,它们将使用 WM_XBUTTONDOWNWM_XBUTTONUP 发布到您的应用程序。 wParam 的低位字表示按下哪个 X 按钮(如果有)。

【讨论】:

  • 啊,我的错误键码列表很糟糕...知道如何在 C# 中检索低位单词吗?
  • 屏蔽低位单词是wParam & 0xff。但是,这不是必需的;对MK_XBUTTON1 (0x20) 或MK_XBUTTON2 (0x40) 应用按位与就足够了,并将结果与​​零进行比较。如果结果非零,则按下相应的按钮,否则不按下。
  • 嗯,似乎没有工作:/我在问题中添加了我的回调代码。
  • 它看起来而不是弄乱 wParam 我必须将 lParam 编组到 MSLLHOOKSTRUCT 并检查 mouseData 字段的值 0x10000 和 0x20000,如 herehere 所述。
  • 我指的是消息中使用的wParam(链接到我的答案)。低级鼠标钩子过程中的wParam 显然不同。也许您应该彻底阅读LowLevelMouseProc 的文档。
【解决方案2】:

假设你使用C# WinForm,你想要的是:当图片框被聚焦时,检测鼠标的后退/前进按钮是否被按下。

private System.Windows.Forms.PictureBox picContent;
this.picContent.MouseDown += new System.Windows.Forms.MouseEventHandler(this.picContent_MouseDown);

private void picContent_MouseDown(object sender, MouseEventArgs e)
{
    if (e.Button == MouseButtons.XButton1)
        MessageBox.Show("Back");
    if (e.Button == MouseButtons.XButton2)
        MessageBox.Show("Forward");
}

在 .Net Framework 4.5.2 上测试

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-03-07
    • 1970-01-01
    • 2019-01-29
    • 2012-03-13
    • 1970-01-01
    • 2018-11-28
    • 2013-06-17
    • 2011-04-20
    相关资源
    最近更新 更多