(@SW_SHOW) auf Knopfdruck?

  • Hallo,
    Ich habe folgendes Problem:
    Ich habe vor ein Programm zu schreiben, mit dem ich verschiedene Programme auf Knopfdruck Verstecken/wieder auftauchen lassen kann. Doch leider scheitert dies schon beim wieder Erscheinen des Programmes.

    Hier ist mein Script. Nachdem der Makel schon ziemlich früh aufgekommen ist, ist es nicht wirklich groß. :pinch:

    Spoiler anzeigen


    Dim $sProcess = "firefox.exe"
    Dim $CTRL_ALT_a = "^!a"

    If ProcessExists($sProcess) Then
    WinSetState("Mozilla Firefox", "", @SW_HIDE)
    ElseIf Send($CTRL_ALT_a) Then
    WinSetState("Mozilla Firefox", "", @SW_SHOW)
    EndIf


    Ich habe das ganze jetzt mal mit Firefox dargestellt, da ich denke, dass nicht Jeder Steam und so ein Zeug auf dem PC hat. :thumbup:
    Meine Frage: Wie mache ich das mit "ElseIf Send($CTRL_ALT_a)" ? Ich kann zwar das Fenster verstecken, aber nicht mehr auftauchen lassen :cursing:


    EDIT: Ich hab schon einen meiner Fehler bemerkt (Ich muss HotKeySet anstatt von Send benutzen). Dann würde das Script so aussehen:

    Spoiler anzeigen


    Dim $sProcess = "firefox.exe"
    Dim $CTRL_ALT_a = "^!a"

    If ProcessExists($sProcess) Then
    WinSetState("Mozilla Firefox", "", @SW_HIDE)
    EndIf
    HotKeySet("{ESC}", "schliessen")
    Func schliessen()
    WinSetState("Mozilla Firefox", "", @SW_SHOW)
    EndFunc

    Aber ändern tut sich nichts :|

    5 Mal editiert, zuletzt von Hime (19. Dezember 2010 um 20:17)

  • Probier mal das:


    [autoit]

    Opt("WinTitleMatchMode", 2) ;Zum finden des Fensters

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

    HotKeySet("!1", "_Ini1") ;Hotkey(Alt + 1)

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

    While 1 ;Programm bleibt "erhalten" und belastet die CPU nicht (sleep)
    Sleep(10)
    WEnd

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

    Func _Ini1() ;Funktion die aufgerufen wird bei Alt + 1
    $Programm = IniRead(@ScriptDir & "\Fenster.ini", "1", "1", -1) ;Teil des Titels, z.B. Mozilla Firefox oder Adobe Reader
    If $Programm <> -1 Then
    If BitAND(WinGetState(WinGetTitle($Programm)), 2) = 1 Then ;Wenn das Fenster sichtbar ist, dann verstecke es
    WinSetState($Programm, "", @SW_HIDE)
    EndIf
    If BitAND(WinGetTitle(WinGetTitle($Programm)), 2) = 0 Then ; Wenn nicht, dann zeige es...
    WinSetState($Programm, "", @SW_SHOW)
    EndIf
    Else
    MsgBox(64, "", "Keine Ini gefunden")
    EndIf
    EndFunc ;==>_Ini1

    [/autoit]

    Ininame: Fenster.ini
    [1]
    1=(hier der Fenstername)

    Dann kannst du es immer erweitern oder ändern ohne das Script immer wieder neu compilieren zu müssen. Du musst halt nur entsprechende Funktionen machen, die dann die anderen Sektionen in der Ini durchsuchen. Leider kann man bei Hotkeyset keine Parameter mitgeben, sonst könntest du alles in einer Funktion machen.

    Schau dir die Funktion Send noch einmal genauer an ;) Der fragt nicht ab ob du es "sendest" sonder das Programm sendet es. Was du gebraucht hättest wäre ~ _ispressed oder ähnliche Methoden um zu prüfen, ob die Tasten gedrückt sind, die du brauchst.

    Viel Spaß,
    Aquaplant

    4 Mal editiert, zuletzt von Aquaplant (19. Dezember 2010 um 11:55)

  • Aquaplant:
    Danke für deine Mühe! :)
    Aber klappt immer noch nicht. :cursing:

    Was soll diese Zeile bewirken?

    [autoit]


    $Programm = IniRead(@ScriptDir & "\Fenster.ini", "1", "1", -1)

    [/autoit]

    Einmal editiert, zuletzt von Hime (19. Dezember 2010 um 13:25)

  • Diese Zeile liest aus der Ini, die Aquaplant erstellt hat (siehe seinen Post), den Fensternamen aus.
    Das heißt du trägst in die Ini einen Teil des Fensternamens, wie Aquaplant in einem Kommentar beschrieben hat, ein.
    Dass soll die Fenstersuche erleichtern, da man jetzt nur noch die Ini abändern muss.

  • Diese Zeile liest aus der Ini, die Aquaplant erstellt hat (siehe seinen Post), den Fensternamen aus.
    Das heißt du trägst in die Ini einen Teil des Fensternamens, wie Aquaplant in einem Kommentar beschrieben hat, ein.
    Dass soll die Fenstersuche erleichtern, da man jetzt nur noch die Ini abändern muss.

    Ah, Dankeschön. :thumbup:

    Allerdings ist hier

    [autoit]


    If $Programm <> -1 Then
    If BitAND(WinGetState(WinGetTitle($Programm)), 2) = 1 Then ;Wenn das Fenster sichtbar ist, dann verstecke es

    [/autoit]


    ein Fehler unterlaufen (If $Programm <> -1 Then). Ich weiß nicht was er damit bewirken wollte? Da fehlt irgendetwas nach dem Then :|

    Einmal editiert, zuletzt von Hime (19. Dezember 2010 um 13:25)

  • Leider kann man bei Hotkeyset keine Parameter mitgeben, sonst könntest du alles in einer Funktion machen.


    So...?

    Fenster.ini
    Code
    [Fensternamen]
    1=AutoIt Help
    2=Gemeinsame Dokumente
    Skript.au3
    [autoit]

    Opt("WinTitleMatchMode", 2) ;Zum finden des Fensters

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

    ;Alle Hotkeys rufen die gleiche Funktion auf!
    HotKeySet("!1", "_Ini") ;Hotkey(Alt + 1)
    HotKeySet("!2", "_Ini") ;Hotkey(Alt + 2)

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

    While 1 ;Programm bleibt "erhalten" und belastet die CPU nicht (sleep)
    Sleep(10)
    WEnd

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

    Func _Ini() ;Funktion die von jedem Hotkey aufgerufen wird
    $Programm = IniRead(@ScriptDir & "\Fenster.ini", "Fensternamen", StringRight(@HotKeyPressed, 1), -1) ;Teil des Titels, z.B. Mozilla Firefox oder Adobe Reader
    If $Programm <> -1 Then
    If BitAND(WinGetState(WinGetTitle($Programm)), 2) Then ;Wenn das Fenster sichtbar ist, dann verstecke es
    WinSetState($Programm, "", @SW_HIDE)
    Else ;Wenn nicht, dann zeige es...
    WinSetState($Programm, "", @SW_SHOW)
    EndIf
    Else
    MsgBox(64, "", "Keine Ini gefunden")
    EndIf
    EndFunc ;==>_Ini

    [/autoit]
  • @Cyberdyne: Da hab ich ja auch wieder was dazugelernt. Das Makro kannte ich noch gar nicht :rolleyes:

    Ich hätte es sonst so gelöst:

    Spoiler anzeigen
    [autoit]

    Opt("WinTitleMatchMode", 2) ;Zum finden des Fensters

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

    HotKeySet("!1", "_Ini1") ;Hotkey(Alt + 1)
    HotKeySet("!2", "_Ini2") ;Hotkey(Alt + 1)
    HotKeySet("!3", "_Ini3") ;Hotkey(Alt + 1)

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

    While 1 ;Programm bleibt "erhalten" und belastet die CPU nicht (sleep)
    Sleep(10)
    WEnd

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

    Func _Ini1()
    _Ini(1)
    EndFunc
    Func _Ini2()
    _Ini(2)
    EndFunc
    Func _Ini3()
    _Ini(3)
    EndFunc

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

    Func _Ini($Section) ;Funktion die aufgerufen wird bei Alt + 1
    $Programm = IniRead(@ScriptDir & "\Fenster.ini", String($Section), "1", -1) ;Teil des Titels, z.B. Mozilla Firefox oder Adobe Reader
    If $Programm <> -1 Then
    If BitAND(WinGetState(WinGetTitle($Programm)), 2) >= 1 Then ;Wenn das Fenster sichtbar ist, dann verstecke es
    WinSetState($Programm, "", @SW_HIDE)
    ElseIf BitAND(WinGetState(WinGetTitle($Programm)), 2) = 0 Then ; Wenn nicht, dann zeige es...
    WinSetState($Programm, "", @SW_SHOW)
    EndIf
    Else
    MsgBox(64, "", "Section " & $Section & " exisitert nicht.")
    EndIf
    EndFunc ;==>_Ini1

    [/autoit]

    Einmal editiert, zuletzt von Aquaplant (19. Dezember 2010 um 14:32)

  • Aber kann mir trotzdem jemand sagen wieso

    [autoit]


    While 1
    Sleep (10)
    WEnd

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

    HotKeySet("^r", "hide") ; Mit ALT + r wird...
    Func hide ()
    WinSetState("Mozilla Firefox", "", @SW_HIDE) ; ...Firefox versteckt
    EndFunc

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

    HotKeySet("^e", "show") ; Mit ALT + e wird...
    Func show ()
    WinSetState("Mozilla Firefox", "", @SW_SHOW) ; ...Firefox angezeigt
    EndFunc

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


    nicht geht? :huh: :thumbup: Wäre interessant... :)


    PS: Wegen der Frage wird das Thema kurzzeitig auf [offen] gestellt !

  • name22 : Das Problem ist, dass AutoIt (zumindest in SciTE) ohne diese Schleife das Programm sofort schließt, ohne dass ich irgendetwas damit machen kann.

    Das hier steht dann unten (dürfte zwar nicht hilfreich sein, aber daran soll es nicht scheitern :D )

    Spoiler anzeigen


    +>20:07:39 AutoIT3.exe ended.rc:0
    >Exit code: 0 Time: 1.868


    Weißt du wie man das beheben kann?

    (Zugegebenermaßen hab ich das nur geschrieben, da es Aquaplant oben in seinem Script auch getan hat :thumbup: )

  • Man könnte ja auch einfach die HotKeySet Funktionen VOR der Endlosschleife aufrufen. :pinch:

    Spoiler anzeigen
    [autoit]


    HotKeySet("^e", "show") ; Mit ALT + e wird...
    HotKeySet("^r", "hide") ; Mit ALT + r wird...

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

    While 1
    Sleep (10)
    WEnd

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

    Func hide ()
    WinSetState("Mozilla Firefox", "", @SW_HIDE) ; ...Firefox versteckt
    EndFunc

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

    Func show ()
    WinSetState("Mozilla Firefox", "", @SW_SHOW) ; ...Firefox angezeigt
    EndFunc

    [/autoit]