DLL中主要代码:extern "C" __declspec(dllexport) BOOL WINAPI InstallHook(DWORD ThreadId)
{
   if(g_hhook == NULL)
      {
          g_hhook = SetWindowsHookEx(WH_KEYBOARD, (HOOKPROC)KeyboardProc, instance ,      ThreadId);
          if(g_hhook != NULL)
            return TRUE;
      }
   return FALSE;
}在EXE中调用代码:void CMainDlg::OnButton1() 
{
   PROCESS_INFORMATION pi;
   STARTUPINFO si;
   si.cb=sizeof(si);   si.lpReserved=NULL;   si.lpDesktop=NULL;
   si.lpTitle=NULL;   si.cbReserved2=0;   si.lpReserved2=NULL;
   si.dwFlags=STARTF_USEPOSITION;   si.dwX=0;   si.dwY=0;
   CreateProcess("c:\\windows\\system32\\notepad.exe",NULL,NULL,NULL,FALSE,
CREATE_DEFAULT_ERROR_MODE,NULL,"c:\\windows\\system32",&si,&pi);
   DWORD id = pi.dwThreadId;
   if(InstallHook(id))
      MessageBox("Hook成功");
   else
      MessageBox("Hook失败");
}运行后弹出BOX说HOOK失败,但当我把DLL中改为全局HOOK时,即
SetWindowsHookEx(WH_KEYBOARD, (HOOKPROC)KeyboardProc, instance , 0);
运行则显示HOOK成功。

解决方案 »

  1.   

    好像进程间不能传ThreadID,只能传窗口指针之类,你可以把你的notepad.exe的窗口指针作为参数传过去,应该可以可以解决你的问题!
      

  2.   

    出现一个十分奇怪的问题。
    我对exe中InstallHook(id)下断,并F11跟进DLL中,发现这时HOOK可以成功,ID可以正常传递
    但当我除去断点直接调试时,HOOK又失败了,应该是ID没有传过去。
      

  3.   

    那很简单,你设置一个在传递值以后递交一下控制权,用Sleep(1);解决以下你的传值问题,多线程的时候经常遇到这个问题。