Vb.net 如何编程从记事本复制文本并将其粘贴到vb net应用程序中的特定文本框中?

Vb.net 如何编程从记事本复制文本并将其粘贴到vb net应用程序中的特定文本框中?,vb.net,copy-paste,Vb.net,Copy Paste,我正在尝试制作一个程序,可以从记事本中复制字符串,并将其粘贴到我的windows窗体应用程序中的特定文本框中 例如,假设我有一个文本框,其中包含5个不同的字符串,每个字符串位于不同的行中。所以我的程序包含5个文本框 我想用一个单一的按钮从记事本第1行字符串到文本框1,从第2行字符串到文本框2等按下 Imports System.Threading Public Class Form1 Const MOUSEEVENTF_LEFTDOWN As UInteger = &H2

我正在尝试制作一个程序,可以从记事本中复制字符串,并将其粘贴到我的windows窗体应用程序中的特定文本框中

例如,假设我有一个文本框,其中包含5个不同的字符串,每个字符串位于不同的行中。所以我的程序包含5个文本框

我想用一个单一的按钮从记事本第1行字符串到文本框1,从第2行字符串到文本框2等按下

Imports System.Threading
Public Class Form1
    Const MOUSEEVENTF_LEFTDOWN As UInteger = &H2
    Const MOUSEEVENTF_LEFTUP As UInteger = &H4

    Private Sub Form1_MouseMove(sender As Object, e As MouseEventArgs) Handles MyBase.MouseMove
        'TextBox1.Text = e.Location.ToString()
    End Sub

    Private Sub Timer1_Tick(sender As Object, e As EventArgs) Handles Timer1.Tick
        TextBox1.Text = MousePosition.ToString()
    End Sub

    Public Declare Sub mouse_event Lib "user32" (ByVal dwFlags As UInteger, ByVal dx As UInteger, ByVal dy As UInteger, ByVal dwData As UInteger, ByVal dwExtraInfo As Integer)

    Public Sub LeftClick()
        mouse_event(MOUSEEVENTF_LEFTDOWN, 0, 0, 0, 0)
        Thread.Sleep(100) 'Wait required
        mouse_event(MOUSEEVENTF_LEFTUP, 0, 0, 0, 0)
    End Sub

    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
        Windows.Forms.Cursor.Position = New Point(40, 78)
        LeftClick()
        LeftClick()
        Thread.Sleep(200)
        SendKeys.Send("^c")
        Me.BringToFront()
        TextBox2.Clear()
        Thread.Sleep(200)
        TextBox2.Paste()
        'SendKeys.Send("^v")
        Thread.Sleep(300)
    End Sub

    Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click
        Windows.Forms.Cursor.Position = New Point(41, 97)
        LeftClick()
        LeftClick()
        Thread.Sleep(200)
        SendKeys.Send("^c")
        Thread.Sleep(200)
        Me.BringToFront()
        TextBox3.Clear()
        Thread.Sleep(200)
        TextBox3.Paste()
        'SendKeys.Send("^v")
    End Sub

    Private Sub Button3_Click(sender As Object, e As EventArgs) Handles Button3.Click
        Windows.Forms.Cursor.Position = New Point(32, 116)
        LeftClick()
        LeftClick()
        Thread.Sleep(200)
        SendKeys.Send("^c")
        Thread.Sleep(200)
        Me.BringToFront()
        TextBox4.Clear()
        Thread.Sleep(200)
        TextBox4.Paste()
    End Sub

    Private Sub Button4_Click(sender As Object, e As EventArgs) Handles Button4.Click
        Windows.Forms.Cursor.Position = New Point(28, 133)
        LeftClick()
        LeftClick()
        Thread.Sleep(200)
        SendKeys.Send("^c")
        Thread.Sleep(200)
        Me.BringToFront()
        TextBox5.Clear()
        Thread.Sleep(200)
        TextBox5.Paste()
    End Sub

    Private Sub Button5_Click(sender As Object, e As EventArgs) Handles Button5.Click
        Windows.Forms.Cursor.Position = New Point(23, 151)
        LeftClick()
        LeftClick()
        Thread.Sleep(200)
        SendKeys.Send("^c")
        Thread.Sleep(200)
        Me.BringToFront()
        TextBox6.Clear()
        Thread.Sleep(200)
        TextBox6.Paste()
    End Sub

    Private Sub Button7_Click(sender As Object, e As EventArgs) Handles Button7.Click
        Button1.PerformClick()
        Thread.Sleep(5000)
        Button2.PerformClick()
        Thread.Sleep(5000)
        Button3.PerformClick()
        Thread.Sleep(5000)
        Button4.PerformClick()
        Thread.Sleep(5000)
        Button5.PerformClick()
    End Sub

    Private Sub Button6_Click(sender As Object, e As EventArgs) Handles Button6.Click
        TextBox2.Clear()
        TextBox3.Clear()
        TextBox4.Clear()
        TextBox5.Clear()
        TextBox6.Clear()
    End Sub
End Class

我试过类似的方法,但没用。如果我手动按下按钮,有时会执行此操作,但大多数按钮只会将第一个字符串复制粘贴到所有文本框。

只要我一直使用VB(30年),SendKeys功能就出了名的不可靠。虽然这些年来情况有所好转,但仍然很随机。以下是来自当前版本()的部分警告:

SendKeys类易受时间问题的影响,有些 开发人员不得不四处工作。更新的实现是 仍然容易受到时间问题的影响,但速度稍快,可能 需要更改解决方案。SendKeys类尝试使用 前一个实现首先执行,如果失败,则使用新的 实施因此,SendKeys类的行为可能会有所不同 在不同的操作系统上

具体地说,时间和焦点是问题,响应击键时应该发生的许多事情都需要活动应用程序的响应和处理,这可能会覆盖预期的行为,甚至需要很长时间才能决定不覆盖内置的windows行为。对于SendKeys的所有用途,我的第一条建议始终是:在没有SendKeys的情况下,尝试其他方法来实现这一点。在你可以考虑的评论中描述/链接了两种不同的方式。

如果您决定坚持使用SendKeys,那么如果这可能会有所帮助,我只能提出以下建议:

  • 在(^c)之后立即添加另一个
    线程。Sleep

  • 发送(^c)两次,中间等待。甚至让代码在中间休息的情况下运行整个例程两次(是的,我知道这有多愚蠢)

  • 尝试改用
    SendKeys.SendWait

  • 尝试将以下部分添加到App.config文件:


  • 注意,有迹象表明(3)和(4)可能无法一起工作。两种方法都可以试试。

    Quick search发现不需要所有这些,只需使用对象的UI Automation属性的方法即可。您不需要单击stuff或其他任何内容,只需读取属性值即可。我怀疑
    Me.BringToFront()
    正在将焦点从记事本更改为程序,以便以后的
    SendKeys
    将以您自己的形式而不是记事本。我建议您1)首先在记事本中执行全选(^a),以便副本(^c)一次获取所有行,然后2)跳过
    Me.BringToFront()
    和键盘粘贴(^v),而是3)将所有文本直接从粘贴缓冲区获取到VB字符串,然后4)使用
    Split()将其解析到字符串数组中
    最后5)遍历数组并将每一行分配给每个
    文本框。Text
    @Jimi,如何将其应用于记事本之类的外部应用程序?我读了链接页面,但它没有说什么。显然,任何摆脱SendKeys的方法都是一个好主意。实际上,我以记事本为例。事实上,我想从另一个程序的窗口获取数据(数字),而我没有其他访问权限。这些数字都在一个特定的位置,这就是我使用新的.point函数的原因。非常感谢。“sendwait”完成了任务!!!