【症状】
以ListView控件为例。在Win32中默认的窗口中用CreateWindow创建一个ListView子窗口。运行程序,发现刚开始的时候快捷键是有反应的,但是一旦鼠标指针点了那个ListView的内部,快捷键就再也没有反应了。
【解决办法】
在WinMain函数中的消息循环中,将TranslateAccelerator后面的第一个参数msg.hwnd改为hWnd(也就是消息循环前用CreateWindow创建主窗口时返回的句柄)。
如图所示:
这是我的快捷键表。运行程序经过测试,无论是普通快捷键还是带Ctrl或Alt的快捷键都是有效的。
所有的快捷键都是关联菜单ID,而不是关联默认创建的ID_ACCELERATOR32805之类的快捷键ID。
不过对于ListView来说,如果启用了EditLabel的话,就最好不要在快捷键中加入单独的回车键(不带Ctrl或Alt那种),否则会影响编辑框对回车键的响应。如果要用回车键打开项目的话,最好在ListView控件对应的LVN_KEYDOWN通知中单独对回车键进行处理。当标签编辑模式下按下回车键,ListView并不会发送LVN_KEYDOWN通知,而如果是普通模式下按下回车键则会发送LVN_KEYDOWN通知。
例如:
switch (uMsg)
{
//...
case WM_NOTIFY:
{
LPNMHDR header = (LPNMHDR)lParam;
if (header->code == LVN_KEYDOWN)
{
LPNMLVKEYDOWN pnkd = (LPNMLVKEYDOWN)lParam;
if (pnkd->wVKey == VK_RETURN)
pWndCls->EditItem(); // 当按下回车键时,如果ListView未处于重命名模式,则打开编辑对话框
}
return false;
}
break;
//......
}