VB.NET – Zwischenablage einer bestimmten Anwendung überwachen & bearbeiten
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.
So 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