如何以编程方式从记事本复制文本并将其粘贴到我的 vb 网络应用程序中的特定文本框中?

How can I programmaticaly copy text from notepad and paste it into specific textboxes in my vb net app?

我正在尝试制作一个程序,可以从记事本复制字符串并将其粘贴到我的 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 功能就一直以不可靠着称。尽管这些年来情况有所好转,但它仍然很随机。这是当前版本 (https://docs.microsoft.com/en-us/dotnet/api/system.windows.forms.sendkeys?view=net-5.0) 的部分警告:

The SendKeys class is susceptible to timing issues, which some developers have had to work around. The updated implementation is still susceptible to timing issues, but is slightly faster and may require changes to the workarounds. The SendKeys class tries to use the previous implementation first, and if that fails, uses the new implementation. As a result, the SendKeys class may behave differently on different operating systems.

具体而言,时间和焦点是问题,响应击键应该发生的大部分事情需要活动应用程序的响应和处理,这可能会覆盖预期的行为,甚至需要很长时间才能决定 not 覆盖内置的 windows 行为。对于 SendKeys 的所有用途,我的第一条建议始终是:尝试寻找任何其他没有 SendKeys 的方法来做到这一点。您可能会考虑的评论中有两种不同的方式 described/linked。

如果您决定坚持使用 SendKeys,那么这些是我能想到的唯一建议 可能 帮助:

  1. 在 (^c) 之后再添加一个 Thread.Sleep

  2. 发送 (^c) 两次,中间稍等。或者甚至让代码 运行 整个例程两次,中间有一个睡眠(是的,我知道这有多愚蠢)。

  3. 请尝试使用 SendKeys.SendWait

  4. 尝试将以下部分添加到您的 App.config 文件中:

    <应用设置>

请注意,有迹象表明 (3) 和 (4) 可能无法同时使用。两种方式都试试看。