VB.NET如何使用SendMessage发送键46(Chr(46))

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

我正在使用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函数如下所示:

<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