小弟初学C++,看孙鑫的教程到hook部分时候,仿照例子做了一个,实现的功能就是全局按F12恢复窗口,其他键最小化窗口。现在问题是 ShowWindow 好像是在窗口最小化的时候没效果一样,但MessageBox一直有效果,我怀疑是g_hWnd为空NULL了,所以没效果,代码如下,大家帮帮忙,多谢。调用这个DLL的项目是个对话框项目。#include <windows.h>
#include <stdio.h>HHOOK g_hKeyBoard;
HWND g_hWnd=NULL;
LRESULT CALLBACK KeyboardProc(
  int code,       // hook code
  WPARAM wParam,  // virtual-key code
  LPARAM lParam   // keystroke-message information
)
{
if(VK_F12==wParam)
{
ShowWindow(g_hWnd,SW_RESTORE);
}
else
{
ShowWindow(g_hWnd,SW_MINIMIZE);
}
UpdateWindow(g_hWnd);
return 1;
}void SetHook(HWND hWnd)
{
g_hWnd=hWnd;
g_hKeyBoard=SetWindowsHookEx(WH_KEYBOARD,KeyboardProc,GetModuleHandle("hookdll"),0);
}

解决方案 »

  1.   


    #pragma data_seg("HOOKDLLSHARE")
    HHOOK g_hKeyBoard;
    HWND g_hWnd=NULL;
    #pragma data_seg()
    #pragma comment(linker,"/SECTION:HOOKDLLSHARE,RWS")在def文件中添加
    SECTIONS
      HOOKDLLSHARE Read Write SharedDLL的共享变量要放在共享数据段中。因为DLL被加载到不同进程的地址空间里,在执行SetHook的进程里g_hWnd有值,在其他进程里为NULL。
      

  2.   

    句柄 是 在调用程序 OnInitDialog里SetHook(m_hWnd),dll里面的进去调用g_hWnd是有值
      

  3.   

    明白了,问题解决,原来这么回事,多谢 jingzhongrong及其他各位的解答,结帖