微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

VB .Net-将字符串发送到另一个应用程序

如何解决VB .Net-将字符串发送到另一个应用程序

从VB .Net,我试图将字符串发送到另一个应用程序的文本框,但无法使其正常工作。我可以获取句柄,甚至可以将焦点设置到文本框,但是我的SendMessage函数似乎不正确,因为我收到错误消息“ SendMessage”使堆栈不平衡。这可能是因为托管的PInvoke签名确实与非托管目标签名不匹配。请检查PInvoke签名的调用约定和参数是否与非托管目标签名匹配。“

这是我的代码

Module Module1

    Private Const WM_SETTEXT As Int32 = &HC

    Private Declare Function SetForegroundWindow Lib "user32" (ByVal hwnd As IntPtr) As Long
    Private Declare Auto Function FindWindow Lib "user32" (ByVal lpClassName As String,ByVal lpWindowName As String) As IntPtr
    Private Declare Auto Function findwindowex Lib "user32" (ByVal hwndParent As IntPtr,ByVal hwndChildAfter As IntPtr,ByVal lpszClass As String,ByVal lpszWindow As String) As IntPtr
    Private Declare Auto Function SendMessage Lib "user32" (ByVal hwnd As IntPtr,ByVal wMsg As Long,ByVal wParam As Long,ByVal lParam As String) As IntPtr

    Sub Main()
        Dim AppHwnd As IntPtr = FindWindow(vbNullString,"Test Application"
        Dim WinHwnd1 As IntPtr = findwindowex(AppHwnd,0&,"SWT_Window0",vbNullString)
        Dim WinHwnd2 As IntPtr = findwindowex(WinHwnd1,vbNullString)
        Dim WinHwnd3 As IntPtr = findwindowex(WinHwnd2,vbNullString)
        Dim TextBoxHwnd1 As IntPtr = findwindowex(WinHwnd3,"Edit",vbNullString)
        Dim TextBoxHwnd2 As IntPtr = findwindowex(WinHwnd3,TextBoxHwnd1,vbNullString)

        MsgBox(TextBoxHwnd2)
        SetForegroundWindow(TextBoxHwnd2)

        SendMessage(TextBoxHwnd2,WM_SETTEXT,"text")

    End Sub

End Module

“ MsgBox(TextBoxHwnd2)”行返回我使用Window Detective找到的句柄号,因此我假设到目前为止,代码是正确的。另外,我测试了“ SetForegroundWindow(TextBoxHwnd1)”,光标位于第一个文本框上,而“ SetForegroundWindow(TextBoxHwnd1)将光标置于第二个文本框上。

解决方法

您的声明看起来可能已从旧版VB代码迁移而来,其中Long是32位整数,而Integer仅是16位(可追溯到旧版VB的16位起源视窗)。在转换到通用32位Windows之后创建的.NET中,数据类型的长度发生了变化,因此Integer是32位,而Long是64位。

此外,Windows API本身需要针对64位Windows进行更新。 SendMessage是其中一些参数在64位较长的函数之一,因为它们应保留指针。

我检查了SendMessage的本机头文件声明,发现:

  • 参数Msg声明为UINT,它对应于VB中的Integer。无论您使用的是32位还是64位版本,都需要对此进行更改。
  • 参数wParam被声明为UINT_PTR,因此对于64位版本,实际上应该为Long,对于32位版本,实际上应该为Integer。如果可以将其声明为IntPtr,然后将0传递给它,那可能是最好的选择,因为它会根据您是为32位还是64位编译而自动调整长度。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。