| #pragma data_seg("shareddata") HHOOK hHook =NULL; //钩子句柄 UINT nHookCount =0; //挂接的程序数目 static UCHAR HotKey[MAX_KEY] = {0}; //热键虚拟键码 static UCHAR HotKeyMask[MAX_KEY] = {0}; //组合掩码, control=4,alt=2,shift=1 static HWND hCallWnd[MAX_KEY] = {0}; //window handle associated with hotkey static int KeyCount =0; static UCHAR MaskBits =0; //00000 Ctrl=4 & Alt=2 & Shift=1 #pragma data_seg() |
| BOOL __declspec(dllexport) __stdcall AddHotkey(HWND hWnd,UCHAR cKey,UCHAR cMask) { BOOL bAdded=FALSE; for(int index=0;index<MAX_KEY;index++){ if(hCallWnd[index]==0){ hCallWnd[index]=hWnd; HotKey[index]=cKey; HotKeyMask[index]=cMask; bAdded=TRUE; KeyCount++; break; } } return bAdded; } //删除热键 BOOL __declspec(dllexport) __stdcall DeleteHotkey(HWND hWnd, UCHAR cKey,UCHAR cMask) { BOOL bRemoved=FALSE; for(int index=0;index<MAX_KEY;index++){ if(hCallWnd[index]==hWnd){ if(HotKey[index]==cKey&&HotKeyMask[index]==cMask){ hCallWnd[index]=NULL; HotKey[index]=0; HotKeyMask[index]=0; bRemoved=TRUE; KeyCount--; break; } } } return bRemoved; } |
| LRESULT CALLBACK KeyboardProc(int nCode,WPARAM wParam,LPARAM lParam) { BOOL bProcessed=FALSE; if(HC_ACTION==nCode) { if((lParam&0xc0000000)==0xc0000000){// 有键松开 switch(wParam) { case VK_MENU: MaskBits&=~ALTBIT; break; case VK_CONTROL: MaskBits&=~CTRLBIT; break; case VK_SHIFT: MaskBits&=~SHIFTBIT; break; default: //judge the key and send message break; } for(int index=0;index<MAX_KEY;index++){ if(hCallWnd[index]==NULL) continue; if(IsWindow(hCallWnd[index])&&(HotKey[index]==wParam)&&(HotKeyMask[index]==MaskBits)) { SendMessage(hCallWnd[index],WM_HOTKEY,wParam,WM_KEYUP); bProcessed=TRUE; } } } else if((lParam&0xc000ffff)==1){ //有键按下 switch(wParam) { case VK_MENU: MaskBits|=ALTBIT; break; case VK_CONTROL: MaskBits|=CTRLBIT; break; case VK_SHIFT: MaskBits|=SHIFTBIT; break; default: //judge the key and send message break; } for(int index=0;index<MAX_KEY;index++){ if(hCallWnd[index]==NULL) continue; if(IsWindow(hCallWnd[index])&&(HotKey[index]==wParam)&&(HotKeyMask[index]==MaskBits)) { SendMessage(hCallWnd[index],WM_HOTKEY,wParam,WM_KEYDOWN); bProcessed=TRUE; } } } if(!bProcessed){ //一般按键事件,为监视键盘的程序留出余地 for(int index=0;index<MAX_KEY;index++){ if(hCallWnd[index]==NULL) continue; if(IsWindow(hCallWnd[index])&&(HotKey[index]==0)&&(HotKeyMask[index]==0)) SendMessage(hCallWnd[index],WM_HOTKEY,WM_HOTKEY,lParam); //lParam的意义可看MSDN中WM_KEYDOWN部分 } } } return CallNextHookEx( hHook, nCode, wParam, lParam ); } |
【中国下载站】【设为主页】【收藏本页】【打印本文】【回到顶部】【关闭此页】