C++ printf WORD* (ToAscii)

C++ printf WORD* (ToAscii)

本文关键字:ToAscii printf WORD C++      更新时间:2023-10-16

我使用钩子,我有一个vkCode和一个scanCode,所以我使用命令ToAscii()如下:

...
LPWORD wCharacter;
ToAscii(kbdStruct.vkCode, kbdStruct.scanCode, keyboard_state, wCharacter, 0);

所以现在wCharacter应该保持Ascii字符对吗?

我该怎么打印出来?

我试过:printf(wCharacter);,但上面写着:";无法将"WORD*"转换为"const char*">

我做错了什么?如何打印单词*?还是我的ToAscii命令做错了?

WORD和ToAscii()都不是标准C++,所以回答这个问题有点棘手。然而,无论如何有两个问题:
  • printf()第一个参数应该是一个格式字符串。你没有提供任何
  • 字符串是以零字节结尾的一系列字符。如果您想打印出作为参数传递的单个字符,假设WORD是整型的,您可以使用"%c"格式的字符串

您不会对此做太多,您将向ToAscii()传递一个未初始化的指针。正确的代码应该是这样的:

WORD wCharacter[2];
int len = ToAscii(kbdStruct.vkCode, kbdStruct.scanCode, keyboard_state, wCharacter, 0);
if (len == 1) printf("%c", wCharacter[0]);
if (len == 2) printf("%c", wCharacter[1]);

这应该在一定程度上编译并运行。在实践中,你无法获得这种可靠性。您传递的*keyboard_state*变量应该是拥有前台窗口的进程的键盘状态。您应该注意该进程中活动的键盘布局(请参阅ToAsciiEx)。这不能与低级键盘挂钩一起使用。键盘记录器必须使用WH_CALLWNDPROC挂钩来拦截WM_CHAR消息(我认为从未编写过)很难做到这一点,需要一个可以注入其他进程的DLL。你当然是在发明轮子,购买而不是建造是最好的建议。也会让你的用户对你的意图更加放心。

LPWORD wCharacter
是指向单词的长指针。这里的字是两个字节的整数,而不是"0";单词";在一句话中。基本上是int16。printf会将其处理为.

printf("%hd", *wCharacter );
  1. 其中h表示16位值
  2. d指定一个整数
  3. *wCharacter是取消引用的指针或int的值

如果您希望打印值反映为未签名

printf("%hu", *wCharacter );

无符号十六进制

printf("%hx", *wCharacter );

带大写字母的无符号十六进制

printf("%hX", *wCharacter );

既然已经说了这么多,你的WORD int可能是一个Unicode字符或两字节字符,相当于一个正常的8位标准字符。

在unicode中,如果您仍将标准ascii字符表示为与某些阿拉伯语或中文字符并列,则可以将unicode字符转换为标准字符通过忽略第一个字节。

LPWORD wCharacter;
char *pChar = (char*)wCharacter;
printf("%c", pChar[1]);
  1. 声明pChar为指向8位值(char)的指针
  2. 将pChar地址设置为WORD指针
  3. 将pChar指针用作数组,并将其递增到秒字节[1]

如果您不使用国际字符集,这会起作用。