void Status_OnRButtonDown(HWND hWnd,WPARAM wParam,LPARAM lParam) { HMENU hMenu=LoadMenu(hInst,(LPCSTR)IDR_MENU); HMENU hSubMenu=GetSubMenu(hMenu,0); int cmd; POINT pt; GetCursorPos(&pt); cmd=TrackPopupMenu(hSubMenu,TPM_LEFTBUTTON|TPM_RETURNCMD,pt.x,pt.y,0,hWnd,NULL); //判断选中那个菜单 switch(cmd) { case IDM_SETTING: DoPropertySheet(hWnd); break; case IDM_EXIT: { AssPrint("Select Exit "); UnInstallHook(); ExitProcess(0); } break; case IDM_HELP: { ShellExecute(hWnd,"open","help.chm",NULL,NULL,SW_NORMAL); } break; default: break; } }
///////////////////////////////////// DllMain 函数 ///////////////////////////////////////// //dll的入口点 BOOL APIENTRY DllMain( HMODULE hModule, DWORD ul_reason_for_call, LPVOID lpReserved ) { switch(ul_reason_for_call) { case DLL_PROCESS_ATTACH: //if(sHook) case DLL_PROCESS_DETACH: UnInstallHook(); break; } hmodDll=hModule; return TRUE; }
//////////////////////////////////// InstallHook 函数 ///////////////////////////////////// //安装或卸载钩子,BOOL IsHook参数是标志位 //对要钩哪个API函数进行初始化 //我们这里装的钩子类型是WH_GETMESSAGE void __declspec(dllexport) WINAPI InstallHook(BOOL IsHook,DWORD dwThreadId) { if(IsHook) { hHook=SetWindowsHookEx(WH_GETMESSAGE,(HOOKPROC)GetMsgProc,hmodDll,dwThreadId); //GetProcAddress(GetModuleHandle("GDI32.dll"),"ExtTextOutA"):取得要钩的函数在所在dll中的地址 HookAllAPI("GDI32.dll",GetProcAddress(GetModuleHandle("GDI32.dll"), "TextOutW"),(PROC)&H_TextOutW,NULL); HookAllAPI("GDI32.dll",GetProcAddress(GetModuleHandle("GDI32.dll"), "TextOutA"),(PROC)&H_TextOutA,NULL); } else { UnInstallHook(); UnhookAllAPIHooks("GDI32.dll",GetProcAddress(GetModuleHandle("GDI32.dll"), "TextOutW"),(PROC)&H_TextOutW,NULL); UnhookAllAPIHooks("GDI32.dll",GetProcAddress(GetModuleHandle("GDI32.dll"), "TextOutA"),(PROC)&H_TextOutA,NULL); } }
extern "C" _declspec (dllexport) VOID InstallHook(HWND winhandle) { UnInstallHook(); DWORD threadId = GetWindowThreadProcessId(winhandle,NULL); g_hook = SetWindowsHookEx(WH_GETMESSAGE,(HOOKPROC)GetMsgPro,ModuleFromAdress(PlaceHolder),threadId); }
LRESULT CALLBACK StatusWndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) { PAINTSTRUCT ps; HDC hdc; switch (message) { case WM_CREATE: { Status_OnCreate(); } break; case WM_PAINT: { hdc = BeginPaint(hWnd, &ps); Status_OnPaint(hWnd,ps.hdc); EndPaint(hWnd, &ps); } break; case WM_SETCURSOR: { Status_OnCaptureMouse(hWnd,wParam,lParam); } break; case WM_LBUTTONUP: { Status_OnLButtonUp(hWnd,wParam,lParam); } break; case WM_RBUTTONDOWN: { Status_OnRButtonDown(hWnd,wParam,lParam); } break; case WM_MOUSEMOVE: { Status_OnMouseMove(); } break; case WM_KEYDOWN: { Status_OnKeyDown(hWnd,message,wParam,lParam); } break; case WM_HOTKEY: { bSwitchOn=!bSwitchOn; if (bSwitchOn) { InstallHook(); dwType=dwType&~TYPE_YINGYU; dwType|=TYPE_ZHONGWEN; } else { UnInstallHook(); //改变状态栏的 中 英 选项 dwType=dwType&~TYPE_ZHONGWEN; dwType|=TYPE_YINGYU; //隐藏输入窗口 INPUTWNDSTRUCT.bShow=FALSE; UpdateInputWnd(); } HDC hdc=GetDC(hStatus); Status_OnPaint(hStatus,hdc); ReleaseDC(hStatus,hdc); } break; case WM_DESTROY: PostQuitMessage(0); break; default: return DefWindowProc(hWnd, message, wParam, lParam); } return 0; }