WinActive und HotKeySet wollen nicht so richtig

  • Guten Morgen alle zusammen,

    ich habe derzeit eine kleine Herausforderung.

    Bei meinem Programm soll beim ersten Start ein Passwort vergeben werden. Dies wird entweder durch drücken eines Buttons oder durch ENTER gespeichert.

    War nun allerdings der Fokus nicht auf meinem Programmfenster sondern ich habe zum Beispiel Notepad geöffnet und habe dort Enter gedrückt, hat er natürlich trotzdem die ENTER "drücken" Funktion ausgeführt, da ich nicht angegeben habe, dass er dies nur ausführen soll wenn das Fenster auch aktiv ist.

    Nun habe ich das Skript soweit umgeschrieben, dass er in der While-Schleife immer erst prüft ob das Fenster aktiv ist und nur dann die Funktion _enter ausführt.

    Jedoch kann ich mein skript auf diesen Wege sogar minimieren und dennoch wendet er die _enter Funktion an was gar nicht sein dürfte. Kann hier jemand meinen Fehler finden?

    [autoit]


    #RequireAdmin

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

    Opt("TrayIconHide", 1)

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

    #include <WindowsConstants.au3>
    #include <StructureConstants.au3>
    #include <GUIConstants.au3>
    #include <String.au3>
    #include-once 'UPS-login.exe'

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

    $crypt = 'QWERTZ'
    $winuser = RegRead("HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\winlogon", "Defaultusername")

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

    $loginGui = GUICreate("FIRST RUN - Choose Master PW", 270, 70)
    GUICtrlCreateLabel("Please choose a Master Password to protect your data:", 5, 5)

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

    $input = GUICtrlCreateInput("", 5, 20, 260, 20, 0x21)
    $button = GUICtrlCreateButton("Save", 110, 43, 55, 25)
    $read = GUICtrlRead($input)
    $check = IniRead(@WindowsDir & "\" & $winuser & "pws.ini", "MASTER", "MASTER", "")

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

    If $check = "" then
    GUIsetstate()
    Else
    If not FileExists(@TempDir & "\UPS-login.exe") Then
    FileInstall("C:\Documents and Settings\751076\Desktop\UPS\UPS-login.exe", @TempDir & "\UPS-login.exe")
    EndIf
    ShellExecute(@TempDir & "\UPS-login.exe")
    Exit
    EndIf

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

    Func _enter()
    $read = GUICtrlRead($input)
    IniWrite(@WindowsDir & "\" & $winuser & "pws.ini", "MASTER", "MASTER", _StringEncrypt(1, GUICtrlRead($input), $crypt, 2))
    MsgBox(0, "", "Password saved successful!")
    If not FileExists(@TempDir & "\UPS-login.exe") Then
    FileInstall("C:\Documents and Settings\751076\Desktop\UPS\UPS-login.exe", @TempDir & "\UPS-login.exe")
    EndIf
    ShellExecute(@TempDir & "\UPS-login.exe")
    Exit
    EndFunc

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

    While 1
    If WinActive("FIRST RUN - Choose Master PW") Then
    HotKeySet ("{enter}", "_enter")
    EndIf
    $msg = GUIgetmsg()
    Switch $msg
    Case $GUI_EVENT_CLOSE
    Exit
    Case $button
    $read = GUICtrlRead($input)
    IniWrite(@WindowsDir & "\" & $winuser & "pws.ini", "MASTER", "MASTER", _StringEncrypt(1, GUICtrlRead($input), $crypt, 2))
    MsgBox(0, "", "Password saved successful!")
    If not FileExists(@TempDir & "\UPS-login.exe") Then
    FileInstall("C:\Documents and Settings\751076\Desktop\UPS\UPS-login.exe", @TempDir & "\UPS-login.exe")
    EndIf
    ShellExecute(@TempDir & "\UPS-login.exe")
    Exit
    EndSwitch
    WEnd

    [/autoit]

    Mein AutoIT Smartphone GUI >>hier<<

    Der Mensch ist das einzige Tier, dass arbeiten muss.

    Einmal editiert, zuletzt von mirko2002 (2. Dezember 2011 um 11:05) aus folgendem Grund: thema gelöst

  • Prüf am besten ob

    [autoit]

    $input = GUICtrlCreateInput("", 5, 20, 260, 20, 0x21)

    [/autoit]

    den Fokus hat, weil dann geht Enter wirklich nur wenn der Curser auch in deinen Passwortfeld ist. So wie es bei anderen Programme auch der Fall ist die Enter als Bestätigung haben.

    Andy hat mir ein Schnitzel gebacken aber da war ein Raupi drauf und bevor Oscar das Bugfixen konnte kam Alina und gab mir ein AspirinJunkie.

  • Also einfach statt

    [autoit]


    If WinActive("FIRST RUN - Choose Master PW") Then
    HotKeySet ("{enter}", "_enter")
    EndIf

    [/autoit]

    jetzt

    [autoit]


    If WinActive($input) Then
    HotKeySet ("{enter}", "_enter")
    EndIf

    [/autoit]

    ?

    Mein AutoIT Smartphone GUI >>hier<<

    Der Mensch ist das einzige Tier, dass arbeiten muss.

  • Habs mal mit deinem WinAtivate angepasst jetzt sollte es gehen:

    Spoiler anzeigen
    [autoit]

    #RequireAdmin

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

    Opt("TrayIconHide", 1)

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

    #include <WindowsConstants.au3>
    #include <StructureConstants.au3>
    #include <GUIConstants.au3>
    #include <String.au3>
    #include-once 'UPS-login.exe'
    HotKeySet("{enter}", "_enter")

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

    $crypt = 'QWERTZ'
    $winuser = RegRead("HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\winlogon", "Defaultusername")

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

    $loginGui = GUICreate("FIRST RUN - Choose Master PW", 270, 70)
    GUICtrlCreateLabel("Please choose a Master Password to protect your data:", 5, 5)

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

    $input = GUICtrlCreateInput("", 5, 20, 260, 20, 0x21)
    $button = GUICtrlCreateButton("Save", 110, 43, 55, 25)
    $read = GUICtrlRead($input)
    $check = IniRead(@WindowsDir & "\" & $winuser & "pws.ini", "MASTER", "MASTER", "")

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

    If $check = "" Then
    GUISetState()
    Else
    If Not FileExists(@TempDir & "\UPS-login.exe") Then
    FileInstall("C:\Documents and Settings\751076\Desktop\UPS\UPS-login.exe", @TempDir & "\UPS-login.exe")
    EndIf
    ShellExecute(@TempDir & "\UPS-login.exe")
    Exit
    EndIf

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

    Func _enter()
    If WinActive("FIRST RUN - Choose Master PW") Then
    $read = GUICtrlRead($input)
    IniWrite(@WindowsDir & "\" & $winuser & "pws.ini", "MASTER", "MASTER", _StringEncrypt(1, GUICtrlRead($input), $crypt, 2))
    MsgBox(0, "", "Password saved successful!")
    If Not FileExists(@TempDir & "\UPS-login.exe") Then
    FileInstall("C:\Documents and Settings\751076\Desktop\UPS\UPS-login.exe", @TempDir & "\UPS-login.exe")
    EndIf
    ShellExecute(@TempDir & "\UPS-login.exe")
    Exit
    EndIf
    EndFunc ;==>_enter

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

    While 1
    $msg = GUIGetMsg()
    Switch $msg
    Case $GUI_EVENT_CLOSE
    Exit
    Case $button
    $read = GUICtrlRead($input)
    IniWrite(@WindowsDir & "\" & $winuser & "pws.ini", "MASTER", "MASTER", _StringEncrypt(1, GUICtrlRead($input), $crypt, 2))
    MsgBox(0, "", "Password saved successful!")
    If Not FileExists(@TempDir & "\UPS-login.exe") Then
    FileInstall("C:\Documents and Settings\751076\Desktop\UPS\UPS-login.exe", @TempDir & "\UPS-login.exe")
    EndIf
    ShellExecute(@TempDir & "\UPS-login.exe")
    Exit
    EndSwitch
    WEnd

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

    Andy hat mir ein Schnitzel gebacken aber da war ein Raupi drauf und bevor Oscar das Bugfixen konnte kam Alina und gab mir ein AspirinJunkie.

    Einmal editiert, zuletzt von chip (2. Dezember 2011 um 10:14)

  • So hatte ich es auch schonmal probiert, jedoch ist auch hier ein Fehler:

    So akzeptiert er zwar das ENTER nur wenn mein Programm aktiv ist, blockiert es aber bei anderen Anwendungen nun total.

    Beispiel wieder am Notepad. Hole ich mein Programm in den Fokus funktioniert es wie gewünscht. Hole ich Notepad in den Vordergrund und drücke dort ENTER reagiert zwar (gewollterweise) mein Programm nicht mehr darauf - aber Notepad auch nicht mehr - sprich man kann dort keine Sätze schreiben wenn mein Programm im Hintergrund läuft.

    Mein AutoIT Smartphone GUI >>hier<<

    Der Mensch ist das einzige Tier, dass arbeiten muss.

  • Immer diese Ansprüche *g*. Hier:

    Spoiler anzeigen
    [autoit]

    #include <GUIConstantsEx.au3>
    #include <Misc.au3>
    #include <String.au3>
    #RequireAdmin

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

    Opt("TrayIconHide", 1)

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

    ;~ #include-once 'UPS-login.exe'

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

    $crypt = 'QWERTZ'
    $winuser = RegRead("HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\winlogon", "Defaultusername")

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

    $loginGui = GUICreate("FIRST RUN - Choose Master PW", 270, 70)
    GUICtrlCreateLabel("Please choose a Master Password to protect your data:", 5, 5)

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

    $input = GUICtrlCreateInput("", 5, 20, 260, 20, 0x21)
    $button = GUICtrlCreateButton("Save", 110, 43, 55, 25)
    $read = GUICtrlRead($input)
    $check = IniRead("pws.ini", "MASTER", "MASTER", "")

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

    If $check = "" Then
    GUISetState()
    Else
    If Not FileExists(@TempDir & "\UPS-login.exe") Then
    FileInstall("C:\Documents and Settings\751076\Desktop\UPS\UPS-login.exe", @TempDir & "\UPS-login.exe")
    EndIf
    ShellExecute(@TempDir & "\UPS-login.exe")
    Exit
    EndIf

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

    Func _enter()
    $read = GUICtrlRead($input)
    IniWrite("pws.ini", "MASTER", "MASTER", _StringEncrypt(1, GUICtrlRead($input), $crypt, 2))
    MsgBox(0, "", "Password saved successful!")
    If Not FileExists(@TempDir & "\UPS-login.exe") Then
    FileInstall("C:\Documents and Settings\751076\Desktop\UPS\UPS-login.exe", @TempDir & "\UPS-login.exe")
    EndIf
    ShellExecute(@TempDir & "\UPS-login.exe")
    Exit
    EndFunc ;==>_enter

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

    While 1
    If WinActive("FIRST RUN - Choose Master PW") Then
    If _IsPressed("0D") Then
    _enter()
    EndIf
    EndIf
    $msg = GUIGetMsg()
    Switch $msg
    Case $GUI_EVENT_CLOSE
    Exit
    Case $button
    $read = GUICtrlRead($input)
    IniWrite(@WindowsDir & "\" & $winuser & "pws.ini", "MASTER", "MASTER", _StringEncrypt(1, GUICtrlRead($input), $crypt, 2))
    MsgBox(0, "", "Password saved successful!")
    If Not FileExists(@TempDir & "\UPS-login.exe") Then
    FileInstall("C:\Documents and Settings\751076\Desktop\UPS\UPS-login.exe", @TempDir & "\UPS-login.exe")
    EndIf
    ShellExecute(@TempDir & "\UPS-login.exe")
    Exit
    EndSwitch
    WEnd

    [/autoit]

    Andy hat mir ein Schnitzel gebacken aber da war ein Raupi drauf und bevor Oscar das Bugfixen konnte kam Alina und gab mir ein AspirinJunkie.

  • Ähm,

    wäre es nicht einfach mit der Option $BS_DEFPUSHBUTTON bei dem Button der gedrückt werden soll?

    Aus der Hilfe:

    Zitat

    $BS_DEFPUSHBUTTON - Erstellt einen "Push"-Button mit einem dicken schwarzen Rand. Falls sich der Button in einer Dialogbox befindet, kann der Benutzer den Button durch Drücken der ENTER-Taste auswählen, auch wenn der Button nicht den Eingabefokus besitzt. Dieser Stil ist hilfreich für das Aktivieren des Standards oder der meist verwendeten Option.

    Beispiel:

    Spoiler anzeigen
    [autoit]

    #include <ButtonConstants.au3>
    #include <EditConstants.au3>
    #include <GUIConstantsEx.au3>
    #include <WindowsConstants.au3>
    #Region ### START Koda GUI section ### Form=C:\_AutoIT\HotKey Setup\Form2.kxf
    $Form2 = GUICreate("Form2", 405, 294, 302, 218)
    $Button1 = GUICtrlCreateButton("Dieser bei Enter / Return", 56, 200, 313, 57, $BS_DEFPUSHBUTTON)
    $Input1 = GUICtrlCreateInput("Gibe Text ein!", 72, 80, 281, 21)
    $Button2 = GUICtrlCreateButton("Dieser nur bei Mausklick", 64, 128, 187, 25)
    GUISetState(@SW_SHOW)
    #EndRegion ### END Koda GUI section ###

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

    While 1
    $nMsg = GUIGetMsg()
    Switch $nMsg
    Case $GUI_EVENT_CLOSE
    Exit
    Case $Button1
    MsgBox(0,"","Du hast Enter gedrückt!")
    Case $Input1
    Case $Button2
    MsgBox(0,"","Buttonb per Mausklick")
    EndSwitch
    WEnd

    [/autoit]