1

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

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

那么现在 wCharacter 应该持有 Ascii 字符吧?

我怎样才能打印出来?

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

我究竟做错了什么?如何打印 WORD*?还是我做错了 ToAscii 命令?

4

3 回答 3

1

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

  • printf() 第一个参数应该是格式字符串。你没有提供任何东西。
  • 字符串是一个以零字节结尾的字符序列。如果要打印作为参数传递的单个字符,假设 WORD 是 int-ish,则可以使用 "%c" 格式字符串。
于 2012-09-30T21:01:40.387 回答
1

You are not going to get far with this, you are passing an uninitialized pointer to ToAscii(). Proper code should look like this:

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]);

This ought to compile and work, somewhat. In practice you cannot get this reliable. The *keyboard_state* variable you pass should be the keyboard state of the process that owns the foreground window. And you should pay attention to the keyboard layout that's active for that process (see ToAsciiEx). That cannot be made to work with a low-level keyboard hook. A keyboard logger must use a WH_CALLWNDPROC hook instead to intercept WM_CHAR messages (I think, never wrote one). Much harder to get right, that requires a DLL that can be injecting into other processes. You are of course inventing a wheel, buy and not build is the best advice. Also would make your users a bit more comfortable about your intentions.

于 2012-09-30T21:24:55.207 回答
0

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

如果您不使用国际字符集,则此方法有效。

于 2021-03-13T05:03:45.693 回答