MFC给窗口上的按钮控件添加快捷键,MFC键盘消息处理

首先在类视图中找到要响应的窗口类,然后右键-->属性-->重写中找到PreTranslateMessage,如下图所示:

 

 

接着,在PreTranslateMessage()函数中判断键值,并响应事件:

BOOL CSerialPortDlg::PreTranslateMessage(MSG* pMsg)
{
	//先判断是否是键盘输入消息
	if (pMsg->message == WM_KEYDOWN) 
	{
		int nkeyDown = pMsg->wParam;
		SHORT nkeyState = GetKeyState(VK_CONTROL); // ctrl键的状态获取
		
		if (nkeyDown == 83 && nkeyState) // 83是S的ASCII码值,代表键盘S键
			OnBnClickedBtSenddata(); // 调相应的按钮事件

		if (nkeyDown == 79 && nkeyState) // 79是字母O的ASCII码值
			OnBnClickedBtOnoff();
	}	

	return CDialog::PreTranslateMessage(pMsg);
}

/*==============================================================================================*/

                                        重要API:GetKeyState

/*==============================================================================================*/

 

对键盘消息的处理有一个重要的API:GetKeyState()

①函数原型:

    SHORT GetKeyState(int nVirtKey);

②参数:

    nVrtKey:键值。若要求的虚拟键是字母或数字(A~Z,a~z或0~9),nVirtKey必须被置为相应字符的ASCII码值,对于其他的键,nVirtKey必须是一虚拟键码。若使用非英语键盘布局,则取值在ASCIIa~z和0~9的虚拟键被用于定义绝大多数的字符键。例如,对于德语键盘格式,值为ASCII0(OX4F)的虚拟键指的是"0"键,而VK_OEM_1指"带变音的0键"。

③返回值:
    返回值给出了给定虚拟键的状态,状态如下:
    (a)若高序位为1,则键处于DOWN状态,否则为UP状态。

        如:BYTE Caps_Lock = LOBYTE(GetKeyState(VK_CAPITAL));  if (Caps_Lock)来判断指示灯亮与灭。
    (b)若低序位为1,则键被触发。例如CAPS LOCK键,被找开时将被触发。若低序位置为0,则键被关闭,且不被触发。触发键在键盘上的指示灯,当键被触发时即亮,键不被触发时即灭。

        如:BYTE Num_Lock = HIBYTE(GetKeyState(VK_CAPTITAL));  if (Num_Lock)来判断按下和弹起状态。

④使用方法:

    (a)判断指示灯亮灭用LOBYTE(GetKeyState());

    (b)判断键按下与弹起用HIBYTE(GetKeyState())

⑤说明:

     (a)此函数只能在PreTranslateMessage消息中响应,不能在WM_KEYDOWN和WM_CHAR消息中响应。

     (b) 指示灯亮灭主要用于NumLock键和CapsLock键。即数字键盘开关和大小写切换。

     (c)键按下与弹起可使用与任何键,比如Shift和Ctrl键等。

⑥代码示例:

BOOL CSerialPortDlg::PreTranslateMessage(MSG* pMsg)
{
	switch ( pMsg->message )
	{
	case WM_KEYDOWN: // 键按下
		if (pMsg->wParam == 'C')
		{
			if ( !LOBYTE(GetKeyState(20)) ) // 20:CapsLock键
			{
				if ( HIBYTE(GetKeyState(16)) )
					MessageBox("键按下,Caps指示灯灭时同时按住Shift键和C键,输入大写C");
				else
					MessageBox("键按下,Caps指示灯灭时,按下C键,输入小写c");
			}
		}
		break;

	case WM_KEYUP: // 键弹起
		if (pMsg->wParam == 'B')
		{
			if ( LOBYTE(GetKeyState(20)) )
				MessageBox("键弹起,输入大写B");
			else
				MessageBox("键弹起,输入小写b");
		}
		break;

	case WM_LBUTTONDOWN: // 鼠标左键按下
		if ( LOBYTE(GetKeyState(20)) )
			MessageBox("Caps指示灯亮,且鼠标左键按住");
		break;

	case WM_MOUSEWHEEL: // 鼠标滚轮
		MessageBox("鼠标滚轮");
		break;

	default:
		break;
	}//switch
}

 

/*==============================================================================================*/

                                                 键值

/*==============================================================================================*/

键盘键值如下图所示:

 

OK,接下来看看VS键的宏定义:

#ifndef NOVIRTUALKEYCODES

/*
 * Virtual Keys, Standard Set
 */
#define VK_LBUTTON        0x01	// 鼠标左键
#define VK_RBUTTON        0x02	// 鼠标右键
#define VK_CANCEL         0x03	// CANCEl键
#define VK_MBUTTON        0x04    /* NOT contiguous with L & RBUTTON */ // 鼠标中键

#if(_WIN32_WINNT >= 0x0500)
#define VK_XBUTTON1       0x05    /* NOT contiguous with L & RBUTTON */
#define VK_XBUTTON2       0x06    /* NOT contiguous with L & RBUTTON */
#endif /* _WIN32_WINNT >= 0x0500 */

/*
 * 0x07 : unassigned
 */

#define VK_BACK           0x08	// BackSpace退格键
#define VK_TAB            0x09	// Tab键

/*
 * 0x0A - 0x0B : reserved
 */

#define VK_CLEAR          0x0C	// Clear键
#define VK_RETURN         0x0D	// 回车键(Enter键,非小键盘)

#define VK_SHIFT          0x10	// Shift键
#define VK_CONTROL        0x11	// Ctrl键
#define VK_MENU           0x12	// Menu键
#define VK_PAUSE          0x13	// Pause键
#define VK_CAPITAL        0x14	// CapsLock键

#define VK_KANA           0x15
#define VK_HANGEUL        0x15  /* old name - should be here for compatibility */
#define VK_HANGUL         0x15
#define VK_JUNJA          0x17
#define VK_FINAL          0x18
#define VK_HANJA          0x19
#define VK_KANJI          0x19

#define VK_ESCAPE         0x1B	// ESC键

#define VK_CONVERT        0x1C
#define VK_NONCONVERT     0x1D
#define VK_ACCEPT         0x1E
#define VK_MODECHANGE     0x1F

#define VK_SPACE          0x20	// Space键(空格)
#define VK_PRIOR          0x21	// PageUp键(PgUp)
#define VK_NEXT           0x22	// PageDown键(PgDn)
#define VK_END            0x23	// End键
#define VK_HOME           0x24	// Home键
#define VK_LEFT           0x25	// 左方向键 ←
#define VK_UP             0x26	// 上方向键 ↑
#define VK_RIGHT          0x27	// 右方向键 →
#define VK_DOWN           0x28	// 下方向键 ↓
#define VK_SELECT         0x29	// Select键
#define VK_PRINT          0x2A	// PrintScreen键(PrtSc)
#define VK_EXECUTE        0x2B	// Execute键
#define VK_SNAPSHOT       0x2C	// SnapShot键
#define VK_INSERT         0x2D	// Insert键
#define VK_DELETE         0x2E	// Delete键
#define VK_HELP           0x2F	// Help键

/*
 * VK_0 - VK_9 are the same as ASCII '0' - '9' (0x30 - 0x39)
 * 0x40 : unassigned
 * VK_A - VK_Z are the same as ASCII 'A' - 'Z' (0x41 - 0x5A)
 */

#define VK_LWIN           0x5B
#define VK_RWIN           0x5C
#define VK_APPS           0x5D

/*
 * 0x5E : reserved
 */

#define VK_SLEEP          0x5F

#define VK_NUMPAD0        0x60	// 数字键盘 0
#define VK_NUMPAD1        0x61	// 数字键盘 1
#define VK_NUMPAD2        0x62	// 数字键盘 2
#define VK_NUMPAD3        0x63	// 数字键盘 3
#define VK_NUMPAD4        0x64	// 数字键盘 4
#define VK_NUMPAD5        0x65	// 数字键盘 5
#define VK_NUMPAD6        0x66	// 数字键盘 6
#define VK_NUMPAD7        0x67	// 数字键盘 7
#define VK_NUMPAD8        0x68	// 数字键盘 8
#define VK_NUMPAD9        0x69	// 数字键盘 9
#define VK_MULTIPLY       0x6A	// 数字键盘 *
#define VK_ADD            0x6B	// 数字键盘 +
#define VK_SEPARATOR      0x6C	// 数字键盘 Enter回车
#define VK_SUBTRACT       0x6D	// 数字键盘 -
#define VK_DECIMAL        0x6E	// 数字键盘 .
#define VK_DIVIDE         0x6F	// 数字键盘 /
#define VK_F1             0x70	// F1
#define VK_F2             0x71	// F2
#define VK_F3             0x72	// F3
#define VK_F4             0x73	// F4
#define VK_F5             0x74	// F5
#define VK_F6             0x75	// F6
#define VK_F7             0x76	// F7
#define VK_F8             0x77	// F8
#define VK_F9             0x78	// F9
#define VK_F10            0x79	// F10
#define VK_F11            0x7A	// F11
#define VK_F12            0x7B	// F12
#define VK_F13            0x7C	// F13
#define VK_F14            0x7D	// F14
#define VK_F15            0x7E	// F15
#define VK_F16            0x7F	// F16
#define VK_F17            0x80	// F17
#define VK_F18            0x81	// F18
#define VK_F19            0x82	// F19
#define VK_F20            0x83	// F20
#define VK_F21            0x84	// F21
#define VK_F22            0x85	// F22
#define VK_F23            0x86	// F23
#define VK_F24            0x87	// F24

/*
 * 0x88 - 0x8F : unassigned
 */

#define VK_NUMLOCK        0x90	// NumLock键(NmLk)
#define VK_SCROLL         0x91	// ScrollLock键(ScrLk)

/*
 * NEC PC-9800 kbd definitions
 */
#define VK_OEM_NEC_EQUAL  0x92   // '=' key on numpad

/*
 * Fujitsu/OASYS kbd definitions
 */
#define VK_OEM_FJ_JISHO   0x92   // 'Dictionary' key
#define VK_OEM_FJ_MASSHOU 0x93   // 'Unregister word' key
#define VK_OEM_FJ_TOUROKU 0x94   // 'Register word' key
#define VK_OEM_FJ_LOYA    0x95   // 'Left OYAYUBI' key
#define VK_OEM_FJ_ROYA    0x96   // 'Right OYAYUBI' key

/*
 * 0x97 - 0x9F : unassigned
 */

/*
 * VK_L* & VK_R* - left and right Alt, Ctrl and Shift virtual keys.
 * Used only as parameters to GetAsyncKeyState() and GetKeyState().
 * No other API or message will distinguish left and right keys in this way.
 */
#define VK_LSHIFT         0xA0
#define VK_RSHIFT         0xA1
#define VK_LCONTROL       0xA2
#define VK_RCONTROL       0xA3
#define VK_LMENU          0xA4
#define VK_RMENU          0xA5

#if(_WIN32_WINNT >= 0x0500)
#define VK_BROWSER_BACK        0xA6
#define VK_BROWSER_FORWARD     0xA7
#define VK_BROWSER_REFRESH     0xA8
#define VK_BROWSER_STOP        0xA9
#define VK_BROWSER_SEARCH      0xAA
#define VK_BROWSER_FAVORITES   0xAB
#define VK_BROWSER_HOME        0xAC

#define VK_VOLUME_MUTE         0xAD
#define VK_VOLUME_DOWN         0xAE
#define VK_VOLUME_UP           0xAF
#define VK_MEDIA_NEXT_TRACK    0xB0
#define VK_MEDIA_PREV_TRACK    0xB1
#define VK_MEDIA_STOP          0xB2
#define VK_MEDIA_PLAY_PAUSE    0xB3
#define VK_LAUNCH_MAIL         0xB4
#define VK_LAUNCH_MEDIA_SELECT 0xB5
#define VK_LAUNCH_APP1         0xB6
#define VK_LAUNCH_APP2         0xB7

#endif /* _WIN32_WINNT >= 0x0500 */

/*
 * 0xB8 - 0xB9 : reserved
 */

#define VK_OEM_1          0xBA   // ';:' for US
#define VK_OEM_PLUS       0xBB   // '+' any country
#define VK_OEM_COMMA      0xBC   // ',' any country
#define VK_OEM_MINUS      0xBD   // '-' any country
#define VK_OEM_PERIOD     0xBE   // '.' any country
#define VK_OEM_2          0xBF   // '/?' for US
#define VK_OEM_3          0xC0   // '`~' for US

/*
 * 0xC1 - 0xD7 : reserved
 */

/*
 * 0xD8 - 0xDA : unassigned
 */

#define VK_OEM_4          0xDB  //  '[{' for US
#define VK_OEM_5          0xDC  //  '\|' for US
#define VK_OEM_6          0xDD  //  ']}' for US
#define VK_OEM_7          0xDE  //  ''"' for US
#define VK_OEM_8          0xDF

/*
 * 0xE0 : reserved
 */

/*
 * Various extended or enhanced keyboards
 */
#define VK_OEM_AX         0xE1  //  'AX' key on Japanese AX kbd
#define VK_OEM_102        0xE2  //  "<>" or "\|" on RT 102-key kbd.
#define VK_ICO_HELP       0xE3  //  Help key on ICO
#define VK_ICO_00         0xE4  //  00 key on ICO

#if(WINVER >= 0x0400)
#define VK_PROCESSKEY     0xE5
#endif /* WINVER >= 0x0400 */

#define VK_ICO_CLEAR      0xE6


#if(_WIN32_WINNT >= 0x0500)
#define VK_PACKET         0xE7
#endif /* _WIN32_WINNT >= 0x0500 */

/*
 * 0xE8 : unassigned
 */

/*
 * Nokia/Ericsson definitions
 */
#define VK_OEM_RESET      0xE9
#define VK_OEM_JUMP       0xEA
#define VK_OEM_PA1        0xEB
#define VK_OEM_PA2        0xEC
#define VK_OEM_PA3        0xED
#define VK_OEM_WSCTRL     0xEE
#define VK_OEM_CUSEL      0xEF
#define VK_OEM_ATTN       0xF0
#define VK_OEM_FINISH     0xF1
#define VK_OEM_COPY       0xF2
#define VK_OEM_AUTO       0xF3
#define VK_OEM_ENLW       0xF4
#define VK_OEM_BACKTAB    0xF5

#define VK_ATTN           0xF6
#define VK_CRSEL          0xF7
#define VK_EXSEL          0xF8
#define VK_EREOF          0xF9
#define VK_PLAY           0xFA
#define VK_ZOOM           0xFB
#define VK_NONAME         0xFC
#define VK_PA1            0xFD
#define VK_OEM_CLEAR      0xFE

/*
 * 0xFF : reserved
 */


#endif /* !NOVIRTUALKEYCODES */

另外呢,主键盘区域(非小键盘)的A-Z字母与0-9键值与相应字母和数字的ASCII码相同。

A-Z及0-9的ASCII码值
描述ANSII码值
A65
B66
C67
D68
E69
F70
G71
H72
I73
J74
K75
L76
M77
N78
O79
P80
Q81
R82
S83
T84
U85
V86
W87
X88
Y89
Z90
048
149
250
351
452
553
654
755
856
957

 

已标记关键词 清除标记
©️2020 CSDN 皮肤主题: 技术黑板 设计师:CSDN官方博客 返回首页