Replace Clipboard - Beim Kopieren Texte automatisch ersetzen

    • Release
    • Open Source

    Es gibt 2 Antworten in diesem Thema. Der letzte Beitrag () ist von Niko Ortner.

      Replace Clipboard - Beim Kopieren Texte automatisch ersetzen

      Name:
      Replace Clipboard

      Kurze Beschreibung:
      Wenn Text in die Zwischenablage kopiert wird, verändert das Programm den Text automatisch laut eingestellten Regeln.

      Screenshot:


      Ausführliche Beschreibung:
      Ein Freund hatte folgende Situation: Er lässt sich Telegram-Chats immer vorlesen. Ein Programm überwacht die Zwischenablage und füttert neue Texte einfach an die Sprachausgabe. Er markiert die gewünschten Nachrichten in Telegram, kopiert sie mit Strg+C in die Zwischenablage und bekommt sie dann vorgelesen.
      Das Problem: Es gibt viel Text, der vorgelesen wird, der stört:
      Telegram fügt vor jeder Nachricht den Absendername und Datum und Uhrzeit der Nachricht ein.
      Hyperlinks werden komplett vorgelesen.
      Manche Accounts haben sehr lange Namen; manche fügen irrelevante Informationen in den Namen ein.

      Dieses Programm kann die unnötigen Teile aus der Zwischenablage entfernen und somit das Vorlesen angenehmer machen.

      Bedienung
      Bedienung

      Regeln werden von oben nach unten abgearbeitet. Wird also "a" in die Zwischenablage kopiert, und "a" -> "b" und "b" -> "c" ersetzt, bleibt "c" in der Zwischenablage. Wird jedoch zuerst "b" -> "c" und dann "a" -> "b" ersetzt, bleibt "b" in der Zwischenablage.

      Oben:
      Button "Add New": Fügt eine neue Regel ein.
      Button "Save Settings" (oder Strg+S): Speichert die aktuellen Einstellungen. Diese werden auch beim Beenden des Programms automatisch gespeichert, aber falls das Programm crashen sollte, würden die Einstellungen verloren gehen, deshalb empfiehlt es sich, Änderungen möglichst frühzeitig manuell zu speichern.
      Button "Load Settings": Lädt die gespeicherten Einstellungen. Diese werden auch beim Öffnen des Programms automatisch geladen.
      CheckBox "Enabled": Wenn deaktiviert, werden keine Ersetzungen durchgeführt, unabhängig von den individuellen Regeln.
      Button "Open Playground": Öffnet ein Fenster, bei dem die Einstellungen getestet werden kann. Wenn oben Text eingegeben wird, erhält man unten das Ergebnis nach den Ersetzungen.
      Button "Global Settings": Öffnet ein Fenster mit globalen Einstellungen.

      Globale Einstellungen:
      CheckBox "Enable Replacements": Wenn deaktiviert, werden keine Ersetzungen durchgeführt, unabhängig von den individuellen Regeln.
      CheckBox "Original text must be at least [N] characters long": Wenn der in die Zwischenablage kopierte Text kürzer als N Zeichen ist, werden keine Ersetzungen durchgeführt.
      CheckBox "Enable RegEx for new rules": Wenn aktiviert, ist die CheckBox "RegEx" bei neuen Regeln automatisch aktiviert.
      CheckBoxen in "Default RegEx Flags": Bei neuen Regeln sind die hier ausgewählten RegEx-Flags eingestellt.
      CheckBox "Show Tray-Icon and minimize to tray": Wenn aktiviert, wird im Infobereich der Taskleiste ein Symbol angezeigt und wenn das Hauptfenster minimiert wird, wird es aus der Taskleiste ausgeblendet und bei einem Klick auf das Icon wieder eingeblendet.
      CheckBox "Minimize on start": Wenn aktiviert, wird das Programm automatisch beim Start minimiert. Das kann hilfreich sein, wenn es im AutoStart eingetragen ist und beim Reboot gleich in den Hintergrund verschwinden soll.
      CheckBox "Warn when removing rules": Wenn aktiviert, wird beim Entfernen von Regeln nachgefragt, ob man sich sicher ist. Wenn deaktiviert, wird die Regel ohne Nachfrage entfernt.

      Bei jeder Regel:
      CheckBox "Enabled": Ersetzung wird nur durchgeführt, wenn aktiviert.
      CheckBox "RegEx": Wenn aktiviert, wird RegEx.Replace verwendet, ansonsten String.Replace.
      Linke TextBox: Suchtext
      Rechte TextBox: Ersetzt durch diesen Text
      Button "i": Öffnet ein Fenster mit weiteren Einstellungen zu dieser Regel.
      Button "↑" und "↓": Verschiebt die Regel nach oben bzw. unten.
      Button "X" löscht die Regel.

      Erweiterte Einstellungen pro Regel:
      Für Einstellungen "Enabled", "Search text", "Replacement text" und "Use RegEx" siehe "Bei jeder Regel" oben.
      CheckBoxen in "RegEx Flags": Hier können die RegexOptions eingestellt werden, die verwendet werden, wenn "Use RegEx" aktiviert ist.
      CheckBox "Text at this stage must be at least [N] characters long": Wenn der Text an diesem Punkt kürzer als N Zeichen ist, wird diese Regel ignoriert.
      CheckBox "Stop matching further replacements if this one matches": Wenn aktiviert, werden alle Regeln unterhalb dieser Regel für den aktuell in die Zwischenablage kopieten Text ignoriert, sofern die aktuelle Regel zutrifft.

      Hinweis zu Updates:
      Von V1.0 auf V2.0 hat sich die Struktur der Settings.xml stark verändert. Einige Einstellungen werden vermutlich nicht korrekt mitgenommen, aber das Programm sollte beim Lesen einer alten Datei zumindest nicht crashen. Es empfiehlt sich aber trotzdem, vorher ein Backup der Datei zu machen. Sollte das Programm trotzdem crashen, weil ich was übersehen habe, einfach die alte Settings.xml-Datei entfernen oder umbenennen, dann sollte es zumindest mit leeren Einstellungen starten.

      Verwendete Programmiersprache und IDE:
      Visual Basic .NET / IDE VB 2010 Express

      Systemanforderungen:
      .NET Framework 4.0 Client Profile

      Systemveränderungen:
      Erstellt die Datei "Settings.xml" im Programmverzeichnis.
      Liest und verändert den Inhalt der Zwischenablage.

      Downloads:
      ReplaceClipboard v2.0 (Release).zip Programm (EXE und DLLs) (352KB gepackt, 1.41MB entpackt)
      ReplaceClipboard v2.0 (Quellcode + Bibliotheken).zip Projekt (Quellcode und eingebundene Bibliotheken) (332kKB gepackt, 1.33MB entpackt)

      Lizenz/Weitergabe:
      Das Programm darf beliebig weitergegeben werden, solange dafür kein Geld verlangt wird.
      Einkompilieren erlaubt (Erwähnung wäre nett).
      Dekompilieren erlaubt, ich beantworte Fragen zum Code aber auch gerne selbst und das Projekt ist ja auch dabei.
      "Luckily luh... luckily it wasn't poi-"
      -- Brady in Wonderland, 23. Februar 2015, 1:56
      Desktop Pinner | ApplicationSettings | OnUtils

      Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Niko Ortner“ () aus folgendem Grund: V2.0 hochgeladen

      Hi @Niko Ortner,

      nice, einfaches Tool das tut was es soll und das auch sehr zuverlässig, mir gefällt's richtig gut :)

      ⭐Folgende Funktionen würden mir noch einfallen:
      - Einstellbare Regex Flags (Case ignore, Multiline, Singleline, ...)
      - Eine Option pro Replacement sodass bei Match optional keine weiteren Regeln angewendet werden sollen (quasi wie das [L] Flag bei rewrite rules in .htaccess Dateien)
      - Einstellbar machen, dass bei Klick auf den "Add New" Button automatisch die "RegEx" Option angehakt ist
      - Beim Schließen sollte sich die Anwendung (je nachdem ob man es so festgelegt hat) in den Tray minimieren. Ich will das Tool auch nutzen ohne die GUI sehen zu müssen.
      - Einträge per Drag&Drop sortierbar machen
      - Ein Playground (separates Fenster am besten) auf dem 2 Richtextbox Elemente drauf sind, sodass man die Regeln schnell testen kann. Die Richtextbox mit dem ersetzten Ergebnis sollte readonly sein. Am besten so dass wenn man aus dem ersten Textfeld Text markiert, dieser automatisch in die Zwischenablage kopiert, die Replacement Regeln angewendet werden und das Ergebnis in der anderen Textbox ausgegeben wird.
      - Ein Dialog der aufpoppt nachdem man auf "Load Settings" klickt, wenn es ungespeicherte Änderungen gibt. Sonst sind die nämlich direkt verloren.
      - Einstellbarer Speicherort der Settings.xml
      - Generell ein Fenster in dem man allgemeine Einstellungen vornehmen kann.
      - Du solltest noch unterbinden, dass die Ersetzungen vorgenommen werden, wenn man innerhalb deiner Anwendung Text kopiert.
      - Auch wenn RegEx nicht aktiviert ist, sollte man die Möglichkeit haben, Case Sensitivity ein- oder auszuschalten.
      - Möglichkeit um Profile zu erstellen (sodass man quasi verschiedene Settings.xml haben kann). In dem Fall sollte das zu ladende Profil auswählbar sein ("Profil importieren" oder sowas in der Art).
      - Eine optionale Einstellung, um eine andere Tastenkombi festzulegen auf die deine Anwendung reagiert (zB Strg+Alt+C oder sowas)
      - Optional auswählbar machen, von welchen Anwendungen aus man dieses Tool nutzen möchte (via Black- oder Whitelist). Zum Beispiel möchte ich dass die Ersetzungen greifen wenn ich in Telegram was kopiere, aber in Discord will ich das nicht. Da kommt quasi wieder diese Idee mit den Profilen ins Spiel
      - Einstellbar machen, ob man ein Bestätigungs-Popup sehen will, wenn man eine Zeile löschen möchte
      - Vielleicht kann man generell sowas wie eine Art Papierkorb einbauen
      - Das Programm sollte beim Schließen prüfen, ob es ungespeicherte Änderungen gibt, und entsprechend vorschlagen, diese zu speichern (oder halt auch nicht). Derzeit sind neue Einträge wenn man vergessen hat zu speichern beim Schließen einfach weg.
      - Optional: eine global Regel dass Ersetzungen nur vorgenommen werden ab/bis zu einer festgelegten Länge von Zeichen.
      - Ein absolutes Mega Feature wär's natürlich, wenn man die Ersetzungen je nach ausgeführtem Programm einstellen kann, aus dem Text kopiert wird. Quasi applikationsspezifische Profile mit eigenen Regeln.
      - Du solltest vielleicht auch überlegen, intern eine Liste von Programmen zu hinterlegen, für die (ohne dass man es einstellen kann) niemals Ersetzungen vorgenommen werden, dazu würde ich zB Passwort-Manager Anwendungen wie KeePass, KeePassXC, NordPass, Keeper, Dashlane und ähnliche zählen.
      - Optional Aktionen ermöglichen für jedes Replacement, zum Beispiel umwandeln in Klein- oder Großbuchstaben, Erzeugen von Hashes oder Prüfsummen, oder festlegen, dass lediglich die Matches behalten werden sollen (zeilengetrennt zum Beispiel)

      ⚠ Fehler/Bugs:
      - Die Anwendung verreckt still und klammheimlich, wenn man irgendwo ungültiges Regex drin hat. Beispielsweise hab ich mal \p eingetragen und die "RegEx" Checkbox angehakt und dann irgendwo Text kopiert. Die Anwendung freezed und stirbt dann nach ein paar Sekunden ohne dass man es mitbekommt.

      Fazit: solides, hilfreiches Tool das man gebrauchen kann, als Regex-Fan werd ich's mit Freuden benutzen :)


      Link :thumbup:
      Hello World

      Dieser Beitrag wurde bereits 12 mal editiert, zuletzt von „Link“ ()

      @Link

      Danke für das ausführliche Feedback!
      Hab länger nicht dran gedacht, hier reinzuschauen deshalb hat's bisschen gedauert.

      Ich habe einiges umgesetzt aber bei ein paar Sachen hab ich Einwände.

      Allgemein möchte ich anmerken: Das Programm war ursprünglich mehr als "schnell zusammengeschriebenes Tool" gedacht, mit dem Hintergedanken, dass wenn ich eine Idee besonders nützlich finde, ich sie eh relativ einfach reinprogrammieren kann.
      Der Code ist durch das, was ich schon dazugebaut habe, bereits deutlich komplexer geworden. Und das, obwohl ich eigentlich nur die eher einfachen Vorschläge umgesetzt habe. Einige von den unten als "nicht erledigt" aufgelisteten Punkten fallen einfach unter die Kategorie "ist mir zu viel Aufwand für zu wenig Nutzen". Das liegt auch daran, dass ich meine Programme tendenziell direkt von Visual Studio heraus ausführe. Damit kann ich z.B. bei einer Exception direkt debuggen, oder bei Sonderfällen einen Haltepunkt setzen, quick&dirty den Code ändern und dann weiterarbeiten lassen.
      Falls jemand Zeit und Bock hat, die Punkte zu implementieren, sag ich nicht nein. (Aber tendenziell würde ich eher empfehlen, einfach die benötigten Sonderfälle selbst im VB-Code zu behandeln.) Ich lade das Projekt dann gerne bei Bedarf auf GitHub hoch.
      Vorher wäre es aber wahrscheinlich sinnvoll, den Code erst mal aufzuräumen. Ich habe aber in letzter Zeit wenig Zeit und Motivation dafür.

      Erledigt:
      • Bei unbehandelten Ausnahmen wird nun ein ThreadExceptionDialog angezeigt
      • Patterns werden schon beim Eingeben überprüft, Fehler werden rot markiert
      • Optional bei Match keine weiteren Ersetzungen durchführen
      • Playground, aber so: Man kann in einer TextBox Text eingeben und darunter sieht man, was herauskommen würde, wenn der Text oben in die Zwischenablage kopiert werden würde
      • Optional Mindestlänge des Texts (sowohl pro Regel, als auch global)
      • Einstellungsfenster für globale Einstellungen
      • Einstellungsfenster für detailierte Einstellungen pro Regel
      • Einstellbare RegEx Flags
      • Einstellbar, ob RegEx bei neuen Regeln verwendet wird
      • Einstellbar, welche RegEx flags bei neuen Regeln verwendet werden
      • Optionale Warnung beim Löschen einer Regel
      • Optional ins Tray minimieren

      Case insensitive ohne RegEx:
      String.Replace hat keine Möglichkeit für die Angabe von StringComparison. IndexOf und anschließend rausschneiden ist fehleranfällig (besonders wenn nicht-ASCII-Zeichen vorkommen).
      Ich hatte allerdings fälschlicherweise das Aufleuchten der Regel bei "CurrentText.IndexOf(SearchText, StringComparison.InvariantCultureIgnoreCase) >= 0" getriggert, und dann mit .Replace ersetzt. Das hab ich behoben.

      Einstellbarer Speicherort der Settings.xml:
      Und den Speicherort für die Einstellungen speicher ich in der Settings.xml im Programmverzeichnis :D
      Hab ich jetzt mal nicht eingebaut, weil es Argumente für und gegen das Speichern im Programmverzeichnis gibt, und ebenfalls für und gegen das Speichern in z.B. AppData. Und ich möchte es im Programmverzeichnis haben ;)
      Aber die Pfadangabe ist relativ. Wenn du das Programm mit einem anderen WorkingDirectory startest, müsste die Settings.xml von da geladen werden.
      Oder du kompilierst es dir selber (was bei .NET zum Glück erträglich einfach geht). Siehe SettingsFilePath in MainWindow.xaml.vb ganz oben.

      Einträge per Drag&Drop sortierbar machen
      Drag&Drop ging mir schon zu WinForms-Zeiten auf den Wecker und ist in WPF nicht einfacher geworden. Ich habe bisschen rumprobiert, aber habe es nicht konsistent hinbekommen, und mir ist dann die Geduld ausgegangen.
      Ich stimme zu, dass es sinnvoll wäre, aber das muss jemand anderes machen (oder ich probiere es in Zukunft vielleicht nochmal).

      Regeln mit Sonderfunktionen:
      Ich verstehe nicht, was du mit "festlegen, dass lediglich die Matches behalten werden sollen (zeilengetrennt zum Beispiel)" meinst.
      Umwandeln in Klein- oder Großbuchstaben fände ich auch sinnvoll. Leider kann .NET \U und Derivate nicht.
      Regex.Replace kann aber einen Delegaten annehmen, der für jedes Match den einzusetzenden Text zurückgeben soll. Damit könnte man vermutlich relativ einfach simple Veränderungen der Texte (z.B. ToUpper und ToLower) basteln. Aber wenn's komplizierter sein soll, wäre hier auch wieder viel Aufwand für relativ wenig Nutzen nötig. Ich würde da auch einfach meine eigenen, für mich speziell zutreffenden Funktionen in den Code schreiben und die auswählbar machen, statt zu versuchen, über das UI was Flexibles einstellbar zu machen.

      Generell speichern und laden (auch von Profilen) und Warnungen beim Verlieren von Einstellungen:
      • Profile
      • Papierkorb
      • Beim Laden von Einstellungen warnen, wenn ungespeicherte Änderungen überschrieben werden
      • Beim Schließen warnen, wenn ungespeicherte Änderungen verworfen werden.

      Um das hinzubekommen, müsste ziemlich viel umgekrämpelt werden. Es gibt derzeit weder Flags, die gesetzt werden, wenn eine Einstellung geändert wird, noch können Einstellungen beim Laden auf "sind die anders als was gerade schon geladen ist" verglichen werden.
      Um zu vermeiden, Einstellungen zu verlieren, empfehle ich, bei Änderungen möglichst gleich zu speichern (im MainWindow funktioniert auch Strg+S). Ich weiß, dass das nicht die benutzerfreundlichste Herangehensweise ist, aber die Alternative fällt für mich derzeit unter "zu viel Aufwand". Und bei einem Crash würde das auch nicht helfen.
      Anmerkung zum Schließen: Beim Schließen werden die aktuellen Einstellungen gespeichert. Das war auch bisher so, aber der Aufruf zum Speichern kam bisher nach dem Aufruf zum Zurücksetzen der ClipboardChain. Das habe ich umgedreht, damit im Falle einer Exception beim Zurücksetzen die Einstellungen schon vorher gespeichert wurden.

      Programm-abhängige Regeln und was sonst noch mit Profilen zusammenhängt:
      • Whitelist/Blacklist für Programme, aus denen kopiert wird bzw. generell Programmabhängige Regeln/Profile
      • Default Blacklist mit Passwort-Managern (KeePass, etc.)

      Ich konnte bisher keinen Weg finden, festzustellen, von wo aus der Text in die Zwischenablage kopiert wurde. Falls jemand was Zuverlässiges findet, wäre es eventuell interessant, aber die Punkte hängen auch sehr stark mit der letzten Liste zusammen und sind entsprechend schwierig umzusetzen.

      Reagieren auf andere Tastenkombinationen, z.B. Strg+Alt+C:
      Wenn ich das richtig verstehe: Wenn man Text mit Strg+C kopiert, passiert z.B. nichts, weil keine Regeln dafür eingestellt sind. Wenn man Text stattdessen mit Strg+Alt+C kopiert, werden gewisse, dafür eingestellte Regeln angewendet. Das wüsste ich nicht, wie das machbar wäre. Wenn aber gemeint ist, dass bei Strg+Alt+C der Text, der sich bereits in der Zwischenablage befindet, durch eingestellte Regeln verändert wird, dann wäre das machbar. Ist aber auch eher was, was Profile braucht.

      Unterbinden, dass die Ersetzungen vorgenommen werden, wenn man innerhalb der Anwendung Text kopiert:
      Der Fall lässt sich zum Glück relativ einfach umgehen. Genau dafür gibt's nämlich die "Enable"-CheckBox ganz oben im MainWindow ;)
      "Luckily luh... luckily it wasn't poi-"
      -- Brady in Wonderland, 23. Februar 2015, 1:56
      Desktop Pinner | ApplicationSettings | OnUtils