吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 822|回复: 3
收起左侧

[已解决] windows全局键盘钩子

[复制链接]
zishen 发表于 2024-8-8 15:18
本帖最后由 zishen 于 2024-8-8 16:28 编辑

P$$V8EVJ~5CL$[O39@0K.png

windows全局键盘钩子,无论大小写,都输出大写,是什么原因呀?
image.png
G6R@(~%J$DSH3P~FZXYJ()D.png
我这个是通过DLL注入实现的

谢谢大家,已解决,SetWindowsHookEx参数错误!
正确参数: SetWindowsHookEx(WH_KEYBOARD_LL, MyKeyboardProc, GetModuleHandle(NULL), 0);

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

Yathon 发表于 2024-8-8 16:11
问题解释: 为什么获取并打印出来的都是大写

这个问题可能是由于 wParam 参数的使用方式造成的。在键盘钩子中,wParam 参数包含了虚拟键码(VK code),这些键码对应的通常是键盘上的物理键位而不是实际字符。例如,不论是大写还是小写的 "A" 键,其虚拟键码都是 VK_A,因此在打印时并没有区分大小写。

如果你希望在钩子中处理并打印实际的字符(包括大小写),你需要考虑键盘的状态(例如,Shift键和Caps Lock键的状态),并可能需要使用其他的API函数来转换虚拟键码到实际的字符。这通常涉及到使用 ToUnicode 或 ToAsciiEx 函数来考虑当前键盘布局和按键状态。
Yathon 发表于 2024-8-8 16:16
[C++] 纯文本查看 复制代码
HHOOK g_hHook;
LRESULT CALLBACK MyKeyboardProc(int code, WPARAM wParam, LPARAM lParam)
{
    if (code < 0) {
        return CallNextHookEx(g_hHook, code, wParam, lParam);
    }

    // 获取键盘状态
    BYTE keyboardState[256];
    GetKeyboardState(keyboardState);

    // 转换虚拟键码到实际字符
    WCHAR charBuffer[5];  // 大小足以处理一般字符和Dead keys
    int numChars = ToUnicode(
        wParam,
        ((lParam >> 16) & 0xFF),  // 提取扫描码
        keyboardState,
        charBuffer,
        4,
        0
    );

    // 确保有字符被正确转换
    if (numChars > 0) {
        charBuffer[numChars] = 0;  // 添加终止字符

        char szBuffer[MAXBYTE];
        wsprintf(szBuffer, "HT:%ls pid:%d", charBuffer, GetCurrentProcessId());
        OutputDebugString(szBuffer);
    }

    return CallNextHookEx(g_hHook, code, wParam, lParam);
}


代码解释:
键盘状态获取:使用 GetKeyboardState 来获取当前键盘的状态数组,这包括所有键的上下状态。

字符转换:ToUnicode 函数用来将虚拟键码转换为对应的 Unicode 字符,它同时考虑了当前的键盘布局和按键状态。这个函数能处理组合键和Dead keys,可以生成多于一个字符的输出。

输出调试信息:如果 ToUnicode 成功转换虚拟键码(返回值大于0),则格式化字符串包含转换后的字符并输出。
ldecxh 发表于 2024-8-8 17:01

在使用Windows全局键盘钩子时,用户遇到了一个问题:无论输入何种字符,输出均为大写字母。这个问题不仅影响用户的正常使用,也引发了对键盘钩子工作机制的深入探讨。下面将围绕此问题展开全面分析:

SetWindowsHookEx参数错误

参数使用不当:在实现键盘钩子时,如果SetWindowsHookEx的参数设置不正确,可能会导致异常情况的发生[^2^]。例如,错误的线程ID或钩子类型可能会造成预期外的行为。
wParam参数处理:在键盘钩子的处理函数中,wParam参数包含了虚拟键码,而不是实际字符。如果没有正确处理wParam参数,可能导致无法区分输入的大小写[^2^]。
键盘状态未考虑

Shift键与Caps Lock键状态:在处理键盘输入时,需要考虑当前活跃的按键状态,特别是Shift键和Caps Lock键。忽略这些状态将导致大小写输入异常。
API函数转换:为了获取正确的字符输出,需使用如ToUnicode或ToAsciiEx等API函数,结合当前键盘布局和按键状态进行转换[^2^]。
输入法设置问题

粘滞键与输入法修复:某些情况下,粘滞键功能或输入法设置不当可能会导致输入异常。通过检查和修复输入法设置,有可能解决大小写输出问题。
Caps Lock键设置错误:如果在操作系统的输入法设置中,Caps Lock键的功能被错误地设置为切换大小写,也会导致类似问题。
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-12-14 08:36

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表