VB.NET如何使用SendMessage发送键46(Chr(46))
我正在使用VB.net自动化IBM iSeries仿真器,这是一个创建的GUI,它使用“SetParent”API将外部iSeries仿真器窗口嵌入WindowsForm面板中。。为了与iSeries窗口通信,我使用SendMessageAPI将密钥发送到屏幕。我知道.net中有sendkeys.keys,但这样我就不必设置ForeGroundWindow并重新激活我的表单 我的程序读取天平的输出并验证接收到的数据是否良好,如果良好,它将使用以下代码将输出发送到iSeries屏幕(UserApi是我的库): 我在其他项目上做过几次,这种方法效果很好,但在我的文本框(txtto400.Text)中,我的体重有一个类似“000.88公斤”的值。 SendMessage不会发送一个句点(.)的键“46”,而是“00088 KG” 有人知道为什么这不起作用吗?有什么建议我可以做吗 编辑: 多亏了保罗B,他给了我这个暗示。 下面是我如何解决的 我的SendMessage函数如下所示:VB.NET如何使用SendMessage发送键46(Chr(46)),vb.net,winapi,Vb.net,Winapi,我正在使用VB.net自动化IBM iSeries仿真器,这是一个创建的GUI,它使用“SetParent”API将外部iSeries仿真器窗口嵌入WindowsForm面板中。。为了与iSeries窗口通信,我使用SendMessageAPI将密钥发送到屏幕。我知道.net中有sendkeys.keys,但这样我就不必设置ForeGroundWindow并重新激活我的表单 我的程序读取天平的输出并验证接收到的数据是否良好,如果良好,它将使用以下代码将输出发送到iSeries屏幕(UserApi
<DllImport("user32.dll", CharSet:=CharSet.Auto, SetLastError:=True)> _
Public Shared Function SendMessage( _
ByVal hwnd As IntPtr, _
ByVal wMsg As UInt32, _
ByVal wParam As IntPtr, _
ByVal lParam As IntPtr) As IntPtr
End Function
创建了一个用于检查Chr的函数:
Public Function vk_key(key As Char) As Integer
Select Case key
Case Is = Chr(46)
Return VK_OEM_PERIOD
Case Else
Return AscW(key)
End Select
End Function
下面是我将其传递到iSeries窗口的方式:
For Each element As Char In txtto400.Text
UserApi.SendMessage(as400WindowHandle, 256, vk_key(element), 0)
Next
WM_KEYDOWN
消息预期“非系统密钥的虚拟密钥代码”为wParam(请参阅)
这恰好对应于字母数字符号的键字符ASCII值,而不是所有其他键的ASCII值。在一段时间内,我认为您需要发送VK\u OEM\u period
您可以在此处找到虚拟密钥代码表:我们需要查看SendMessage函数的代码,以帮助您完成此任务。WM_KEYDOWN已发布,未发送。并使用虚拟键,而不是字符。考虑发送WMQCHAR代替,消息258。这样做了,谢谢!这一切现在都有意义了,它适用于所有字母和数字键,但不适用于其他键。。如果我检查字符是否为“.”并在该点发送VK_OEM_PERIOD,它就会工作。。我将创建一个函数来检查字符,然后将值转换为虚拟密钥代码,我应该可以开始了。再次感谢!
Public Function vk_key(key As Char) As Integer
Select Case key
Case Is = Chr(46)
Return VK_OEM_PERIOD
Case Else
Return AscW(key)
End Select
End Function
For Each element As Char In txtto400.Text
UserApi.SendMessage(as400WindowHandle, 256, vk_key(element), 0)
Next