2009-07-08 86 views
0

我在Winforms應用程序中有一個多行文本框,我希望能夠在應用程序的某些狀態下單擊而不更改文本選擇。C#Winforms抑制文本框上的鼠標單擊事件

我還想訂閱MouseDown(或Click)事件,我只是不想讓文本選擇對它做出反應。

我希望MouseEventArgs上的Handled或Cancel屬性,但很遺憾,沒有。

我可以聽取選擇更改的事件,並在需要時嘗試重置它,但這感覺有點像黑客一樣,因爲我必須記住選擇更改事件之前的當前選擇。有沒有人有比這更好的建議?

回答

9

您可以創建自己的文本框繼承System.Windows.Forms.Textbox,然後重寫WndProc。

WndProc是接收有關操作系統,電源消息,輸入等所有內容的消息的初始方法。該方法的名稱是Win32(和Win16)天的倒退,其中兩個主要函數之一你會實現的是「WndProc」或Windows程序。

通過這樣做,您現在可以在事件被分派到基礎實現之前攔截鼠標(或任何其他消息)的窗口消息。

在下面的例子中,我們不會傳遞任何Left按鈕,向上或雙擊要處理的基本控件。

public partial class MyTextBox : TextBox 
{ 
    int WM_LBUTTONDOWN = 0x0201; //513 
    int WM_LBUTTONUP = 0x0202; //514 
    int WM_LBUTTONDBLCLK = 0x0203; //515 

    public MyTextBox() 
    { 
     InitializeComponent(); 
    } 

    protected override void WndProc(ref Message m) 
    { 

     if (m.Msg == WM_LBUTTONDOWN || 
      m.Msg == WM_LBUTTONUP || 
      m.Msg == WM_LBUTTONDBLCLK // && Your State To Check 
      ) 
     { 
      //Dont dispatch message 
      return; 
     } 

     //Dispatch as usual 
     base.WndProc(ref m); 
    } 
} 

只剩下要做的事情是添加檢查你的狀態,以確定何時傳遞消息或不。

您可以找到要處理here的Windows消息列表。

0

在上面覆蓋一層透明面板。

+0

我也考慮過這個,但感覺同樣如此。無論如何,可能比回滾選擇更改事件更簡單,儘管 – johnc 2009-07-08 04:01:50

+0

是透明的,因爲BackColor似乎不起作用。我可能會錯過一些東西 – johnc 2009-07-08 04:05:20

1

如何處理Enter事件並將焦點設置爲此事件中的其他控件?儘管如此,仍然非常「黑客般」,只需較少的代碼。

+0

這很醜陋,但它似乎起作用,我只需要將我的功能移到enter事件後,我將注意力集中在一個虛擬空標籤上。儘管如此,我不會接受這個答案,除非我沒有得到更好的建議,謝謝 – johnc 2009-07-08 04:16:20