gpt4 book ai didi

c++ - 为什么 GetKeyState 改变了 ToUnicodeEx 的行为?

转载 作者:行者123 更新时间:2023-11-30 01:41:05 27 4
gpt4 key购买 nike

在下面的代码中:-

BYTE ks[256];
auto keyboard_layout = GetKeyboardLayout(0);
GetKeyboardState(ks);
auto w = WCHAR(malloc(1));
ToUnicodeEx(wParam, MapVirtualKey(wParam, MAPVK_VK_TO_VSC), ks, LPWSTR(&w), 1, 0, keyboard_layout);
wcout << "KEY:" << w << endl;

输出仅显示小写字母,例如:-

KEY:a
KEY:b
KEY:2

即使按下 SHIFT+ASHIFT+2

但是在下面的代码中添加GetKeyState(VK_SHIFT) 和/或GetKeyState(VK_CAPITAL):-

auto shifted = false;
auto caps = false;
if (GetKeyState(VK_SHIFT) < 0)
{
shifted = true;
cout << "Shifted!" << endl;
}
if (GetKeyState(VK_CAPITAL) < 0)
{
shifted = true;
cout << "Caps!" << endl;
}
BYTE ks[256];
auto keyboard_layout = GetKeyboardLayout(0);
GetKeyboardState(ks);
auto w = WCHAR(malloc(1));
ToUnicodeEx(wParam, MapVirtualKey(wParam, MAPVK_VK_TO_VSC), ks, LPWSTR(&w), 1, 0, keyboard_layout);
wcout << "KEY:" << w << endl;

当按下 SHIFT+ASHIFT+2 时,代码的行为直接改变为

KEY:A
KEY:B
KEY:@

我在 ToUnicodeToAsciiExToAscii 上试过,它们显示的情况与上述相同。

我在名为 hook.dll 的单独 DLL 文件中使用了 WH_KEYBOARD Hook ,并与控制台应用程序链接。

所以我的问题是:为什么 GetKeyState 函数启用了 SHIFTCaps Lock 键的检测?此外,

最佳答案

使用 auto w = WCHAR(malloc(1)) 是错误的。 malloc() 动态分配一个字节 block ,而不是字符 block 。 WCHAR 的大小为 2 个字节,但您只分配了 1 个字节。这无关紧要,因为无论如何您都不使用指针。您正在将指针类型转换为单个 WCHAR,截断指针值。然后您在将 &w 传递给 ToUnicodeEx() 时忽略该值,因为它将覆盖 w 的值。然后您将泄漏分配的内存,因为您没有调用 free() 来释放它。

你根本不需要 malloc():

WCHAR w;
ToUnicodeEx(..., &w, 1, ...);
wcout << "KEY:" << w << endl;

但是,ToUnicodeEx() 可能会返回超过 2 个字符,因此您应该分配额外的空间来解决这个问题。只需使用本地固定数组,就像您对 GetKeyboardState() 所做的那样。并注意返回值,它包含重要信息。

至于按键状态,因为你正在调用GetKeyboardState(),所以你不需要使用GetKeyState()

尝试更像这样的东西:

BYTE ks[256];
auto keyboard_layout = GetKeyboardLayout(0);
GetKeyboardState(ks);

if (ks[VK_SHIFT] & 0x80) wcout << L"Shifted!" << endl;
if (ks[VK_CAPITAL] & 0x80) wcout << L"Caps!" << endl;

WCHAR w[5] = {};
int ret = ToUnicodeEx(wParam, MapVirtualKey(wParam, MAPVK_VK_TO_VSC), ks, w, 4, 0, keyboard_layout);
switch (ret)
{
case -1:
wcout << L"DEAD KEY:" << w << endl;
break;
case 0:
wcout << L"NO TRANSLATION" << endl;
break;
case 1:
wcout << L"KEY:" << w << endl;
break;
case 2:
case 3:
case 4:
w[ret] = 0;
wcout << L"KEYS:" << w << endl;
break;
}

关于c++ - 为什么 GetKeyState 改变了 ToUnicodeEx 的行为?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42037204/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com