2010-07-14 54 views
3

我想創建一個在我的應用程序中發生的所有右鍵單擊的常用處理程序(或可能還有其他一些獨特的行爲,如中間按鈕單擊等)。他們會調用相同的動作,例如啓動對話框以自定義單擊的控件或顯示幫助對話框。所有右鍵單擊的常用處理程序

有沒有一種機制,可以讓我攔截應用程序中的所有點擊事件,每個提供控制點擊發生的參考?暴力解決方案將使用反射來遍歷我創建的每個表單中的所有控件,並在那裏附加一個處理程序,但我正在尋找更加直接的東西。

+0

你這是什麼意思是「在申請中」?在表格上?容器(面板,groupbox)?在控件上(按鈕,文本框,複選框)?.. – serhio 2010-07-15 12:00:25

+0

基本上我想捕捉UI元素的點擊,尤其是按鈕,標籤,複選框等控件,以便通過我創建的配置引擎輕鬆進行自定義。在我的配置引擎中,我遍歷了Control,DataGridViewColumn,ToolStripItem的子類型的所有字段,併爲給定客戶應用存儲在配置中的定製。現在我想要輕鬆地彈出一個窗口,在給定的UI元素上創建這些自定義。 – nazgul 2010-07-15 19:16:00

回答

1

您可以嘗試在窗體上實現IMessageFilter接口。還有其他幾個討論和文件。一個可能的解決方案,你可能看起來像(創建一個表單,其上放置一個按鈕,從下面添加必要的代碼,運行它,並嘗試形成一個按鈕上並單擊鼠標右鍵):

using System; 
using System.Runtime.InteropServices; 
using System.Windows.Forms; 

namespace WindowsApplication1 
{ 
    public partial class Form1 : Form, IMessageFilter 
    { 
     private const int WM_RBUTTONUP = 0x0205; 

     [DllImport("user32.dll", CharSet = CharSet.Auto, ExactSpelling = true)] 
     public static extern IntPtr GetCapture(); 

     public Form1() 
     { 
     InitializeComponent(); 
     Application.AddMessageFilter(this); 
     } 

     public bool PreFilterMessage(ref Message m) 
     { 
     if (m.Msg == WM_RBUTTONUP) 
     { 
      System.Diagnostics.Debug.WriteLine("pre wm_rbuttonup"); 

      // Get a handle to the control that has "captured the mouse". This works 
      // in my simple test. You can read the documentation and do more research 
      // on it if you'd like: 
      // http://msdn.microsoft.com/en-us/library/ms646257(v=VS.85).aspx 
      IntPtr ptr = GetCapture(); 
      System.Diagnostics.Debug.WriteLine(ptr.ToString()); 

      Control control = System.Windows.Forms.Control.FromChildHandle(ptr); 
      System.Diagnostics.Debug.WriteLine(control.Name); 

      // Return true if you want to stop the message from going any further. 
      //return true; 
     } 

     return false; 
     } 
    } 
}