VK_代码中的ASCII字符

VK_代码中的ASCII字符,c,winapi,keycode,shift,C,Winapi,Keycode,Shift,我有一个小的WIN32 C应用程序,我在其中使用该结构。此结构包含按键的VK代码 我尝试将其转换为ASCII字符。为此,我使用了这个函数,它工作得很好 唯一的问题是,一个VK代码可以保留多个字符。 例如: 在我的键盘上(瑞士德语)有一个字符键。。如果我按Shift+。然后它创建一个:。VK代码是相同的。这没问题,我还可以检查是否按下了Shift键或是否激活了Caps Lock 我唯一的问题是:如何获取字符“:”? 我需要这样一个函数: GetKeyChar(vkCode,shift) 我需要这个

我有一个小的WIN32 C应用程序,我在其中使用该结构。此结构包含按键的VK代码

我尝试将其转换为ASCII字符。为此,我使用了这个函数,它工作得很好

唯一的问题是,一个VK代码可以保留多个字符。 例如:

在我的键盘上(瑞士德语)有一个字符键。。如果我按Shift+。然后它创建一个
。VK代码是相同的。这没问题,我还可以检查是否按下了Shift键或是否激活了Caps Lock

我唯一的问题是:如何获取字符“:”? 我需要这样一个函数:

GetKeyChar(vkCode,shift)


我需要这个来获得键盘的“正常”和“移位”值。当然我可以硬编码,但我不喜欢这样做。

您正在寻找的,它返回由该按键生成的unicode字符。

您正在寻找的函数是:ToAscii、ToAsciiEx、ToUnicode、,ToUnicodeEx。

问题在于
KBDLLHOOKSTRUCT
没有进行翻译所需的所有信息。每次按下一个键,你都会收到一条信息。对于Shift+X,您将收到一条输入消息,表示按下了Shift键,另一条消息表示按下了“X”键

您需要调用以获取Shift、Alt、Ctrl(可能还有其他)键的状态。然后调用
ToAsciiEx
ToUnicodeEx
short VkKeyScan(char ch)
API包含了移位信息。它将字符转换为虚拟键代码和移位状态


请参见:

错误的函数,需要tounicodex()。德国键盘上的死键会带来更大的问题。正确的转换需要键盘状态,它是每个进程的属性。您只能轻松获取自己进程的键盘状态,而不是当前具有焦点的进程的键盘状态。我从来没有见过这样的解决方案。实际上,键盘状态是键盘挂钩的每线程。从输入事件手动更新键盘状态数组不是更合适吗?(类似于
BYTE k=kb.vkCode;keystate[k]&=0x80;if(!(kb.flags&LLKHF_UP))keystate[k]|=0x80;
)好的,谢谢。我把GetKeyboardState和ToAsciiEx结合起来,这就成功了。死键不好,但这不是什么大问题。@user786653:是的,你是对的。在钩子中,您可能希望通过事件而不是调用API来维护自己的键盘状态结构。