dll注入远程线程后,在DllMain中的 DLL_PROCESS_ATTACH 下注册热键F3失败
代码如下:DWORD destId, currentId=GetCurrentProcessId();
HWND hwnd;
do 
{
hwnd=FindWindow(NULL, "目标进程");
GetWindowThreadProcessId(hwnd, &destId);
} while (destId!=currentId && hwnd!=NULL);
if (hwnd!=NULL)
{
DWORD hotId=GlobalAddAtom("test_f3");
        int result=RegisterHotKey(hwnd, hotId, 0, VK_F3);
        result=GetLastError();
}GetLastError得到的是1408 无效的窗口句柄 或者不是同一个线程 
窗口句柄hwnd 我觉得是有效的 因为我还有对hwnd的其他操作 比如PostMessage 这些都是成功的
所以我就想问问大家 如果是在dll中 这个RegisterHotKey到底怎么用呢?

解决方案 »

  1.   

    先UNRegisterHotKey再RegisterHotKey看看效果
      

  2.   

    我试了一下 UnregisterHotKey(hwnd, VK_F3); 返回的结果是0 GetLastError返回1419 (1419)-没有注册热键。这点我就奇怪了 既然没注册 怎么会不能注册呢? RegisterHotKey (1408)-无效窗口;它属于另一线程。是不是必须是窗口目标进程的窗口那个线程才能注册呢?加载dll是用的远程线程,这个线程是不是不能注册热键呢?向这种远程注入的dll应该怎么注册热键呢?
      

  3.   

    问题解决了 原因在于 “它属于另一线程” 注册热键必须在这个窗口的线程函数中 但是目标窗口线程函数早就进入了消息循环 我一个外来进程怎么进入它呢 就是用句柄钩子函数就可以了 设置钩子函数 在GetMessage的时候 进入设定好的回调函数 这个函数所处的空间就是 线程空间这个时候 注册热键就满足了 这个窗口线程的的条件当然就成功了 谢谢二楼的大大哈 用你说的UnregisterHotKey正好也改变了 窗口本身的热键 满足我的要求 谢谢哈
      

  4.   

    分享下
    远程注入dll中注册热键 
    http://blog.csdn.net/whatday/article/details/8001966