我帮你改了一下,基本上没有什么问题.你拿去研究吧.
//ghook.h 头文件#ifdef _USRDLL
#define MYEXPORT extern "C" __declspec(dllexport)
#else
#define MYEXPORT extern "C" __declspec(dllimport)
#endifMYEXPORT BOOL CALLBACK InstallHook(BOOL );
-------------------------------------------------------//msg.cpp#include <windows.h>
#include <stdio.h>
#include <assert.h>
#include <tchar.h>#include "ghook.h"#pragma data_seg("mydata1")
HWND g_hCurrentWnd=NULL;
HHOOK g_hHook=NULL;
HHOOK g_hSendHook=NULL;
BOOL g_bInstall=false;
//FILE* g_fFile=NULL; File 除了用继承的方法在不同进程间共享,文件句柄好象就不能共享吧!这也许是不能记录其它进程的一个原因#pragma data_seg()#pragma comment(linker,"/SECTION:mydata1,RWS")FILE* g_fFile=NULL;
HINSTANCE g_hInstance=NULL;#define MYMUTEX _T("MYMUTEX")LRESULT CALLBACK MsgProc(int nCode, WPARAM wParam, LPARAM lParam);
LRESULT CALLBACK SendMsgProc(int nCode ,WPARAM wParam, LPARAM lParam);void TranslateMsg(HWND hWnd,UINT message,WPARAM wParam,LPARAM lParam);
int WINAPI DllMain(HINSTANCE hInstance,DWORD dwReason,LPVOID lpfn)
{
if(dwReason==DLL_PROCESS_ATTACH)
g_hInstance=hInstance;
return true;
}
MYEXPORT BOOL CALLBACK InstallHook(BOOL )
{
static HANDLE g_hmutex=NULL;//为防止写入时冲突用的互斥体. if(!g_bInstall&&)
{
g_hmutex=CreateMutex(NULL,FALSE,MYMUTEX); assert(g_hmutex!=NULL);
g_fFile=fopen("d:\\out.txt","w+");
assert(g_fFile!=NULL); //保证不要建文件出错 g_hHook=SetWindowsHookEx(WH_GETMESSAGE,MsgProc,g_hInstance,0);
g_hSendHook=SetWindowsHookEx(WH_CALLWNDPROC,SendMsgProc,g_hInstance,0);
g_bInstall=true;
fprintf(g_fFile,"install\n");
fclose(g_fFile); return true;
}
else if(g_bInstall&&!)
{
UnhookWindowsHookEx(g_hHook);
g_hHook=NULL;
UnhookWindowsHookEx(g_hSendHook);
g_hSendHook=NULL;
g_bInstall=true; g_fFile=fopen("d:\\out.txt","r+");
assert(g_fFile!=NULL); //保证不要建文件出错 fprintf(g_fFile,"unstall\n");
fclose(g_fFile);
CloseHandle(g_hmutex);//删除互斥体 }
return false;
}
LRESULT CALLBACK MsgProc(int nCode, WPARAM wParam, LPARAM lParam)
{
PMSG temp=(PMSG)lParam;
if(nCode==HC_ACTION)
{
TranslateMsg(temp->hwnd,temp->message,temp->wParam,temp->lParam);
} return CallNextHookEx(g_hHook,nCode,wParam,lParam);
}LRESULT CALLBACK SendMsgProc(int nCode ,WPARAM wParam, LPARAM lParam)
{
if(nCode<0)
CallNextHookEx(g_hSendHook,nCode,wParam,lParam);
CWPSTRUCT* msg=new CWPSTRUCT;
memcpy(msg,(void*)lParam,sizeof(CWPSTRUCT)); if(nCode==HC_ACTION)
{
TranslateMsg(msg->hwnd,msg->message,msg->wParam,msg->lParam);
}
delete msg;//防止mem leak! return CallNextHookEx(g_hSendHook,nCode,wParam,lParam);
}
void TranslateMsg(HWND hWnd,UINT message,WPARAM wParam,LPARAM lParam)
{
if (message==WM_GETTEXT) return ;//后面用到了GetWindowText,因而这里防止无限重入!
HANDLE hmutex=CreateMutex(NULL,TRUE,MYMUTEX);
if (!hmutex) {
OutputDebugString("不能打开互斥体");
return ;
}
WaitForSingleObject(hmutex,INFINITE);//多线安全
char buf[256];
GetWindowText(hWnd,buf,sizeof(buf)); //为看更清楚点,把caption也一起记下来,但是可能引起重入! g_fFile=fopen("d:\\out.txt","a");
fprintf(g_fFile,"WindowName:\"%s\" msg:%d\n",buf,message);
//fflush(g_fFile); 没必要了
fclose(g_fFile);
ReleaseMutex(hmutex);//一定要释放mutex以让其它进/线程进入,不然系统要S锁!!!
CloseHandle(hmutex);
}
//ghook.h 头文件#ifdef _USRDLL
#define MYEXPORT extern "C" __declspec(dllexport)
#else
#define MYEXPORT extern "C" __declspec(dllimport)
#endifMYEXPORT BOOL CALLBACK InstallHook(BOOL );
-------------------------------------------------------//msg.cpp#include <windows.h>
#include <stdio.h>
#include <assert.h>
#include <tchar.h>#include "ghook.h"#pragma data_seg("mydata1")
HWND g_hCurrentWnd=NULL;
HHOOK g_hHook=NULL;
HHOOK g_hSendHook=NULL;
BOOL g_bInstall=false;
//FILE* g_fFile=NULL; File 除了用继承的方法在不同进程间共享,文件句柄好象就不能共享吧!这也许是不能记录其它进程的一个原因#pragma data_seg()#pragma comment(linker,"/SECTION:mydata1,RWS")FILE* g_fFile=NULL;
HINSTANCE g_hInstance=NULL;#define MYMUTEX _T("MYMUTEX")LRESULT CALLBACK MsgProc(int nCode, WPARAM wParam, LPARAM lParam);
LRESULT CALLBACK SendMsgProc(int nCode ,WPARAM wParam, LPARAM lParam);void TranslateMsg(HWND hWnd,UINT message,WPARAM wParam,LPARAM lParam);
int WINAPI DllMain(HINSTANCE hInstance,DWORD dwReason,LPVOID lpfn)
{
if(dwReason==DLL_PROCESS_ATTACH)
g_hInstance=hInstance;
return true;
}
MYEXPORT BOOL CALLBACK InstallHook(BOOL )
{
static HANDLE g_hmutex=NULL;//为防止写入时冲突用的互斥体. if(!g_bInstall&&)
{
g_hmutex=CreateMutex(NULL,FALSE,MYMUTEX); assert(g_hmutex!=NULL);
g_fFile=fopen("d:\\out.txt","w+");
assert(g_fFile!=NULL); //保证不要建文件出错 g_hHook=SetWindowsHookEx(WH_GETMESSAGE,MsgProc,g_hInstance,0);
g_hSendHook=SetWindowsHookEx(WH_CALLWNDPROC,SendMsgProc,g_hInstance,0);
g_bInstall=true;
fprintf(g_fFile,"install\n");
fclose(g_fFile); return true;
}
else if(g_bInstall&&!)
{
UnhookWindowsHookEx(g_hHook);
g_hHook=NULL;
UnhookWindowsHookEx(g_hSendHook);
g_hSendHook=NULL;
g_bInstall=true; g_fFile=fopen("d:\\out.txt","r+");
assert(g_fFile!=NULL); //保证不要建文件出错 fprintf(g_fFile,"unstall\n");
fclose(g_fFile);
CloseHandle(g_hmutex);//删除互斥体 }
return false;
}
LRESULT CALLBACK MsgProc(int nCode, WPARAM wParam, LPARAM lParam)
{
PMSG temp=(PMSG)lParam;
if(nCode==HC_ACTION)
{
TranslateMsg(temp->hwnd,temp->message,temp->wParam,temp->lParam);
} return CallNextHookEx(g_hHook,nCode,wParam,lParam);
}LRESULT CALLBACK SendMsgProc(int nCode ,WPARAM wParam, LPARAM lParam)
{
if(nCode<0)
CallNextHookEx(g_hSendHook,nCode,wParam,lParam);
CWPSTRUCT* msg=new CWPSTRUCT;
memcpy(msg,(void*)lParam,sizeof(CWPSTRUCT)); if(nCode==HC_ACTION)
{
TranslateMsg(msg->hwnd,msg->message,msg->wParam,msg->lParam);
}
delete msg;//防止mem leak! return CallNextHookEx(g_hSendHook,nCode,wParam,lParam);
}
void TranslateMsg(HWND hWnd,UINT message,WPARAM wParam,LPARAM lParam)
{
if (message==WM_GETTEXT) return ;//后面用到了GetWindowText,因而这里防止无限重入!
HANDLE hmutex=CreateMutex(NULL,TRUE,MYMUTEX);
if (!hmutex) {
OutputDebugString("不能打开互斥体");
return ;
}
WaitForSingleObject(hmutex,INFINITE);//多线安全
char buf[256];
GetWindowText(hWnd,buf,sizeof(buf)); //为看更清楚点,把caption也一起记下来,但是可能引起重入! g_fFile=fopen("d:\\out.txt","a");
fprintf(g_fFile,"WindowName:\"%s\" msg:%d\n",buf,message);
//fflush(g_fFile); 没必要了
fclose(g_fFile);
ReleaseMutex(hmutex);//一定要释放mutex以让其它进/线程进入,不然系统要S锁!!!
CloseHandle(hmutex);
}
解决方案 »
免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货