C ++ printf WORD *(ToAscii)

时间:2012-09-30 20:54:39

标签: c++ keyboard ascii printf

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

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

那么现在wCharacter应该保持Ascii角色吗?

如何打印出来?

我试过:printf(wCharacter);但它说:“无法将'WORD *'转换为'const char *'”

我做错了什么?如何打印出WORD *? - 或者我做ToAscii命令错了吗?

非常感谢。

3 个答案:

答案 0 :(得分:1)

WORD和ToAscii()是标准的C ++,所以回答这个问题有点棘手。但是,无论如何有两个问题:

  • printf()第一个参数应该是格式字符串。你没有提供任何。
  • String是由零字节终止的字符序列。如果你想打印出作为参数传递的单个字符,假设WORD是int-ish,你可以使用“%c”格式字符串。

答案 1 :(得分:1)

你不会对此有所了解,你将一个未初始化的指针传递给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。你当然是在发明一个轮子,购买而不是建造是最好的建议。同时也会让您的用户对您的意图更加满意。

答案 2 :(得分:0)

LPWORD wCharacter;
是一个指向单词的长指针。这里的单词是两个字节的整数,而不是句子中的“单词”。它基本上是一个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];

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