我帮你改了一下,基本上没有什么问题.你拿去研究吧.
//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);
}