程序的实现需求是监视一些我想要监视的进程,比如说在钩子函数中首先判断这个进程的名字是不是我想要的。是的话,我就可以做一些事情。但是大部分进程都是我不想监视的,怎么才能让不想要监视的进程吧我这个dll(钩子函数放在dll里)卸载掉。钩子的加载和dll的注入是在我自己写的另一个程序A里通过SetWindowsHookEx加载的,是全局钩子。钩子相应函数是在我自己写的一个dll中,现在的方案是在程序A中控制dll钩子的加载和卸载,但是卸载就是全部都卸载了。我的要求是让我不想要监视的进程通过我的钩子的函数自己卸载掉。可以做到吗。比如说在钩子函数中调用FreeLibrary  或者 Unhook什么的。
还是说全局钩子只能一次性全部卸载。

解决方案 »

  1.   

    dllmain 里面DLL_PROCESS_ATTACH 判断进程, 不需要的返回FALSE
      

  2.   

    很简单,远程线程 freelibrary
      

  3.   

    全局钩子只能一次性全部卸载
    因为全局钩子dll的原本作用是在别的进程调用钩子过程,因此只要钩子还在,dll就不能卸载,否则触发钩子时会再次装载
      

  4.   

    SetWindowsHookEx 是有参数的,你可以指定你要监视的进程和线程。
    对于不需要监视的,钩子不起作用。
    例子:
    ////////////////////////////////////////////////////////////////////////
    // CDsoFramerControl::InstallKeyBoardHook
    // 安装局部线程键盘钩子。
    //
    BOOL CDsoFramerControl::InstallKeyBoardHook(HWND lWndCtrl,DWORD dwThreadID)
    { hook = SetWindowsHookEx( WH_KEYBOARD, (HOOKPROC)KeyBoardMsgProc,v_hModule, dwThreadID);
    if(hook != NULL)

    ODS("Keyboard Hook installed!\n" );
    hWndCtrl = lWndCtrl;
        return TRUE;

    return FALSE;
    }////////////////////////////////////////////////////////////////////////
    // CDsoFramerControl::UnInstallKeyBoardHook
    // 卸载局部线程键盘钩子。
    //
    //
    BOOL CDsoFramerControl::UnInstallKeyBoardHook()
    {
     
    BOOL unhooked = UnhookWindowsHookEx(hook);
     ODS("Keyboard Hook Uninstall!\n");
      
        return unhooked;
    }
      

  5.   

    算了,反正每个程序都会链接很多dll,多我一个不多,少我这一个不少。就让他们链接上我的钩子dll吧。