Tray Icon klicken und Text in Zwischenablage kopieren / Formate löschen

  • Hallo zusammen,
    irgendwie komme ich bei meinem Problem nicht so recht weiter.

    Problembeschreibung:
    Es soll auf ein im Systray befindliches Icon geklickt werden - es klappt ein Menue auf mit den Items: Über ... / Beenden ... und KOPIEREN.
    Desweiteren soll KOPIEREN auch mittels CTRL+F9 und schliessen mit ALT+ESC möglich sein (halt Windows Like 8) )

    Was schon funktioniert:
    Formatierungen des in die Zwischenablage kopierten Text löschen
    Kopieren und Schliessen mittels Tatstatur
    Sytray Menü aufrufen
    Mittels Menü schliessen und 'Über'

    Was noch nicht:
    Menüpunkt kopieren auswählen, tatsächlich kopieren danach Menü schliessen und Menüpunkt nicht angehakt ....


    Vielleicht kann ja jemand mal ein Blick auf den Code Snip werfen und mir einen Tip geben .....
    Hier das Script:

    [autoit]


    #Include <Misc.au3>
    Opt("TrayMenuMode",1) ; Standard Traymenüeinträge (Skript pausieren/beenden) werden nicht angezeigt.

    [/autoit][autoit][/autoit][autoit]

    Global $sText
    $dll = DllOpen("user32.dll")

    [/autoit][autoit][/autoit][autoit]

    TraySetState()
    TraySetToolTip("CTRL+F9 = Kopiert + entfernt Formate" & @CRLF & "ALT+ESC = Programm schliessen")

    [/autoit][autoit][/autoit][autoit]

    HotKeySet("!{ESC}","_exit") ;ALT+ESC
    HotKeySet("^{F9}","_Strip") ;CTRL+F9

    [/autoit][autoit][/autoit][autoit]

    TrayCreateItem("")
    $copy = TrayCreateItem("Kopieren")
    TrayCreateItem("")
    $aboutitem = TrayCreateItem("Über")
    TrayCreateItem("")
    $exititem = TrayCreateItem("Beenden")
    TraySetState()

    [/autoit][autoit][/autoit][autoit]

    While 1
    $msg = TrayGetMsg()
    Select
    Case $msg = 0
    ContinueLoop
    Case $msg = $aboutitem
    Msgbox(64,"Über:","Das Tool entfernt alle Formatierungen von den Inhalten der Zwischenablage.")
    Case $msg = $copy
    _Strip()
    TrayCreateItem("")
    Case $msg = $exititem
    ExitLoop
    EndSelect
    WEnd
    DllClose($dll)
    Exit

    [/autoit][autoit][/autoit][autoit]

    Func _Strip()
    Send("^c")
    Sleep(10)
    $sTest = ClipGet()
    For $i = 0 To 31 ;9 to 13 sind die wichtigsten
    If StringInStr($sText, Chr($i)) Then $sText = StringReplace($sText, Chr($i), "")
    Next
    ClipPut($sTest)
    EndFunc

    [/autoit]

    Danke schon mal im voraus ! :rock:

  • Hab dir mal einige Kommentare in deinen Quellcode gepackt:

    Spoiler anzeigen
    [autoit]


    ;#Include <Misc.au3> <--------------- du benutzt überhaupt keine Funktion aus der misc.au3
    Opt("TrayMenuMode",1) ; Standard Traymenüeinträge (Skript pausieren/beenden) werden nicht angezeigt.

    [/autoit] [autoit][/autoit] [autoit]

    Global $sText
    ;$dll = DllOpen("user32.dll") <--------- wozu auch immer du die brauchst

    [/autoit] [autoit][/autoit] [autoit]

    TraySetState()
    TraySetToolTip("CTRL+F9 = Kopiert + entfernt Formate" & @CRLF & "ALT+ESC = Programm schliessen")

    [/autoit] [autoit][/autoit] [autoit]

    HotKeySet("!{ESC}","_exit") ;ALT+ESC
    HotKeySet("^{F9}","_Strip") ;CTRL+F9

    [/autoit] [autoit][/autoit] [autoit]

    TrayCreateItem("")
    $copy = TrayCreateItem("Kopieren")
    TrayCreateItem("")
    $aboutitem = TrayCreateItem("Über")
    TrayCreateItem("")
    $exititem = TrayCreateItem("Beenden")
    TraySetState()

    [/autoit] [autoit][/autoit] [autoit]

    While 1
    $msg = TrayGetMsg()
    Select
    Case $msg = 0 ; <----------- wozu soll das gut sein? Nungut es schadet jedenfalls auch nicht...
    ContinueLoop
    Case $msg = $aboutitem
    Msgbox(64,"Über:","Das Tool entfernt alle Formatierungen von den Inhalten der Zwischenablage.")
    Case $msg = $copy
    _Strip()
    ; TrayCreateItem("") <--------------------------------- wieso willst du jedesmal wenn man auf kopieren klickt neue Trennlinien ins Tray einfügen ????
    Case $msg = $exititem
    _exit()
    ; Exitloop <-------- geändert, wozu die schleife verlassen, wenn du sowieso danach das ganze Programm verlässt?
    EndSelect
    WEnd
    ;DllClose($dll) <-------- kA was du pberhaupt mit der dll vor hattest
    ; Exit <---------- entfernt, da exit bereits in der Hauptschleife erfolgt

    [/autoit] [autoit][/autoit] [autoit]

    Func _Strip()
    Send("^c") ; <-------- total sinnlos, denn jedes Fenster in dem du vielleicht Text markiert haben solltest wird den Focus verlieren wenn du im Traymenü rumdrückst, kopieren klappt also garnicht
    Sleep(10)
    $sTest = ClipGet() ; <------------ hossa... du weißt schon, dass deine globale Variable die du wohl daür vorgesehen hast $sText und nicht $sTest heisst ?
    For $i = 0 To 31 ;9 to 13 sind die wichtigsten
    If StringInStr($sText, Chr($i)) Then $sText = StringReplace($sText, Chr($i), "")
    Next
    ClipPut($sTest) ; <----------------- auch hier verwendest du die falsche Variable. Der geänderte Text befindet sich in $sText nicht in $sTest
    EndFunc

    [/autoit] [autoit][/autoit] [autoit]

    Func _exit() ; <------------ ohne diese Funktion war dein Programm überhaupt nicht ausführbar, siehe hotkey, welcher darauf verweist
    Exit
    EndFunc

    [/autoit]

    Grunsätzlich funktioniert das jedenfalls nicht so wie du es gerne haben würdest, selbst wenn du die komentierten Dinge so übernimmst bzw änderst. Du musst deinem Programm schon irgendwie sagen was es denn kopieren soll.

  • Hi misterspeed,

    danke für die Blumen ...

    Offensichtlich habe ich mich nicht verständlich genug ausgedrückt - sorry
    Natürlich habe ich den zu kopierenden Kontext vorher schon markiert, um dann die Tastenkombination zu nutzen.
    Das Ganze sollte halt jetzt auch noch mit der Maus und einem Menue funktionieren ...

    Mein Versuch des Menues ist ein quick und dirty .....

    Ich füge mal den Snip dazu den ich z.Zt. (mit Erfolg) nutze - diese Lösung ist 'nur' die Variante mit den Tastenkombinationen.

    [autoit]


    Global $sText
    $dll = DllOpen("user32.dll")

    [/autoit][autoit][/autoit][autoit]

    TraySetState()
    TraySetToolTip("CTRL+F9 = Kopiert + entfernt Formate")

    [/autoit][autoit][/autoit][autoit]

    HotKeySet("!{ESC}","_exit") ;ALT+ESC
    HotKeySet("^{F9}","_Strip") ;CTRL+F9

    [/autoit][autoit][/autoit][autoit]

    While 1
    sleep(1)
    WEnd

    [/autoit][autoit][/autoit][autoit]

    DllClose($dll)

    [/autoit][autoit][/autoit][autoit]

    Func _exit()
    MsgBox(0, "Strip Format in Clipboard", " Strip Clipboard closed",1)
    Exit 0
    EndFunc ;==>_Exit

    [/autoit][autoit][/autoit][autoit]

    Func _Strip()
    Send("^c")
    Sleep(10)
    $sText = ClipGet()
    For $i = 0 To 31 ;9 to 13 sind die wichtigsten
    If StringInStr($sText, Chr($i)) Then $sText = StringReplace($sText, Chr($i), "")
    Next
    ClipPut($sText)
    EndFunc

    [/autoit]

    Anm.:
    - bei der SText/$Test Variable hat wohl ein Typo zugeschlagen
    - den Aufruf der User32.dll habe ich hinzugefügt aufgrund eines Hinweises in der Hilfe !!!
    - das include ist ein Überbleibsel (völlig überflüssig - stimmt)

    mfg

    ugt100

  • Auf welchen Hilfeeintrag beziehst du dich denn bezüglich der dll? Also ich sehe nachwievor nichts in deinem Script wofür du das brauchen solltest. Du machst ja auch rein garnix mit der dll ausser sie zu öffnen und wieder zu schliessen. Letzteres muss btw in deine exit Funktion, ansonsten wird die dll niemals geschlossen werden. Um irgendetwas mit einer DLL zu machen brauchst du die Funktion dllcall(), davon sehe ich aber nichts in deinem Script.

    Zum Rest:

    Ja sofern du nur per Hotkey arbeitest dürfte das jetzt ja alles funktionieren, auch das STRG+C in deiner Funktion macht bei der Hotkey Nutzung natürlich Sinn, das hatte ich vorher ganz vergessen. Über das Traymenü kann das so aber nicht funktionieren, denn du sendest dann dein STRG+C nicht an das Fenster, in dem du etwas markiert hast, sondern an das Traymenü... dort gibts aber nichts zu kopieren. Ich denke das was du haben möchstest ist viel mehr ein Kontextmenü anstelle eines Traymenüs. Da ist dann aber die Frage ob du Text aus deiner eigenen GUI bearbeiten möchtest (bislang scheinst du keine GUI zu haben) oder aber ob du generell jedes x-beliebige Programm steuern willst. Da wüsste ich auf anhieb nun nicht wie du in fremde Programme ein eigenes Kontextmenü einbetten kannst.

    Ich bezweifle, dass das so ohne weiteres machbar ist.

  • Ok aber so wie ich das nun gelesen habe macht dein Programm ja bereits genau das was auch PureText macht. Hab mir das zwar jetzt nicht installiert, aber so wie ich den Screenshot des Traymenüs interpretiere kann man über das Tray auch keinen Text kopieren, sondern nur etwas, das sich bereits in der Zwischenablage befindet umwandeln. Das bedeutet, wenn du das Traymenü anstelle des Hotkeys verwendest musst du vorher den Text normal von Hand kopieren.

  • na nicht ganz so, denn
    erst makiere ich den gewünschten Text manuell (z.B. einen Auschnitt einer Web Seite - den ich ohne die Formatierung haben möchte),

    dann stosse ich das Script mittels der Tastenkombination CTRL+F9 an.
    Dabei ist der erste Schritt Send("^c") --> also kopieren <-- danach erfolgt erst die Weiterverarbeitung (in Var $Text , ... , StringReplace, usw...).

    Um genau dieses CTRL+C mittels Menue(auswahl) des Systray Icons geht es mir ....

  • Wüsste gerade aber nicht wie man das realisieren können sollte, denn wie bereits erwähnt verliert das aktive Fenster in dem du den Text markiert hast den Fokus sobald du das Traymenü bedienst und dann läuft dein STRG+C eben ins leere. Du müsstest da also das zuletzt aktive Fenster mit winactivate wieder aktivieren und dann dein STRG+C senden lassen. Wie man aber am besten an das zuletzt aktive Fenster rankommt weiß ich nicht.

    EDIT:
    So würde es zumindestens fürs Notepad funktionieren, aber da du ja Programmunabhängig arbeiten willst ist dir der Titel des letzten aktiven Fensters ja leider nicht bekannt...

    [autoit]


    Case $msg = $copy
    WinActivate("Unbenannt - Editor")
    _Strip()

    [/autoit]

    Einmal editiert, zuletzt von misterspeed (4. August 2011 um 18:39)