跪求帮忙,高手进来看看...
WH_GETMESSAGE类型全局钩子在WIN7的64位系统上无法截获记事本输入消息,也无法截获记事本任何消息包括控制台程序以及文件重命名的输入,但是在WIN7的32位系统上都能截获,这就奇怪了,我查看了2个系统的IMM32.DLL,32位系统上是115K,64位系统上是167K,大小都不一样,由此怀疑是不是库的问题,因为我WINDOWS SDK 更新到 V7.0 ,但是不敢肯定是这个导致的。
有木有高手可以讲解一下,我会继续试验,希望大虾帮忙,先谢谢!
钩子代码放在DLL中,如下:
BOOL APIENTRY DllMain( HMODULE hModule,
DWORD ul_reason_for_call,
LPVOID lpReserved
)
{
switch (ul_reason_for_call)
{
case DLL_PROCESS_ATTACH:
g_hHinstance = (HINSTANCE)hModule;
break;
case DLL_THREAD_ATTACH:
case DLL_THREAD_DETACH:
case DLL_PROCESS_DETACH:
break;
}
return TRUE;
}
LRESULT CALLBACK MessageProc(int nCode,WPARAM wParam,LPARAM lParam)
{
PMSG pmsg = (PMSG)lParam;
if (nCode == HC_ACTION || nCode == HC_NOREMOVE)
{
switch (pmsg->message)
{
case WM_IME_COMPOSITION:
{
if(pmsg->lParam & GCS_RESULTSTR)
{
HIMC hIMC = NULL;
HWND hWnd = pmsg->hwnd;
DWORD dwSize = 0;
if (hWnd)
{
hIMC = ImmGetContext(hWnd);
if (hIMC)
{
//////////////////////////////////////////////////////////////////////////
dwSize = ImmGetCompositionString(hIMC, GCS_RESULTSTR, NULL, 0);
dwSize += sizeof(WCHAR);
memset(lpstr, 0, 20);
ImmGetCompositionString(hIMC, GCS_RESULTSTR, lpstr, dwSize);
strcat(lpstr," --- From WM_IME_COMPOSITION");
writefile(lpstr);
}
ImmReleaseContext(hWnd, hIMC);
}
}
}
break;
case WM_IME_NOTIFY:
{
memset(lpCandStr,0,256);
if (pmsg->wParam & IMN_CHANGECANDIDATE)
{
DWORD dwSize = 0;
HIMC hIMC = NULL;
HWND hWnd = pmsg->hwnd;
CANDIDATELIST* stCandList = NULL;
if(hWnd)
{
hIMC = ImmGetContext(hWnd);
if (hIMC)
{
dwSize = ImmGetCandidateList(hIMC,0,NULL,0);
dwSize += sizeof(WCHAR);
stCandList = (CANDIDATELIST*)new BYTE[dwSize];
memset(stCandList,0,dwSize);
ImmGetCandidateList(hIMC,0,stCandList,dwSize);
strcat(lpCandStr,GETLPCANDSTR(stCandList,stCandList->dwSelection));
SendTxt(lpCandStr);
delete []stCandList;
}
ImmReleaseContext(hWnd, hIMC);
}
}
}
break;
default:
break;
}
}
LRESULT lResult = CallNextHookEx(g_hHook, nCode, wParam, lParam);
return(lResult);
}
DLL_OBJECT_API BOOL InstallHook(HWND hWnd)
{
hMsgWnd = hWnd;
g_hHook = SetWindowsHookEx(WH_GETMESSAGE,(HOOKPROC)MessageProc,g_hHinstance,0);
if (NULL == g_hHook)
return FALSE;
return TRUE;
}
DLL 的头文件:
#pragma once
#ifdef DLL_OBJECT_EXPORTS
#define DLL_OBJECT_API __declspec(dllexport)
#else
#define DLL_OBJECT_API __declspec(dllimport)
#endif
DLL_OBJECT_API BOOL InstallHook(HWND hWnd);
DLL_OBJECT_API BOOL UnHook();
#define WM_SENDTXT WM_USER + 1001
调用的代码 如下:
#include "IME_HookDLL.h"
#pragma comment(lib,"IME_HookDLL.lib")
BOOL bFlag = InstallHook(m_hWnd);