我使用VB.net自动化IBM iSeries仿真器,创建了使用“SetParent”API在WindowsForm面板中嵌入外部iSeries仿真器窗口的GUI。要与iSeries窗口通信,我使用SendMessage API将Key发送到屏幕。我知道.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”
有谁知道为什么这不起作用?有什么建议我可以做什么?
以下是我如何解决它。
我的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
答案 0 :(得分:1)
WM_KEYDOWN
消息需要“非系统密钥的虚拟密钥代码”为wParam(参见MSDN)。
这恰好对应于字母数字符号的关键字符的ASCII值,但不对应所有其他键。在一段时间内,我认为您需要发送VK_OEM_PERIOD
。
您可以在此处找到虚拟键代码表:http://msdn.microsoft.com/en-us/library/windows/desktop/dd375731%28v=vs.85%29.aspx