添加链接
link之家
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接
WM_KEYDOWN和WM_CHAR都是键盘消息。TranslateMessage函数已经将按键消息转换成字符消息了,那么WndProc函数中需要对事件进行选择。如:键入“D”键,就应该选择WM_CHAR,因为WM_CHAR 只是字母,不包含特殊字符如Ctrl等。
如果键盘键入的是“Ctrl+D”,则应该选择WM_KEYDOWN,因为WM_KEYDOWN既包含字母也包含特殊字符。
WM_CHAR是由WM_KEYDOWN消息Translate()之后产生的,然后再发送给窗口过程。例如按下“D”键,产生WM_KEYDOWN消息,此消息经过Translate()处理后变成了WM_KEYDOW、WM_CHAR两个消息传递给窗口过程。

而WM_SYSKEYDOWN是接受快捷键或系统命令按键的,像Alt键就是。所以捕获Alt键时,在WM_KEYDOWN下是无效的,要在WM_SYSKEYDOWN中。Ctrl和shift不属于WM_SYSKEYDOWN。

键盘消息的处理从PreProcessMessage方法开始,按下表所述的逻辑顺序进行。(了解这个过程或许有助于对上面三个消息的理解) 方法 说明 结果
ProcessCmdKey 此方法检查按键是否为命令键,例如快捷键或菜单快捷键 如果方法返回true,则将不调度键消息,而且将不发生键事件
如果方法返回false,则将调用IsInputKey检查该键是否为常规输入键
IsInputKey 此方法检查按键是否为常规输入键 如果方法返回true,则表示该键为常规字符,将调用ProcessKeyMessage进行消息处理
如果方法返回false,则将调用ProcessDialogKey
ProcessDialogKey 此方法检查按键是否为导航键,例如Esc、Tab、回车键或箭头键。
如果该控件不处理该键,则将调用基控件或父控件的ProcessDialogKey,直至层次结构中的最顶端控件。 如果此方法返回true,则完成消息预处理,而且将不生成键事件
如果此方法返回false,则将调用ProcessKeyMessage进行消息处理
ProcessKeyMessage 此方法处理由控件的WndProc方法接收的所有键盘消息 如果控件有父级,则调用父级的ProcessKeyPreview
如果控件没有父级或父级的ProcessKeyPreview不处理该消息,则调用ProcessKeyEventArgs

ProcessKeyPreview 此方法将键盘消息发送到控件的父控件 如果此方法返回true,则将不发生键事件
如果此方法返回false,则将调用ProcessKeyEventArgs
ProcessKeyEventArgs 此方法引发KeyDown事件

BOOL CHBPlayerApp::PreTranslateMessage(MSG* pMsg)
{
// TODO: Add your specialized code here and/or call the base class
if (pMsg->message == WM_KEYDOWN)
{
switch (pMsg->wParam)
{

//屏蔽Esc消息
case VK_ESCAPE:
return true;
break;

//屏蔽回车键消息
case VK_RETURN:
return true;
break;

//组合键Ctrl+C
case 'C':
if(::GetKeyState(VK_CONTROL) < 0)
{
}
break;

//组合键Ctrl+Shift+S
case 'S':
if((::GetKeyState(VK_CONTROL) < 0) && (::GetKeyState(VK_SHIFT) < 0))
{
}
return CWinApp::PreTranslateMessage(pMsg);
}

在对话框中添加键盘响应事件

1. ClassView中Add Windows Message Handle 添加WM-KEYDOWN和WM-KEYUP,Add Virtural Functions添加PreTranslateMessage

2.         BOOL **Dlg::PreTranslateMessage(MSG* pMsg)中添加

if (pMsg-> message == WM_KEYDOWN)

if(pMsg-> wParam== VK_RETURN)//直接用虚码代替就可以响应所指键

SetInfo(WDK_OK);      //回车对应ok

if (pMsg-> message == WM_KEYDOWN)

if(pMsg-> wParam== VK_BACK)//直接用虚码代替就可以响应所指键

SetInfo(WDK_C);         //backspace对应删除

return CDialog::PreTranslateMessage(pMsg);

3. 组合键的用法:(本例响应Ctrl+X键)

BOOL CMydilog::PreTranslateMessage(MSG* pMsg)

if (pMsg-> message == WM_KEYDOWN)

switch (pMsg-> wParam)

case VK_ESCAPE:

SetFocus ();

return TRUE;

case 'X':

if(::GetKeyState(VK_CONTROL) < 0

MessageBox(" hello" );

return TRUE;

return CDialog::PreTranslateMessage(pMsg);


F10 and ALT arent picked up by WM_KEYDOWN, you need WM_SYSKEYDOWN.
You need to add: case WM_SYSKEYDOWN:
if(pMsg->wParam == VK_F10)
TRACE("F10/n");
break ;

WM_KEYDOWN和WM_CHAR都是键盘消息。TranslateMessage函数已经将按键消息转换成字符消息了,那么WndProc函数中需要对事件进行选择。如:键入“D”键,就应该选择WM_CHAR,因为WM_CHAR 只是字母,不包含特殊字符如Ctrl等。如果键盘键入的是“Ctrl+D”,则应该选择WM_KEYDOWN,因为WM_KEYDOWN既包含字母也包含特殊字符。
通过这两个 消息 可以模拟键盘事件。 相关函数: MapVirtualKey: The MapVirtualKey function translates (maps) a virtual-key code into a scan code or character value, or translates a scan code into a virtual-key code. VkKeyS...
The virtual-key code of the nonsystem key. See Virtual-Key Codes. Virtual-Key Codes.虚拟按键编码,表示哪个键被按下 lParam The r...
在Windows编程中, WM_KEYDOWN 是一种Windows 消息 ,它表示用户按下了一个键盘上的键。 WM_KEYDOWN 可以用来处理各种键盘事件和快捷键。当用户按下一个键时,应用程序会收到一个 WM_KEYDOWN 消息 ,并且可以查看wParam和lParam参数来确定哪个键被按下。 处理组合键时,通常在 WM_KEYDOWN 消息 处理程序中使用GetKeyState函数来确定是否同时按下了其他键。GetKeyState可以返回一个值,表示某个键当前是按下的还是弹起的状态。如果同时按下了其他键,可以使用该函数来检查相应的状态,并根据需要进行处理。 例如,如果要处理Ctrl + C快捷键,可以在 WM_KEYDOWN 消息 处理程序中检查Ctrl键是否按下,然后检查C键是否按下。如果两个键都按下了,就可以执行复制操作。类似地,可以在 WM_KEYDOWN 消息 处理程序中处理其他所有的组合键。 总的来说, WM_KEYDOWN 是Windows编程中非常有用和常见的一种 消息 ,它可以用来处理键盘事件和各种快捷键,包括组合键。处理组合键需要注意一些细节,但只要熟练掌握 WM_KEYDOWN 和相关函数,可以轻松实现各种键盘操作和快捷键功能。