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

时间:2012-06-14 11:53:56

标签: vb.net winapi

我使用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”

有谁知道为什么这不起作用?有什么建议我可以做什么?

编辑:

感谢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

1 个答案:

答案 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