大家好!又遇到问题了……--!我在DLL里写了个键盘HOOK函数,但是好像起不到作用。调试的时候一步步走,能进一次键盘消息的处理函数,如果直接运行函数则一点效果也没有,我把代码简化后在下面,希望大家帮我看看哪出了问题。---DLL中的函数(Server程序调用该DLL中的SetHook函数,没有写卸载DLL的代码)----void SetHook(SOCKET s,PVOID pvoid)
{
sock = s;
lpmessage = (MY_MESSAGE*)pvoid;
g_hKeyboard = SetWindowsHookEx(WH_KEYBOARD, KeyboardProc, g_hInst,0);//这里设断点
         //如果这里设断点,则停一会再按F10运行下一行代码,弹出KeyboardProc中调用的对话框;
     //如果这里没有断点或直接运行程序,则没有反应。KeyboardProc函数简化后好下:
}
LRESULT CALLBACK KeyboardProc(int nCode, WPARAM wParam, LPARAM lParam)
{
MessageBox(NULL,"aaaaaaaaa","1111111",0);//验证函数是否执行
     return 1;
}

解决方案 »

  1.   

    调试的时候,权限比较高,直接运行,是不是权限不够,还可以在代码中添加Log等,看函数是否运行时调用成功
      

  2.   

    找到原因是,是调用SetHook的线程,在调用完后很快就结束了。
    大概是这样引起DLL资料被释放?这个线程函数代码如下:unsigned __stdcall jpjl(void* lpvoid)
    {
    MY_MESSAGE* lpmessage = (MY_MESSAGE*)lpvoid; //以后再处理窗口于鼠标监视
    SOCKET s = sock;
    DWORD numbersend;
    DWORD FLAG = 0; SetHook(s,lpmessage); delete lpmessage;
    while(1)//这是我后来加的,这样键盘勾子就能使用了。不过这方法似乎不太好
    {    //希望能改进,不知道大家有什么好方法吗?
    Sleep(4000);
    }
    return 0;
    }这个帖子就当散分吧,随便接分表客气啊各位!!
      

  3.   

    你可以这样啊,在进程开始的时候sethook一下,然后在主线程里不断的messageloop,就不用这么费劲了
      

  4.   

    为什么线程一结束,DLL中的函数就不起作用了呢?^-^&
      

  5.   

    我立马在把SetHook(s,lpmessage);写在了主线程里,然后程序好用了,是什么原因呢?
      

  6.   

    虽然也用过HOOK,但是不明白为什么。
    恩,坦白了,我是来接分的
      

  7.   

    新问题在这,希望大家帮我看看,谢谢了!
    http://topic.csdn.net/u/20101113/15/b35ffd08-6c41-4b81-9b85-fc00992fb3e3.html?92813