Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/apache-kafka/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 将字符转换为虚拟密钥代码_C#_.net_Winapi_Keycode - Fatal编程技术网

C# 将字符转换为虚拟密钥代码

C# 将字符转换为虚拟密钥代码,c#,.net,winapi,keycode,C#,.net,Winapi,Keycode,我有一个值字符串,我想为每个字符模拟窗口中的按键事件 我计划将事件发送到窗口(因为手动按下一个键时似乎会发生这种情况) 这些消息需要在wParam中基于一个列表发送一个int。我可以循环遍历字符串并获取每个字符,但是如何获取该字符并将其转换为对应于虚拟键代码的值呢?Convert.ToInt32()不起作用。它似乎接受ASCII字符并将其转换为十六进制。例如,十六进制中的“A”是41。根据您的图表,A是0x41,这是正确的(0x引爆十六进制)。一般来说,您应该直接使用(首选)或(不推荐)消息,而

我有一个值字符串,我想为每个字符模拟窗口中的按键事件

我计划将事件发送到窗口(因为手动按下一个键时似乎会发生这种情况)


这些消息需要在wParam中基于一个列表发送一个int。我可以循环遍历字符串并获取每个字符,但是如何获取该字符并将其转换为对应于虚拟键代码的值呢?Convert.ToInt32()不起作用。

它似乎接受ASCII字符并将其转换为十六进制。例如,十六进制中的“A”是41。根据您的图表,A是0x41,这是正确的(0x引爆十六进制)。

一般来说,您应该直接使用(首选)或(不推荐)消息,而不是发送
WM\u KEYDOWN
WM\u CHAR
WM\u keydup
.

您可以使用提供高级api的库来模拟按键操作,并处理所有低级内容。

发送WM_KEYDOWN/UP很麻烦。应用程序本身已经使用修改键(Shift、Alt、Ctrl)的状态和键盘布局将WM_KEYDOWN消息转换为WM_CHAR。这两个都不是你能控制的,你会随机得到错误的字符

只需发送WM_CHAR消息,将wparam设置为字符代码。无需担心LPRAM,很少有应用程序使用过它。

是一个WinForms类,带有静态方法,用于在活动窗口上模拟键盘输入


问题是.NET无法在另一个应用程序中聚焦windows(讨论如何绕过它)。

一般的解决方案是使用WinAPI函数。描述
SendMessage
的签名,并提供导入示例

哦,为了映射VK代码,你应该使用它-最好假设映射是任意的,而不是逻辑的。

有人吗?根据MSDN it:

“将字符转换为相应的虚拟密钥代码和移位状态。”


(您也可以使用,但请注意,它已被VkKeyScanEx取代。)

无法使用SendInput或keybd_事件,因为它似乎不存在,我可以指定窗口句柄。我需要能够发送消息,即使窗口没有焦点。我不相信您可以使用输入模拟器指定窗口句柄。即使窗口没有焦点,我也希望发送消息。它似乎确实可以工作,至少在这个应用程序中是这样。谢谢。没错,这个答案可能是最好的方法,除非你试图用每个键下键/上键做其他事情,否则没有必要发送
WM\u-keydown
WM\u-keydup
消息——没有什么神奇的事情发生。'0x引爆十六进制'啊,低级代码的危险。这个禅小插曲确实解释了很多,也用C++来工作!VkKeyScanEx接受字符和键盘布局::英文布局示例
HKL myKL=LoadKeyboardLayout(“00000409”,0x00000001)然后就是
VkKeyScanEx(yourChar,myKL)这不是我首选的方法,因为它要求目标应用程序位于顶部。Send char with messages不要求目标在顶部可见。