我写了一个简单的测试程序,
一个是我自己编写的计算器程序 calculator  .
一个是我要HOOK这个计算器的程序.
往calculator  程序里发一串字符, 然后,在  calculator   用messagebox弹出来!!可是发现几个问题:void WINAPI InstallHook(HWND Wnd/*计算器的HWND*/, DWORD dwThreadId /*计算器的线程ID*/)
{
if (hmodDll == NULL)
hmodDll = LoadLibrary("hookdll.dll"); hHook=SetWindowsHookEx(WH_GETMESSAGE /****注意这里,是GETMESSAGE****/   , (HOOKPROC)GetMsgProc, hmodDll, dwThreadId);

        if (hHook != NULL)
{
                //如果是WH_GETMESSAGE,下面的这三个发消息,将全会失败,目标计算器程序没有反映.
                //如果把HOOK 类型换成 WH_CALLWNDPROC , 那么, SendMessage 会成功,目标程序会弹出对话框,其它两个POST的消息会失败.                SendMessage(Wnd, WM_COPYDATA , 0, (LPARAM)&copydata);
//PostMessage(Wnd, WM_COPYDATA , 0, (LPARAM)&copydata);
//PostThreadMessage(dwThreadId, WM_COPYDATA , 0, (LPARAM)&copydata); UnhookWindowsHookEx(hHook);
}
}
不知道大家看明白了吗?就是,如果HOOK 类型是WH_GETMESSAGE, 那三种发消息方式都会失败.
SendMessage 失败可以理解,毕竟它不往消息队列里放消息, 它是直接执行的,可是两个POST为什么会失败呢?
如果换成WH_CALLWNDPROC 类型,那SendMessage 会成功,其它两个会失败!这是为什么呢?怎么能让,下面的两种POST方式也能成功呢?请问,我要怎么做?
谢谢!!

解决方案 »

  1.   

    你hook WH_GETMESSAGE,自己SendMessage,PostMessage等发送的消息又被自己hook了..
      

  2.   

    而对于WM_COPYDATA消息,需要使用SendMessage发送,而不能用PostMessage发送
      

  3.   

    WM_COPYDATA 的消息数据是当前发送进程的内存映射,因而需要用同步方法SendMessage,否则用PostMessage,接收到消息的进程处理的时候,这个消息对应的内存数据已经可能释放
      

  4.   


    可是我HOOK的是他的线程ID呀!!
     hHook=SetWindowsHookEx(WH_GETMESSAGE /****注意这里,是GETMESSAGE****/   , (HOOKPROC)GetMsgProc, hmodDll, dwThreadId/*这里是目标程序的线程ID呀,我并没有HOOK 自己的进程呀*/);
      

  5.   


    可是我HOOK的是他的线程ID呀!!
     hHook=SetWindowsHookEx(WH_GETMESSAGE /****注意这里,是GETMESSAGE****/   , (HOOKPROC)GetMsgProc, hmodDll, dwThreadId/*这里是目标程序的线程ID呀,我并没有HOOK 自己的进程呀*/);
      

  6.   

    要么用全局钩子,要么就只能hook当前加载的进程...
      

  7.   

    把SetWindowsHookEx的dwThreadId设置成0试下。
      

  8.   

    有两点原因:
    1、WM_COPYDATA只能用SendMessage来发送,不能PostMessage;
    2、WH_GETMESSAGE钩的是从消息队列中GetMessage得到的消息,用SendMessage发送的消息会直接由窗口函数响应,不会被GetMessage取出。