SetWindowsHookEx的第四个参数到底是线程ID还是进程ID,高人给指点一下。看看下面的例子,想屏蔽扫雷中的鼠标作用。这是HOOKDLL1.CPP#include "stdafx.h" 
#include<windows.h>HHOOK g_hMouse;
LRESULT CALLBACK MouseProc(
int nCode,
WPARAM wParam,
LPARAM lParam
)
{
return 1;
}void SetHook(DWORD THREADID)
{
g_hMouse=SetWindowsHookEx(WH_MOUSE,MouseProc,GetModuleHandle("HOOKDLL"),THREADID);}这个是加勾子的原程序
void CHOOKMINERDlg::OnButton1() 
{
// TODO: Add your control notification handler code here hMineWnd = ::FindWindow(MINE_WINDOW_CLASS, MINE_WINDOW_TITLE); //查找窗口
if( hMineWnd<=0 )
return ; ::GetWindowThreadProcessId(hMineWnd, &dwMineProcId); //获取窗口进程ID
if( !dwMineProcId )
return ;
SetHook(dwMineProcId);


}
为什么这样做不可以呢??

解决方案 »

  1.   

    查 MSDN 啊HHOOK SetWindowsHookEx(      
        int idHook,
        HOOKPROC lpfn,
        HINSTANCE hMod,
        DWORD dwThreadId
    );得用线程 ID
      

  2.   

    ::GetWindowThreadProcessId 的返回值不就是线程 ID 吗
      

  3.   

    楼主你的代码中不是都有了GetWindowThreadProcessId 函数吗?怎么还问呢?
      

  4.   

    要获得线程ID,通过窗口的话,用DWORD GetWindowThreadProcessId(          HWND hWnd,
        LPDWORD lpdwProcessId
    );你传的是进程ID,当然不对。GetWindowThreadProcessId的返回值才是线程IDThe return value is the identifier of the thread that created the window. 你要这么改DWORD dwThreadId=::GetWindowThreadProcessId(hMineWnd, &dwMineProcId); //获取窗口进程ID
        if( !dwMineProcId )
            return ;
        SetHook(dwThreadId);
      

  5.   

    DWORD GetWindowThreadProcessId(      
        HWND hWnd,
        LPDWORD lpdwProcessId
    );Return ValueThe return value is the identifier of the thread that created the window.