#pragma data_seg ()
static HHOOK g_hKeyboardHook = NULL;
static HINSTANCE g_hInst = NULL;
#pragma data_seg ()
#pragma comment (linker, "/section:Shared, rws")
BOOL WINAPI DllMain(HINSTANCE hInstance, DWORD fdwReason, PVOID pvReserved) {
switch(fdwReason){
case DLL_PROCESS_ATTACH:
g_hInst = (HINSTANCE) hInstance;
。。。。。
然后再用2个输出函数:一个安装钩子,一个卸载钩子
MY_API BOOL HookKey ()
{
....
g_hKeyboardHook = ::SetWindowsHookEx(WH_KEYBOARD, KeyboardProc, g_hInst, NULL);
....
}
CreateRemoteThread 去调用安装钩子的导出函数
LRESULT CALLBACK KeyboardProc(int nCode, WPARAM wParam, LPARAM lParam)
{
BOOL bKeyUp = lParam & (1 << 31);//防止,键盘按和弹起都执行一次
if (bKeyUp && wParam == VK_HOME && nCode == HC_ACTION) {
//加入窗体
//AfxMessageBox("ok");
if (myform == NULL)
{
AFX_MANAGE_STATE(AfxGetStaticModuleState());
CWnd *pCWnd = CWnd::GetForegroundWindow();
myform = new CMyForm();
myform->Create(IDD_MYFORM,pCWnd);
myform->ShowWindow(SW_SHOW);
}
else
{
myform->ShowWindow(myform->IsWindowVisible() ? SW_HIDE : SW_SHOW);
}
//
}
return ::CallNextHookEx(g_hhook, nCode, wParam ,lParam);
}
extern "C" __declspec(dllexport) BOOL WINAPI InstallHook(HWND h)
{
if (g_hhook == NULL) {
DWORD pmod;
DWORD hThread = GetWindowThreadProcessId(h,&pmod);
g_hhook = ::SetWindowsHookEx(WH_KEYBOARD, (HOOKPROC)KeyboardProc,theApp.m_hInstance,hThread);
if (g_hhook != NULL)
return TRUE;
}
return FALSE;
}
extern "C" __declspec(dllexport) BOOL WINAPI InstallHook(HWND h)
{
if (g_hhook == NULL) {
DWORD pmod;
DWORD hThread = GetWindowThreadProcessId(h,&pmod);
g_hhook = ::SetWindowsHookEx(WH_KEYBOARD, (HOOKPROC)KeyboardProc,theApp.m_hInstance,hThread);
if (g_hhook != NULL)
return TRUE;
}
return FALSE;
}