2011-12-19 59 views
6

你如何獲得所有點擊以通過活動?我注意到,如果你點擊得太快,它認爲你是雙擊並且不會將點擊發送到事件處理程序。有沒有辦法獲得所有的點擊?WinForms禁用雙擊並接受所有鼠標點擊?

+2

改爲使用mousedown事件。 – 2011-12-19 12:48:47

+0

@RussellTroywest我認爲[MouseClick](http://msdn.microsoft.com/en-us/library/system.windows.forms.control.mouseclick%28VS.80%29.aspx)事件會更好。因爲提高了秩序。 – 2011-12-19 12:52:35

+1

@Michael:根據MSDN「按照用戶操作系統的鼠標設置確定發生的兩次單擊會產生MouseDoubleClick事件,而不是第二次MouseClick事件。」 - High看到的是什麼。 – 2011-12-19 12:55:29

回答

9

不知道爲什麼這個問題得到了獎勵,接受的答案應該已經非常接近解決方案。除了您應該使用MouseUp而不是MouseDown之外,您的用戶通常希望點擊操作在釋放按鈕時生效。其中提供退出「哎呀,並不意味着點擊它,移動鼠標,使其被忽略」選項。儘管如此,對於像PictureBox這樣的內置Winforms控件,這可以通過Control.SetStyle()方法進行配置。爲您的項目添加一個新類並粘貼下面顯示的代碼。編譯。從工具箱的頂部掉落新的控制:但是

using System; 
using System.Windows.Forms; 

class MyPictureBox : PictureBox { 
    public MyPictureBox() { 
     this.SetStyle(ControlStyles.StandardDoubleClick, false); 
    } 
} 

,一定要提防這不會爲包裝已有的本地Windows控制.NET類的工作。像TextBox,ListBox,TreeView等。底層配置是WNDCLASSEX.style member,CS_DBLCLKS樣式標誌。設置該樣式標誌的代碼被烘焙到Windows中,並且無法更改。您需要進行不同類型的手術才能將雙擊恢復爲單擊。你可以這樣做,通過重寫的WndProc()方法,我舉一個例子爲文本框:

using System; 
using System.Windows.Forms; 

class MyTextBox : TextBox { 
    protected override void WndProc(ref Message m) { 
     // Change WM_LBUTTONDBLCLK to WM_LBUTTONCLICK 
     if (m.Msg == 0x203) m.Msg = 0x201; 
     base.WndProc(ref m); 
    } 
} 

,如果你想這樣做,其他控件只需更改類的名稱。 Commandeering Winforms使其以您想要的方式工作,從不需要太多代碼,只需Petzold :)

-2

我想你想統計所有的點擊。 如果你想計數點擊,然後設置一個計數器變量,並增加它在點擊事件。 可能對你有幫助......

+0

你自己做,然後點擊它非常快10倍。你會得到一個小於10的數字。我希望所有10次點擊。 – Will 2011-12-19 12:54:07

2

你想使用控件MouseDown事件而不是Click事件。每當鼠標在該控件上「按下」時,都會調用MouseDown。如果系統認爲它是雙擊,則點擊可能不會被調用。 DoubleClick活動將被提出。