一個winform,如果想讓上面的控件處理普通按鍵,那麼keyup keydown就行了,但是特殊按鍵就不行了,比如tab ,按下後就會在form上的控件間來回切換焦點,上下左右箭頭也不行,要麼會自動滾動條,要麼就在能接收上下按鍵的控件比如combobox上處理。或者按下alt+f4,窗體直接就關閉了。
總之我想要的是,窗體只接收按鍵,我自己處理,窗體和控件不處理。
最後找到了一個好辦法,一個外國人說的。
首先加上如
public partial class Form1 : Form,IMessageFilter
然後在form的構造函數加上,如
public Form1()
{
Application.AddMessageFilter(this);
InitializeComponent();
}
然後加上
const int WM_KEYDOWN = 0x100;
const int WM_SYSKEYDOWN = 0x104;
const int WM_KEYUP = 0x101;
const int WM_SYSKEYUP = 0x105;
public bool PreFilterMessage(ref Message m)
{
if (m.Msg == WM_KEYDOWN || m.Msg == WM_KEYUP || m.Msg == WM_SYSKEYDOWN || m.Msg == WM_SYSKEYUP)
{
//你的處理代碼
return true;
}
else
return false;
}
這樣窗體上的控件就不響應按鍵了,你就可以在“你的處理代碼”那裏添加自己的處理方法了。
我試了一下
1、整個鍵盤所有鍵都可以攔截到按下和擡起的消息,只有一個print鍵,只能響應到擡起,按下收不到。
2、alt+f4不再關閉窗體了
3、alt鍵被稱爲menu
4、alt+tab和ctrl+alt+del組合攔截不到,還是會被切換,這是系統組合鍵。