写了一个简单的全局钩子dll和试验的对话框程序,结果发现当对话框程序不是当前窗口的时候钩子就不好使,只有在exe程序是当前窗口的时候才行。大家帮忙给看看撒。多谢啦。
#include "stdafx.h"
#include "hook.h"/************************************************************************/
/* 全局变量声明 */
/************************************************************************/
HWND g_hMainWnd; //保存接收勾到的消息的窗口句柄
HHOOK g_hHook;
HINSTANCE g_hInstance;
BOOL APIENTRY DllMain( HINSTANCE hInstance, DWORD dwReason, LPVOID lpReserved)
{
g_hInstance = hInstance;
return TRUE;
}
long SetKeyBoardHook(HWND HMainWnd)
{ //这里把对话框的窗口句柄传进来
if (!HMainWnd)
{
return ERR_CODE_INVALID_PARAMETER;
} g_hMainWnd = HMainWnd; g_hHook = ::SetWindowsHookEx(WH_KEYBOARD, hookProc, g_hInstance, 0);
if (g_hHook == NULL)
{
return ::GetLastError();
} return ERR_CODE_OK;
}
long UnSetKeyBoardHook()
{
BOOL rt = UnhookWindowsHookEx(g_hHook);
return !rt;
}LRESULT CALLBACK hookProc(int nCode, WPARAM wParam, LPARAM lParam)
{
//后来干脆在这里加了一句,但是仍然是如果对话框不是当前窗口就收不到这个消息。
//::PostMessage(g_hMainWnd, WM_USER+255, 0, 0); if(((DWORD)lParam&0x40000000) && (HC_ACTION==nCode))
{
switch(wParam)
{
case 'C': //按下C键
{
::PostMessage(g_hMainWnd, WM_USER+255, 0, 0);
}
break;
default:
break;
}
}
return CallNextHookEx( g_hHook, nCode, wParam, lParam );
}后来用spy++观察过用来测试的对话框窗口,在其不处于最前面的时候确实收不到WM_USER+255消息,这是为什么呢?
#include "stdafx.h"
#include "hook.h"/************************************************************************/
/* 全局变量声明 */
/************************************************************************/
HWND g_hMainWnd; //保存接收勾到的消息的窗口句柄
HHOOK g_hHook;
HINSTANCE g_hInstance;
BOOL APIENTRY DllMain( HINSTANCE hInstance, DWORD dwReason, LPVOID lpReserved)
{
g_hInstance = hInstance;
return TRUE;
}
long SetKeyBoardHook(HWND HMainWnd)
{ //这里把对话框的窗口句柄传进来
if (!HMainWnd)
{
return ERR_CODE_INVALID_PARAMETER;
} g_hMainWnd = HMainWnd; g_hHook = ::SetWindowsHookEx(WH_KEYBOARD, hookProc, g_hInstance, 0);
if (g_hHook == NULL)
{
return ::GetLastError();
} return ERR_CODE_OK;
}
long UnSetKeyBoardHook()
{
BOOL rt = UnhookWindowsHookEx(g_hHook);
return !rt;
}LRESULT CALLBACK hookProc(int nCode, WPARAM wParam, LPARAM lParam)
{
//后来干脆在这里加了一句,但是仍然是如果对话框不是当前窗口就收不到这个消息。
//::PostMessage(g_hMainWnd, WM_USER+255, 0, 0); if(((DWORD)lParam&0x40000000) && (HC_ACTION==nCode))
{
switch(wParam)
{
case 'C': //按下C键
{
::PostMessage(g_hMainWnd, WM_USER+255, 0, 0);
}
break;
default:
break;
}
}
return CallNextHookEx( g_hHook, nCode, wParam, lParam );
}后来用spy++观察过用来测试的对话框窗口,在其不处于最前面的时候确实收不到WM_USER+255消息,这是为什么呢?
#pragma data_seg("shared")
HHOOK g_hHook = NULL;
#pragma data_seg()
#pragma comment(linker, "/SECTION:shared,RWS")