跪求帮忙,高手进来看看...
本帖最后由 yusong1987 于 2013-07-12 11:02:22 编辑 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)
{
HIMChIMC = NULL;
HWNDhWnd = pmsg->hwnd;
DWORDdwSize = 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)
{
DWORDdwSize = 0;
HIMChIMC = NULL;
HWNDhWnd = 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_SENDTXTWM_USER + 1001
调用的代码 如下:
#include "IME_HookDLL.h"
#pragma comment(lib,"IME_HookDLL.lib")
BOOL bFlag = InstallHook(m_hWnd);
Windows?7 64位 API
[解决办法]
在64位Windows下:
64位dll在目录c:\windows\system32目录下;
32位dll在目录c:\windows\syswow64目录下;
[解决办法]
64 位系统下的系统的程序都做成 64 位的了.
如果你的程序还是 32 为的话就不行了.
虽然 64 位系统下允许同时运行 32 位和 64 位的程序, 但是,
64 位的进程无法加载 32 位的 dll
32 位的进程无法加载 64 位的 dll
[解决办法]
程序本身是可以运行, 但是你的 32 位 dll 是无法注入到 64 位的记事本进程中的.
XP 下的记事本程序也是 32 位的, 自然没问题.
[解决办法]
程序本身是可以运行, 但是你的 32 位 dll 是无法注入到 64 位的记事本进程中的.
XP 下的记事本程序也是 32 位的, 自然没问题.
那我应该怎么做呢,需要把DLL 做成64位的么? IMM32用的是系统的。
难道要做2个不同的DLL?
是的, 你要做 32 位和 64 位两个版本的 dll.
操作系统的 dll 都是同时提供者两个版本的.
可以简单告诉我下 ,该怎么做64位DLL么 ?如何知道DLL是64位的?
谢谢了