Markierten Text im aktiven Fenster mittels VBScript in die Zwischenablage kopieren und dann nachfolgende Code ausführen

  • VBScript

Es gibt 12 Antworten in diesem Thema. Der letzte Beitrag () ist von Richard71.

    Markierten Text im aktiven Fenster mittels VBScript in die Zwischenablage kopieren und dann nachfolgende Code ausführen

    Momentan kopiere ich noch händisch einen markierten Text mit der Tastenkombination Strg + C von einer beliebiegen offenen Applikation (aktives Fenster z.B. Browser, Email, Excel, Word, PDF etc.) in die Zwischenablage.
    Danach starte ich per Tastenkombination (z.B. Strg + Alt + g) ein VBScript und verarbeite den zuvor kopierten Text aus der Zwischenablage automatisch weiter.
    Wie kann ich die erste Tastenkombination Strg + C einsparen, indem diese Funktionalität gleich am Anfang meines VBScript integriert ist?
    WshShell.SendKeys "^C" funktioniert nicht.
    Arbeite momentan noch auf Windows 7, wechsel aber in den kommenden Wochen auf Windows 10.
    Willkommen im Forum.
    Folgendes kopiert problemlos den markierten Text in die Zwischenablage. Wandel das ganze Schritt für Schritt ab, bis es auch bei Dir passt. Ist die Ziel-App aktiv? Ist der gewünschte Text markiert? Ist genügend Wartezeit eingeplant, bevor ^c gesendet wird?

    Visual Basic-Quellcode

    1. Set WshShell = WScript.CreateObject("WScript.Shell")
    2. WshShell.Run "%windir%\notepad.exe"
    3. Wscript.Sleep 1000
    4. WshShell.AppActivate "Notepad"
    5. WshShell.SendKeys "Hello World!"
    6. WshShell.SendKeys "^a^c"
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Häufig von mir verwendete Abkürzungen: CEs = control elements (Labels, Buttons, DGVs, ...) und tDS (typisiertes DataSet)
    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht in den Spekulatiusmodus gehen.
    Danke für den Vorschlag VaporiZed!
    Das geht aber leider ein bißchen an meiner Anfrage vorbei. Bitte nochmal genau lessen!

    Ich habe in einer beliebigen offenen Anwendung eine Textpassage oder nur ein Wort markiert.
    Mittels einer Tastenkombination möchte ich ein VBScript starten, welches die vorher markierte Textpassage bzw. das vorher markierte Wort an einen String im VBScript übergeben soll.

    Danke für deine Hilfe!
    Nö, eigentlich geht das nicht daran vorbei. Wenn Du eine beliebige Anwendung hernehmen willst, musst Du also das Script außerhalb jener Anwendung haben. Daher startest Du also irgendwie das Script, musst jene Zielanwendung per AppActivate aktivieren/ihr den Eingabefocus (zurück)geben, dann etwas warten und dann ^c senden. Der o.g. Code ist nur ein Beispiel, da ich ja nicht weiß, mit welcher Anwendung Du arbeitest. Du kannst also Zeile#3 und #7 weglassen und musst ggf. Z#5 abändern oder auch weglassen. In der letzten Zeile dann ^a weglassen.

    ##########

    Aber Moment:

    Richard71 schrieb:

    Wie kann ich die erste Tastenkombination Strg + C einsparen, indem diese Funktionalität gleich am Anfang meines VBScript integriert ist?
    ist was anderes als

    Richard71 schrieb:

    Mittels einer Tastenkombination möchte ich ein VBScript starten, welches die vorher markierte Textpassage bzw. das vorher markierte Wort an einen String im VBScript übergeben soll.


    Geht es jetzt also darum, dass Du das noch nicht erreichte Ziel hast, das Strg+C zu automatisieren (Post#1 bzw. Zitat#1) oder ein Script per Tastenkombi zu starten und den Clipboardinhalt weiterzuverarbeiten (Post#3 bzw. Zitat#2)
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Häufig von mir verwendete Abkürzungen: CEs = control elements (Labels, Buttons, DGVs, ...) und tDS (typisiertes DataSet)
    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht in den Spekulatiusmodus gehen.

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „VaporiZed“ ()

    Es geht darum, dass Strg+c zu automatisieren.

    Das Problem ist, dass es eine beliebige Anwendung sein kann, wo etwas markiert ist.

    Dann soll ein VBScript gestartet werden.

    Ich weiß, wie ich das VBScript mit einer Tastenkombination starte.

    Aufgabe: Nun muss der zuvor markierte Text als String abgespeichert werden.

    Wie spreche ich das zuvor verwendete beliebige aktive Fenster an? Ist die Markierung dann noch aktiv?

    Welche Befehle könnte ich dafür verwenden, um das zuvor Markierte (außerhalb des VBScript) in einem String zu sichern (innerhalb des VBScript)?
    Bisheriges Zwischenergebnis:
    • Text markieren
    • Script per Shortcut ausführen
    • Titelleiste des Zielanwendungsfensters anklicken
    • Daten aus der Zwischenablage verarbeiten

    Visual Basic-Quellcode

    1. Set WshShell = WScript.CreateObject("WScript.Shell")
    2. WshShell.SendKeys "^c"
    3. WScript.Sleep 100
    4. MsgBox GetClipboard()
    5. WScript.Quit
    6. Function GetClipboard()
    7. GetClipboard = CreateObject("htmlfile").ParentWindow.ClipboardData.GetData("text")
    8. End Function

    Modifiziert nach diesem Beitrag. Das Script dauert trotzdem lange, wohl objektinstanzerstellungsbedingt.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Häufig von mir verwendete Abkürzungen: CEs = control elements (Labels, Buttons, DGVs, ...) und tDS (typisiertes DataSet)
    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht in den Spekulatiusmodus gehen.
    Danke für die Hilfe!

    Die Messagebox zeigt aber nur das an, was zuletzt manuell mittels Strg+C in die Zwischenablage kopiert wurde, aber leider nicht das, was man vor dem Ausführen des VBSript in irgendeiner Anwendung markiert hat.

    Hast du noch eine Idee, wie man das Problem eventuell lösen könnte?
    Du musst schnell sein. Wenn ich zwischen Zeile#1 und #2 noch ein WScript.Sleep 2000 setze, sehe ich auch, dass der Cursor zum Wartecursor wird. Dann auf das Zielfenster klicken. Wenn man in jener Wartezeit das rechtzeitig macht, kommt das gewünschte Verhalten heraus.
    Bilder
    • Result.png

      9,1 kB, 664×229, 15 mal angesehen
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Häufig von mir verwendete Abkürzungen: CEs = control elements (Labels, Buttons, DGVs, ...) und tDS (typisiertes DataSet)
    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht in den Spekulatiusmodus gehen.
    Ich glaube nicht, da das Script ja erst angeworfen wird und daher keine Kenntnisse über den Vorzustand hat, also nicht weiß, welches Fenster zuvor aktiviert war. Vielleicht gibt es einen Weg, aber mir ist keiner bekannt.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Häufig von mir verwendete Abkürzungen: CEs = control elements (Labels, Buttons, DGVs, ...) und tDS (typisiertes DataSet)
    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht in den Spekulatiusmodus gehen.
    Gar nicht. Mit der Funktion des genannten google-Threads findet man heraus, wie das Fenster des aktuell selektierten Fensters heißt. Da aber der Start des Scriptes Deinem aktiven Fenster den Fokus nimmt und es deaktiviert, erhält man mit der API-Funktion effektiv nix. Sonst müsste man ja nicht die Titelleiste des Fensters anklicken, um den Kopiervorgang zu erreichen. Mit einem laufenden Programm, z.B. in VB.Net ist das alles leichter, aber mit einem erst zu startenden Script? Wohl eher nicht.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Häufig von mir verwendete Abkürzungen: CEs = control elements (Labels, Buttons, DGVs, ...) und tDS (typisiertes DataSet)
    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht in den Spekulatiusmodus gehen.