以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;
//......
}