我正在使用钩子,我有一个vkCode和一个scanCode,所以我正在使用命令ToAscii():
...
LPWORD wCharacter;
ToAscii(kbdStruct.vkCode, kbdStruct.scanCode, keyboard_state, wCharacter, 0);
那么现在wCharacter应该保持Ascii角色吗?
如何打印出来?
我试过:printf(wCharacter);
但它说:“无法将'WORD *'转换为'const char *'”
我做错了什么?如何打印出WORD *? - 或者我做ToAscii命令错了吗?
非常感谢。
答案 0 :(得分:1)
WORD和ToAscii()是标准的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 );
如果您希望您的打印值将其反映为无符号
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]);
如果您不使用国际字符集,这会起作用。