簡體   English   中英

如果您先滾動鼠標滾輪,則不會發生滾輪按鈕的中鍵 MouseDown 事件

[英]Wheel-button's middle-button MouseDown event doesn't happen if you scroll the Mouse Wheel first

在我的 C# Windows Forms 應用程序和其他應用程序中,鼠標滾輪/鼠標中鍵有些問題。

在以下情況下,如何檢測到鼠標中鍵被按住? (因為Control.MouseButtons說謊!)

如果我滾動鼠標滾輪,然后快速按下滾輪按鈕(在控制面板設置為產生中鍵單擊),則此代碼不會檢測到鼠標中鍵的MouseDown事件。 此外,如果我繼續按住滾輪按鈕,並在按住按鈕的同時滾動滾輪,那么我會收到 MouseWheel 事件,但Control.MouseButtons並不表示中間按鈕被按住。 這似乎是一個嚴重的缺陷。 滾輪按鈕現在物理上被按住,但似乎沒有辦法檢測到它被按下了。

與此相反,如果我先按下滾輪按鈕(不滾動滾輪)並按住它,那么滾輪事件正確地指示鼠標中鍵按下了預期。

這似乎我可能正在與微軟實施的一些秘密聰明作斗爭,以防止在使用鼠標滾輪時意外點擊滾輪按鈕。 但實際上,這意味着如果在按下滾輪之前稍微滾動鼠標中鍵(滾輪按鈕),則無法正確檢測到鼠標中鍵(滾輪按鈕)向下。 我實際上不知道這種聰明是否在硬件級別或驅動程序級別或應用程序級別實現或什么。 我不完全確定是否有什么可以做的。

我特別擔心,因為我試圖在其他應用程序中重現這種現象,例如,我能夠Blender中重現該問題。 所以也許在 C# 中沒有什么可以做的。 或者也許有一個控制面板設置或可以克服這個問題的東西。 我不確定這是否是硬件問題,但我懷疑它可能與鼠標驅動程序有關——而且這似乎是故意的。 我不知道其他供應商的其他類型的鼠標設備會在多大程度上發生這種行為,或者只是這個鼠標。 我還沒有檢查它是否在其他操作系統上使用相同的鼠標發生。

我希望有人能告訴我一種方法來檢測在這種情況下鼠標中鍵是否按下。 如果不是,那么我也很想知道這是否是可以通過軟件(驅動程序?)更新糾正的錯誤,或者是否是此鼠標(或所有鼠標設備)的硬件限制。

這是可用於檢測此現象的代碼。

public partial class Form1 : Form
{
    public Form1()
    {
        InitializeComponent();
        MouseDown += Form1_MouseDown;
        MouseWheel += Form1_MouseWheel;
    }

    private void Form1_MouseWheel(object sender, MouseEventArgs e)
    {
        System.Diagnostics.Debug.WriteLine("MouseWheel {0}", MouseButtons);
    }

    private void Form1_MouseDown(object sender, MouseEventArgs e)
    {
        System.Diagnostics.Debug.WriteLine("MouseDown");
    }
}

同樣,重現問題的神奇步驟是:

  • 稍微滾動鼠標滾輪
  • 立即按下鼠標滾輪按鈕(根據鼠標屬性/控制面板,它被配置為提供鼠標中鍵單擊。)
  • (我們已經處於錯誤的 state 中,因為我們沒有收到鼠標中鍵按下事件。)
  • 繼續按住按鈕並滾動滾輪,這將導致上面的代碼指示鼠標按鈕未按下。 Control.MouseButtons被愚弄以為鼠標中鍵沒有按下。)

如果這些細節中的任何一個很重要:

  • 微軟 IntelliMouse 光學 USB
    • 司機日期:2011-05-18
    • 驅動程序版本 8.20.409.0
  • Windows 10 1909 (18363.900)
  • 視覺工作室 2019
  • .NET 框架 4.7.2

控制面板中鼠標屬性的屏幕截圖

MouseDown 檢測何時按下任何鼠標按鈕 - 同時 MouseClick 檢測何時釋放按鈕。 假設您可以捕獲以下事件:

    public Form1()
    {
        InitializeComponent();
        MouseDown += Form1_MouseDown;
        MouseClick += Form1_Click;
        MouseWheel += Form1_MouseWheel;
    }

    private void Form1_MouseDown(object sender, MouseEventArgs e)
    {
        System.Diagnostics.Debug.WriteLine("Button pressed {0}", e.Button);
    }

    private void Form1_MouseWheel(object sender, MouseEventArgs e)
    {
        System.Diagnostics.Debug.WriteLine("Wheel in action....");
    }

    private void Form1_Click(object sender, MouseEventArgs e)
    {
        System.Diagnostics.Debug.WriteLine("Button Released {0}", e.Button);
    }

在此處輸入圖像描述

編輯

帶有時間戳的屏幕截圖在此處輸入圖像描述

Wheel in actionButton pressed Middle之間的時間差是 32ms。

讓我知道以上是否是您正在尋找的。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM