就是切换到哪个程序的窗口,钩子就监听当前程序.
SetWindowsHookEx(WH_KEYBOARD,KeyboardProc,hInstance,0);
最后一个参数怎么设?
实现这样功能的钩子不需要dll文件的吧,线程钩子就可以搞定是么?

解决方案 »

  1.   

    是否需要DLL取决于你要使用哪种钩子,而且要看这种钩子是否支持全局钩子。
    当你加载全局钩子后,所有之后运行的进程和窗口才会被你勾上,已运行的窗口无效
      

  2.   

    ---->jameshooo:我要用的是键盘钩子,我知道全局钩子肯定好用,但是它对所有进程的所有线程都起作用,而且不论是之前的程序还是之后的,只要我按下任意键就会启动钩子,而且,我发现全局钩子速度相当慢,我想仅仅在当前活动窗口(记事本)里面用keybd_event模拟键盘输入数字1,其他程序不受影响.貌似钩子注入到指定程序必须要用到DLL是么?如果是这样的话,请问如何取得活动窗口的线程号呢?
      

  3.   

    记事本是另一个进程,所以必须用全局钩子。你应该在DllMain的DLL_PROCESS_ATTACH中判断进程主模块是不是notepad.exe,如果是则允许被加载(返回TRUE),不是则不允许被加载(返回FALSE),这样你的钩子只对记事本进程有效
      

  4.   

    ----> jameshooo: 
    明白了,可是我对记事本启用全局钩子,截获消息并模拟键盘一直输入数字1,那么其他对记事本的操作不是就失效了么,比如说,我想自己从键盘输入一些其他字符,肯定就不行了.这个问题怎么解决呢?是用return true来丢弃钩子链么,那不就不能一直输入1了么,不太明白,另外是不是需要设置timer解决这个问题呢,给个例子有么.新手,请指教
      

  5.   

    ---->   jameshooo:// ActiveKey.cpp : Defines the initialization routines for the DLL.
    //#include "stdafx.h"
    #include <afxdllx.h>
    #include "ActiveKey.h"
    #include <winbase.h>#ifdef _DEBUG
    #define new DEBUG_NEW
    #undef THIS_FILE
    static char THIS_FILE[] = __FILE__;
    #endif//Shared data section 
    #pragma data_seg("sharedata") 
    HHOOK glhHook=NULL; //钩子句柄。 
    HINSTANCE glhInstance=NULL; //DLL实例句柄。 
    #pragma data_seg()static AFX_EXTENSION_MODULE ActiveKeyDLL = { NULL, NULL };//键盘钩子处理函数。 
    extern "C" LRESULT WINAPI KeyboardProc(int nCode,WPARAM wParam,LPARAM lParam) 
    {
    for(int i=0;i<10;i++)
    {
    if(nCode>=0)
    {                //实现代码。 
                    keybd_event(49,1,0,0);
                    keybd_event(49,1,KEYEVENTF_KEYUP,0);//按1
    Sleep(300);
                    keybd_event(53,1,0,0);
                    keybd_event(53,1,KEYEVENTF_KEYUP,0);//按5
    Sleep(300);
    }
    }
    return CallNextHookEx(glhHook,nCode,wParam,lParam); 
    } CKeyHook::CKeyHook(){} 
    CKeyHook::~CKeyHook() 
    {
    if( glhHook ) 
    Stop(); 

    //安装全局钩子。 
    HHOOK CKeyHook::Start() 
    {
    glhHook = SetWindowsHookEx(WH_KEYBOARD,KeyboardProc,glhInstance,0);//设置键盘钩子。 
    return glhHook; 

    //卸载全局钩子。 
    BOOL CKeyHook::Stop() 

    BOOL bResult = TRUE; 
    if( glhHook ) 
    bResult = UnhookWindowsHookEx(glhHook);//卸载键盘钩子。 
    return bResult; 
    }extern "C" int APIENTRY 
    DllMain(HINSTANCE hInstance, DWORD dwReason, LPVOID lpReserved) 

    //如果使用lpReserved参数则删除下面这行 
    UNREFERENCED_PARAMETER(lpReserved); if (dwReason == DLL_PROCESS_ATTACH

    TRACE0("NOtePadHOOK.DLL Initializing!\n"); 
    //扩展DLL仅初始化一次 
    if (!AfxInitExtensionModule(ActiveKeyDLL, hInstance)) 
    return 0; 
    new CDynLinkLibrary(ActiveKeyDLL); 
    //把DLL加入动态MFC类库中 
    glhInstance = hInstance; 
    //插入保存DLL实例句柄 

    else if (dwReason == DLL_PROCESS_DETACH) 

    TRACE0("NotePadHOOK.DLL Terminating!\n"); 
    //终止这个链接库前调用它 
    AfxTermExtensionModule(ActiveKeyDLL); 

    return 1; 
    }
    请问这个判断具体如何实现呢?
      

  6.   

    if   (dwReason   ==   DLL_PROCESS_ATTACH)   
    {   
    TRACE0("NOtePadHOOK.DLL   Initializing!\n");   
    //扩展DLL仅初始化一次   
    if   (!AfxInitExtensionModule(ActiveKeyDLL,   hInstance))   
    return   0;   
    new   CDynLinkLibrary(ActiveKeyDLL);   
    //把DLL加入动态MFC类库中   
    glhInstance   =   hInstance;   
    //插入保存DLL实例句柄     TCHAR szPath[MAX_PATH];
      GetModuleFileName(NULL, szPath, MAX_PATH);
      if (szPath中的文件名 不是 "notepad.exe") // 自己改一下,因为szPath中保存的是完整路径
        return FALSE;
    }   
      

  7.   

    TCHAR   szPath[MAX_PATH]="C:\windows\system32\notepad.exe";    
    if(GetModuleFileName(NULL,   szPath,   MAX_PATH)!=MAX_PATH) //自己改一下,因为szPath中保存的是完整路径 
    return   FALSE; 
    对不对呢?
    GetModuleFileName返回的是文件名的长度.
      

  8.   

    用法不对,使用GetModuleFileName之后,你再去比较szPath获得的内容