程式設計知識: 讀取任意視窗下使用者的鍵盤輸入(熱鍵 Alt+L的實作) by 井民全 標準處理程序 // Step 1: 處理視窗訊息 BEGIN_MESSAGE_MAP(JPictureControl, JAnyShapeControl) ON_MESSAGE(WM_HOTKEY,OnHotKey) END_MESSAGE_MAP() // Step 2: 當使用者按下熱鍵後的處理程序 LRESULT JPictureControl::OnHotKey(WPARAM wParam, LPARAM lParam){ TCHAR HotKeys=HIWORD(lParam); int CombinationKey=LOWORD(lParam); if(MOD_ALT==CombinationKey && HotKeys==m_HotKey_BringToTop){ .... } return TRUE; } // Step 3: 向系統登入熱鍵 BOOL bOk=RegisterHotKey(this->m_hWnd, 1234, MOD_ALT, _T('L')); // Step 4: 解除熱鍵 UnregisterHotKey(this->m_hWnd, 1234); ============================================= 下面是 舊的處理 不穩定 ===================== 關鍵片段: GetKeyState Knowledge Requirement: multi-thread Windows progrmaming 1. Windows 下啟動一個 working thread 主要指令 AfxBeginThread(Listen_AltD_Key_ThreadFun,NULL); // 啟動 Alt+L 按鍵的 Listen Thread 2. thread 主程式 (隨時監控使用者是否按下 Alt+L, 若使用者按下則自動將 Help 視窗帶到前面來) // Thread function 的部分 UINT Listen_AltL_Key_ThreadFun(LPVOID LParam){ WINDOWINFO info; do{ SHORT AltState=GetKeyState(VK_MENU); // Alt 的狀態 bool bAltDown=(AltState & 0x8000) > 0; SHORT LKeyState=GetKeyState(0x4C); // L Virtual Key 的狀態 bool bLKeyDown=(LKeyState & 0x8000) > 0; // 當兩個 Key 同時被按下的時的偵測 if(bAltDown && bLKeyDown){ int kk=0; // <=========== kk++; } SleepEx(100,true); }while(true); return(0); } // end of 隨時監控使用者是否按下 Alt+L 進一步資料: ms-help://MS.MSDNQTR.2004JAN.1033/winui/winui/windowsuserinterface/userinput/keyboardinput/keyboardinputreference/keyboardinputfunctions/getkeystate.htm