設置 | 登錄 | 註冊

作者共發了1篇帖子。

【解決辦法】在Win32窗口程序中,當主窗口中的控制項(子窗口)獲得焦點時,快捷鍵無效的解決辦法

1樓 巨大八爪鱼 2016-1-23 16:33
【症狀】
以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;
//......
}

內容轉換:

回覆帖子
內容:
用戶名: 您目前是匿名發表。
驗證碼:
看不清?換一張
©2010-2025 Purasbar Ver3.0 [手機版] [桌面版]
除非另有聲明,本站採用知識共享署名-相同方式共享 3.0 Unported許可協議進行許可。