如果说只是提供实现代码,那真的是不知道写一篇文章。我在此只是想提醒广大的程序员朋友,重视基础知识,不然还要浪费不少时间!
【键盘上的F10菜单功能键】
系统的F1到F12的十二个按键之中,F10这个按键比较特别。F10按键已经被御用了,被当做了系统按键。而其他十一个按键,都是普通的按键。如果你只是使用普通方法去拦截和屏蔽F10,是不是太不把F10当做一回事了。人家是何等身份,就用对待普通F键的方式就搞定了,那还叫什么系统按键!普通的按键的拦截和屏蔽,都可以通过WM_KEYDOWN消息即可做到。通过获取wParam参数中的虚拟键码,比对一下即可。如果是对应的按键按下,你只需要返回0即(return 0;)即可实现屏蔽。而在返回之前,你执行的代码,就可以由你定。那么这样你就可以定制你自己的F系列按键的功能了。只要你返回0,系统就认为你已经处理好了这个按键的响应,系统就不再处理了。
然而F10属于系统键,所以通过WM_KEYDOWN是得不到这个键的处理过程的。按下F10键,触发的消息根本就不是WM_KEYDOWN,有些人却苦苦在这个消息里把代码改来改去。
既然是系统键,走的自然是系统键的通道。其实就是WM_SYSKEYDOWN这个消息。然后你通过虚拟键码来拦截屏蔽即处理这个按键的消息即可。这样你就轻松屏蔽了F10按键。
当然,你在WM_SYSKEYDOWN中处理非F10的F系列的按键,那也是没有用的。道理是想通的,不同身份的人走的通道是不一样的,所以只有在正确的通道拦截对应的消息才奏效。
由此,F10的拦截和屏蔽,真是分分钟的事情,然而一直困扰着大量的程序员!我也是学了这些基础知识之后,才越来越明白,基础真的很重要!
下面是拦截屏蔽F1-F12以及屏蔽F10的代码:
case WM_SYSKEYDOWN:
switch(wParam)
{
case VK_F10://无法拦截
MessageBox(hwnd,_T("F10"),_T(""),0);
return 0;
}
case WM_KEYDOWN:
case VK_F1:
case VK_F2:
case VK_F3:
case VK_F4:
case VK_F5:
case VK_F6:
case VK_F7:
case VK_F8:
case VK_F9:
case VK_F11:
case VK_F12:
return 0;
明白了吗?不管是win32还是MFC还是QT,在Windows上,就只要这样处理两个消息就拦截了。至于不同的类库提供不同的方式来实现,最终都是这样处理的。