2

我正在使用 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
4

1 回答 1

1

WM_KEYDOWN消息需要“非系统密钥的虚拟密钥代码”作为 wParam(请参阅MSDN)。

这恰好对应于字母数字符号的键字符的 ASCII 值,但不对应于所有其他键。在一段时间内,我认为您需要发送VK_OEM_PERIOD.

您可以在此处找到虚拟键代码表:http: //msdn.microsoft.com/en-us/library/windows/desktop/dd375731%28v=vs.85%29.aspx

于 2012-06-14T16:40:54.887 回答