一个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组合拦截不到,还是会被切换,这是系统组合键。