在 編寫winform應用程序時,有時需要無論在哪個控件獲取焦點時,對某一個鍵盤輸入或者鼠標事件都進行同樣的操作。比如編寫一個處理圖片的應用程序時, 希望無論當前哪個控件獲得焦點,當用戶按上、下、左、右鍵時,圖片控件的滾動條都會上下左右移動,當用戶撥動鼠標滾輪時圖片總能發大或縮小。如果對每個控 件的鍵盤或鼠標事件都進行設置,必然會造成很多的重復工作。本文我將介紹如何在winform下對某一個鍵盤輸入或者鼠標事件進行相同的操作。
1、鍵盤事件的捕捉和重寫
首先是鍵盤操作,為了實現上述功能,現在介紹winform的一個方法。ProcessCmdKey.其msdn說明的地址為:msdn
ProcessCmdKey介紹
從函數名就可以看出,這其實是設置winform的快捷鍵的函數。
“在消息預處理過程中調用此方法,以處理命令鍵。命令鍵是始終比常規輸入鍵具有優先權的鍵。命令鍵的示例包括快捷鍵和菜單快捷方式。此方法必須返回true,以指示它已經處理完命令鍵,或者false,以指示該鍵不是命令鍵。僅當控件承載在
Windows 窗體應用程序中或充當 ActiveX 控件時,才調用此方法。”
上述是msdn對該函數的介紹。其意思是,在該函數中定義的鍵 盤操作響應事件具有最高的優先權,會在所有的鍵盤響應時間之前執行。如果想在執行完該事件之后執行與該鍵盤輸入相關的事件則返回false(即認為該輸入 事件未處理),如果要屏蔽其它響應時間則返回true(即告訴應用程序這個鍵盤輸入我已經處理過了,后面就不要再處理了)。
因此有了這個函數就可以很好的屏蔽程序中的其他鍵盤輸入響應事件,從而自己定義對每個鍵盤輸入的響應。
下面給一個實例:
protected override bool ProcessCmdKey(ref Message msg, Keys keyData){switch (keyData){case Keys.Right:MessageBox.Show("Right");return true;case Keys.Left:MessageBox.Show("Left");return true;case Keys.Up:MessageBox.Show("up");return true;case Keys.Down:MessageBox.Show("down");return true;case Keys.Space:MessageBox.Show("space");return true;case Keys.Enter:MessageBox.Show("enter");return true;}return false;}
在實際程序中,只需要將上述代碼加入winform應用程序的窗體類中,然后替換MessageBox為自己想要實現的功能即可。
2、對于鼠標的事件,有上述要求的主要是鼠標的滾輪滾動事件。因為鼠標的點擊雙擊移動等事件都是與鼠標指針指向有關的,沒有必要對所有的都 執行相同的操作,只有鼠標滾輪事件與當前鼠標指針的指向的關系不大,對其執行相同的操作有一定的實際意義。正如前面所說的在處理圖片的應用程序中可能需要 無論在何種情況下,鼠標滾輪下撥都對應著放大圖片,而上滾都對應著縮小圖片。
對于這個功能要求采用的是鼠標事件委托
具體操作為在窗體初始化的時候將鼠標滾輪事件委托到一個自定義函數上,代碼如下:
public Form1(){InitializeComponent();this.MouseWheel+= new MouseEventHandler(MyMouseWheel);}
其中第二句語句的意思是將這個程序的鼠標滾輪事件綁定到MyMouseWheel這個函數上,然后后續自己定義一個MyMouseWheel的函數即可
我定義的MyMouseWheel函數如下:
?private void MyMouseWheel(object sender, System.Windows.Forms.MouseEventArgs e){if (e.Delta > 0){MessageBox.Show("滾輪向前滾動");}else{MessageBox.Show("滾輪向后滾動");}}
在具體應用中將MessageBox替換為要實現的功能即可。