我正在使用 VB.net 自动化 IBM iSeries Emulators,创建的 GUI 使用“SetParent”API 将外部 iSeries Emulator 窗口嵌入到 WindowsForm 面板中。为了与 iSeries 窗口通信,我使用 SendMessage API 将密钥发送到屏幕。我知道 .net 中的 sendkeys.keys,但这样我就不必 SetForegroundWindow 并重新激活我的表单。
我的程序读取秤的输出并验证接收到的数据是否良好,如果是,它将使用以下代码将输出发送到 iSeries 屏幕(UserApi 是我的 Lib):
For Each element As Char In CStr(txtto400.Text)
UserApi.SendMessage(as400WindowHandle, 256, CType(Convert.ToInt32(element), IntPtr), CType(0, IntPtr))
Next
我在其他项目上这样做了几次,这种方法效果很好,但在我的 TextBox (txtto400.Text) 中,我的体重有一个像“000.88 KG”这样的值。SendMessage 不会发送作为句点 (.) 的密钥“46”,而是“00088 KG”
有谁知道为什么这不起作用?有什么建议我能做什么?
编辑:
感谢 Paul 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
我创建了一个包含 VK_OEM_PERIOD 的变量:
Public Const VK_OEM_PERIOD = &HBE
创建了一个检查 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