VB.NET – Zwischenablage einer bestimmten Anwendung überwachen & bearbeiten

 in Entwicklung

Mein Ziel war es, den Zwischenspeicher (Kopieren) einer bestimmten Anwendung zu überwachen und automatisiert im Hintergrund zu bearbeiten.
In meinem Fall handelt es sich um einen Firefox-Browser mit dem eine bestimmte Webseite aufgerufen wird, aus der der kopierte Inhalt überwacht werden muss. Wird ein kopierter Text erkannt, werden automatisch Zeichen ersetzt bzw. entfernt.
Das kopieren findet rein mit STRG + C statt, da ein Rechtsklick + kopieren auf Grund einer Blockierung nicht erlaubt ist.

OSPortal_Clipoboard_ControlSo findet eine kleine Fenstererkennung statt, anhand der dann entschieden wird, ob der Zwischenspeicher bearbeitet werden muss oder eben nicht. In meinem Fall haben die Fenster (Fenster-Titel) immer einen festen Wert enthalten, der die Erkennung so erleichtert.

Ich bin beruflich eher in der Infrastruktur & der Technik angesiedelt, anstatt in der Entwicklung und wäre über Verbesserungsvorschläge in den Kommentaren auch dankbar. Vom Prinzip her tut die kleine Anwendung aber genau das was sie tun soll.

1. Fügst du die Imports-Anweisungen ein.

1
2
Imports System.Diagnostics.Process
Imports System

2. Deklarierst die Funktionen.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
    Private Declare Function GetForegroundWindow Lib "user32" Alias "GetForegroundWindow" () As IntPtr
    Private Declare Auto Function GetWindowText Lib "user32" (ByVal hWnd As System.IntPtr, ByVal lpString As System.Text.StringBuilder, ByVal cch As Integer) As Integer
 
 
    'Gibt den aktuellen Wert des Fenstertitels im Vordegrund an.
    Private Function GetCaption() As String
        Dim Caption As New System.Text.StringBuilder(256)
        Dim hWnd As IntPtr = GetForegroundWindow()
        Try
            GetWindowText(hWnd, Caption, Caption.Capacity)
            Return Caption.ToString()
        Catch ex As Exception
        End Try
    End Function
 
    'Gibt nicht genutzten Arbeitsspeicher frei
    Private Declare Auto Function SetProcessWorkingSetSize Lib "kernel32.dll" (ByVal procHandle As IntPtr, ByVal min As Int32, ByVal max As Int32) As Boolean
 
    'Prüft das drücken von Tastatureingaben
    Declare Function GetAsyncKeyState Lib "user32" (ByVal vKey As Integer) As Short

3. Wird der Anwendung beim starten gesagt, dass sie sich in den Tray-Bereich minimieren soll. Gleichzitig wird geprüft ob die Anwendung bereits läuft. Wenn ja, wird diese kein zweites mal gestartet.

1
2
3
4
5
6
7
8
9
10
11
12
    Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
        ' Zeigt Anwendung im Tray 
        Me.Hide()
        Me.ShowInTaskbar = False
 
        'Zeigt das Icon + Anwendungsbeschreibung im Tray-Bereich an
        With NotifyIcon1
            .Icon = My.Resources.Keyboard
            .Text = "Clipboard Control"
            .Visible = True
        End With
    End Sub

4. Die wichtigste Funktion ist nun der Timer. Diesen habe ich auf ein Interval = 40 gestellt. Hier wird der Titel des aktuellen Fensters geprüft und bei Übereinstimmung mit einer IF-Abfrage festgelegt was passieren soll.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
    Private Sub Timer1_Tick(sender As Object, e As EventArgs) Handles Timer1.Tick
 
        'Gibt freien Arbeitsspeicher frei
        SetProcessWorkingSetSize(System.Diagnostics.Process.GetCurrentProcess().Handle, -1, -1)
 
        'Fenstername des aktiven Fensters wird ermittelt.
        Dim makel As String
        Dim CapTxt As String = GetCaption()
        Try
            If makel <> CapTxt Then
                makel = CapTxt
            End If
        Catch ex As Exception
        End Try
 
        Try
            'Prüfung ob Fenstername = Wert ist bzw. = Wert enthält, nur dann wird der Zwischenspeicher bearbeitet
                If CapTxt.Contains("Login Startseite") Or CapTxt.Contains("Login Userbereich") Then
 
                    'Der Text aus der Zwischenablage wird in die RichtextBox1 geschrieben
                    With RichTextBox1
                        'Prüft ob Text in der Zwischenablage vorhanden ist.
                        If Clipboard.ContainsText AndAlso Not .Text = Clipboard.GetText Then
                            'Löschen für neun Text und Schreiben in RichTextBox.
                            .Clear() : .Paste()
                            'Die gewünschten Stellen werden ersetzt durch...
                            RichTextBox1.Text = RichTextBox1.Text.Replace("Hallo", "Tschüss")
                            RichTextBox1.Text = RichTextBox1.Text.Replace("AAA", "aaa")
 
                            'Der Text aus der RichTextBox1 wird zurück an den Zwischenspeicher gegeben
                            Clipboard.SetText(RichTextBox1.Text)
 
                            'Zur Schönheit wird bei kopierten Text die RichTextBox grün gefärbt
                            RichTextBox1.BackColor = Color.LightGreen
                        End If
                    End With
 
                Else
                    'Wird kein Text aus dem gewünschten Programm erkannt, wird die RichTextbox rot gefärbt und erhält einen Hinweistext
                    RichTextBox1.BackColor = Color.MistyRose
                    RichTextBox1.Text = vbNewLine & "              Es konnte kein kopierter Text aus dem Portal erkannt werden!" &; vbNewLine & vbNewLine & "              Die Anwendung überwacht nur kopierte Texte aus" & vbNewLine & "              dem Browser."
                End If
            Else
            End If
 
        Catch ex As Exception
        End Try
 
        'Beim drücken von Einfügen (STRG + V) wird die RichTextBox2 geleert.
        Dim Copy2 As Boolean = ((GetAsyncKeyState(Keys.ControlKey) And &H8000) <> 0)
        Dim Copy2_2 As Boolean = ((GetAsyncKeyState(Keys.V) And &H8000) <> 0)
        If Copy2 AndAlso Copy2_2 Then
            RichTextBox1.BackColor = Color.White
            RichTextBox1.Text = ""
 
        End If
    End Sub

5. Fügst du einen Button hinzu, mit der du die Anwendung wieder in das Tray minimieren kannst.

1
2
3
4
    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
        Me.Hide()
        Me.ShowInTaskbar = False
    End Sub

6. Wird festgelegt, was bei einem Klick auf das Icon im Tray-Bereich passieren soll

1
2
3
4
5
6
7
8
9
10
11
12
13
    Private Sub NotifyIcon1_Click(ByVal sender As Object,
   ByVal e As System.EventArgs
   ) Handles NotifyIcon1.Click
         ' Öffnet die Anwendung bei Klick
        Me.Show()
        Me.ShowInTaskbar = True
    End Sub
 
    Private Sub NotifyIcon1_DoubleClick(ByVal sender As System.Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles NotifyIcon1.DoubleClick
        ' Öffnetdie Anwendungbei Doppelklick 
Me.Show() 
Me.ShowInTaskbar = True
End Sub

Das war es eigentlich auch schon. Die Anwendung prüft nunmehr, ob das Fenster im Vordergrung den Wert „Portal Startseite“, „Fenster1“ oder „Fenster2“ hat. Wenn ja, wird über die .Replace-Funktion die gewünschten Zeichen ersetzt.
Ich habe das ganze mit einer TryCatch-Funktion eingebunden, damit hier alle Fehlermeldungen umgangen werden. Man verteufelt es diese Funktion oft, aber sicher ist sicher.

Die Anwendung läuft im Hintergrund auf 0% CPU-Last und benötigt ca. 300kb Arbeitsspeicher, womit man hier eigentlich nicht nennenswerte Werte erhält.

Download: Beispiel Projekt – Clipboard Control



Schreibe deinen Suchbegriff und drücke Enter oder auf die Lupe