从 vb.net 中的表单外部获取突出显示的文本

Posted

技术标签:

【中文标题】从 vb.net 中的表单外部获取突出显示的文本【英文标题】:Get the highlighted text from outside of form in vb.net 【发布时间】:2020-10-13 23:19:13 【问题描述】:

我想使用 vb.net 从 winform 外部复制突出显示的文本。 例如,如果用户在浏览器或记事本中突出显示文本,则应将其复制到 winform 的文本框中。 任何帮助都会很棒! 提前致谢。

【问题讨论】:

您似乎想要一个通用的 select=copy。我不知道是否有一种不错的基于事件的方法可以从中获取文本值。所以我会尝试使用轮询来阻止它:每 0.1 秒发送一次ClipBoard.Copy(),检查它是否自上次以来发生了变化,change=show in form。未更改=将剪贴板重置为旧值。 这个问题相当于 C#:***.com/questions/21460943/… 你可以使用这样的东西:Move window when external application's window moves。现在,该代码挂钩一个特定的窗口句柄,但当然您可以更改它以挂钩前景窗口(接收鼠标输入的活动窗口)。该事件必须设置为EVENT_OBJECT_TEXTSELECTIONCHANGED,而该代码当然使用EVENT_OBJECT_LOCATIONCHANGE。请注意,您只需要挂钩主窗口。任何具有通知文本选择更改的自动化 TextPattern 的子窗口都会通知文本选择更改。 @Fixation 所有这些代码都假设子 Windows 有一个句柄。这仅适用于 Win32/WinForms 控件。 WPF/UWP 无窗口控件没有句柄。另外,您需要不断轮询,这意味着用户活动可能会因此而中断。 您还需要删除... && idObject == (Hook.SWEH_ObjectId)Hook.SWEH_CHILDID_SELF 条件,因为添加它是为了防止子对象通知激活相同的过程,而现在您需要它们。 【参考方案1】:

好的! 感谢this 链接,我得到了答案。

我的逻辑首先是用户将突出显示一个值,而不是特定于浏览器,而是在任何地方。 然后用户将按下热键,在我的情况下是 F8。然后代码将触发复制命令,然后检索剪贴板值并将其分配给文本框文本。 这是完整的代码以及帮助类。

Hotkey.vb

 Public Class Hotkey

#Region "Declarations - WinAPI, Hotkey constant and Modifier Enum"
    ''' <summary>
    ''' Declaration of winAPI function wrappers. The winAPI functions are used to register / unregister a hotkey
    ''' </summary>
    Private Declare Function RegisterHotKey Lib "user32" _
    (ByVal hwnd As IntPtr, ByVal id As Integer, ByVal fsModifiers As Integer, ByVal vk As Integer) As Integer

    Private Declare Function UnregisterHotKey Lib "user32" (ByVal hwnd As IntPtr, ByVal id As Integer) As Integer

    Public Const WM_HOTKEY As Integer = &H312

    Enum KeyModifier
        None = 0
        Alt = &H1
        Control = &H2
        Shift = &H4
        Winkey = &H8
    End Enum 'This enum is just to make it easier to call the registerHotKey function: The modifier integer codes are replaced by a friendly "Alt","Shift" etc.
#End Region


#Region "Hotkey registration, unregistration and handling"
    Public Shared Sub registerHotkey(ByRef sourceForm As Form, ByVal triggerKey As String, ByVal modifier As KeyModifier)
        RegisterHotKey(sourceForm.Handle, 1, modifier, &H77)
    End Sub
    Public Shared Sub unregisterHotkeys(ByRef sourceForm As Form)
        UnregisterHotKey(sourceForm.Handle, 1)  'Remember to call unregisterHotkeys() when closing your application.
    End Sub
    Public Shared Sub handleHotKeyEvent(ByVal hotkeyID As IntPtr)
        SendKeys.Send("^(c)") 'for Ctrl-C[/CODE]
    End Sub
#End Region

End Class

此部分将触发热键代码并执行其余逻辑

主窗体

'This Program will wait for a key to press in our case it will wait for the F8 key to be press
'Then it will copy the highlighted text (Outside and Inside of the form) and will concatinate the text with a webaddress'

Imports Name_Of_Your_Project.Hotkey
Public Class Form1

    
    'This Chunk of code will register the F8 key as a main key for the Program'
    Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
        Hotkey.registerHotkey(Me, "f8", Hotkey.KeyModifier.None)
    End Sub
    'This sub will trigger the Hotkey Sub Code in the Hotkey.vb Class'

    Protected Overrides Sub WndProc(ByRef m As System.Windows.Forms.Message)
        If m.Msg = Hotkey.WM_HOTKEY Then
            Hotkey.handleHotKeyEvent(m.WParam)

            'After pressing the F8 key It will copy the highlighted data from anywhere and store it to the clipboard'
            If Clipboard.ContainsText Then
               
                Try
                   
                    Textbox1.text = My.Computer.Clipboard.GetData(DataFormats.Text).ToString
                Catch ex As Exception
                    MessageBox.Show("Error in Program" + ex.ToString())
                End Try
            End If
        End If
            MyBase.WndProc(m)



    End Sub
    'System wide hotkey event handling




End Class

【讨论】:

以上是关于从 vb.net 中的表单外部获取突出显示的文本的主要内容,如果未能解决你的问题,请参考以下文章

vb.net 为 datagridviewcombobox 中的每个项目显示工具提示文本

VB.Net 和 Access - 获取累加器值

C#/VB.NET 获取Excel中的表单控件

如何使用 VB.net 获取 Windows 控制台应用程序的文本?

使用 user32.dll 从 vb.net 中的 javascript 警报框中获取文本

有没有办法在 VB.Net 中突出显示 If - End If 语句