
![]() 图一、屏幕抓图程序界面效果图 |
| #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 ); } |
| BOOL __declspec(dllexport)__stdcall AddHotkey(HWND,UCHAR key,UCHAR mask); BOOL __declspec(dllexport)__stdcall DeleteHotkey(HWND,UCHAR key,UCHAR mask); |
| LRESULT CCaptureDlg::WindowProc(UINT message, WPARAM wParam, LPARAM lParam) { if(message==WM_HOTKEY&&lParam==WM_KEYDOWN) { //lParam表示是按下还是松开,如果有多个热键,由wParam来区分 SaveBmp(); return FALSE; } …… //其它处理及默认处理 } |
| 关于我们 | 联系我们 | 广告服务 | 工作机会 | 版权声明 | 欢迎投稿 | 网站地图 |
| Copyright © 2000-2008 , www.21tx.com , All Rights Reserved . |
| © 晨新科技 版权所有 Created by TXSite.net |