在編寫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替換爲要實現的功能即可。
該博客對應的實例下載地址爲:http://download.csdn.net/detail/mushao999/8184585