按这个例子做的
  (1)在DLL中定义键盘勾子函数。 
  在VC++6.0中利用MFC APPWizard(DLL)生动态链接库工程keyhook。然后选择DLL 的类型为使用共享MFC DLL的常规DLL。打开 keyhook.cpp文件,加入全局说明: 
#pragma data_seg(“SharedVar") 
//DLL输出的全局变量
extern “C" __declspec(dllexport) HHOOK hHook=NULL;
#pragma data_seg()
// DLL 自用的全局变量
char buffer=0; 
FILE *fl;
定义全局的键盘勾子函数:
//DLL输出的勾子函数
extern “C" __declspec(dllexport) 
LRESULT CALLBACK KeyboardProc(
  int nCode,       
  WPARAM wParam,  //虚键代码
  LPARAM lParam   // 击键消息的信息
)
{
if(lParam&0x80000000)  
{//如果某键按下
buffer=MapVirtualKey(wParam,2);
    // 把虚键代码变为字符
//输出到文件
fl=fopen( “keyfile.txt", “a+" );
fwrite(&buffer, sizeof(char), 1, fl);
fclose(fl);
}
return CallNextHookEx(hHook,nCode,wParam,lParam);
}
  编译得到keyhook.dll和库文件keyhook.lib 。使用 keyhook.lib是为了让主程序可以方便地隐式调用DLL中的输出函数。 
   (2)在VC++6.0中利用MFC APPWizard(EXE)生成一个不使用文档/视结构单文档应用getkey。打开MainFrm.cpp文件。加入全局的输入变量和函数的说明: 
//要从DLL中输入的变量和函数
extern “C" __declspec(dllimport) HHOOK hHook;//
extern “C" __declspec(dllimport) 
LRESULT CALLBACK  KeyboardProc
(int nCode, WPARAM wParam, LPARAM lParam);
  (3)在CMainFrame类的构造函数中安装勾子。 
CMainFrame::CMainFrame()
{
hHook=SetWindowsHookEx(WH_KEYBOARD,
KeyboardProc,
GetModuleHandle(“keyhook.dll"),
0);
}
  (4)在CMainFrame类的析构函数中卸载勾子。
CMainFrame::~CMainFrame()

    if(hHook)
      UnhookWindowsHookEx(hHook); 

  编译这个工程的时候,注意包含第一步得到的库文件 keyhook.lib。keyhook.dll和getkey.exe应放在同一目录下运行。

解决方案 »

  1.   

    SetWindowsHookEx做到dll里,如:
    dll:
    BOOL installhook()
    {
        hkb=SetWindowsHookEx(WH_KEYBOARD,(HOOKPROC)KeyboardProc,theApp.m_hInstance,0);
        return TRUE;
    }exe:
    instkbhook();
      

  2.   

    例子里写的什么地方不对
    不能在exe里设置全局钩子吗
      

  3.   

    duqiang2050(杜杜)
    我象你说的这样做了 还是不行
      

  4.   

    全局的钩子必须设定在动态库中,这样系统才能把执行程序的代码插入到其他的进程中。不仅只是SetWindowsHookEx函数需要在动态库中调用,而且所设定的参数都应该满足动态库和全局钩子的要求。