Konsolen Anwendung - Abbruch Key / Input Filtern

  • Hallo,

    (Die FOSU hat weder hier noch im Internationalen wirklich was gebracht, oder ich habe die falschen Worte gescuht...)

    Ich habe ein Autoit Script das als Konsolen App kompiliert wird.

    Es funktioniert soweit alles super, nur ein entscheidendes Problem hat sich mir eröffnet.
    Die Autoit App soll über Tastendrücke gesteuert werden. Sprich z.B. Die F1-F12 Keys beenden die Exe mit unterschiedlichen Errorlevels oder die ESC Taste beendet die App mit EL 255.
    Die EXE wird von .BAT files aufgerufen deswegen die gesetzten ELs. Das können auch mehrere Instanzen gleichzeitig sein.
    Im augenblick starte ich z.B: zweimal eine cmd und dort drinen jeweils einmal die Exe. Drücke ich nun F1 beenden sich beide, obwohl nur ein Fenster (oder gar keines) aktiv waren.


    In der Autoit Exe frage ich die Tasten mit

    [autoit]

    if _ispressed("70",$dll) then exit(11)

    [/autoit]


    als Beispiel ab.

    Funktioniert auch alles super toll, NUR leider reagiert die App auch wenn das Consolen Fenster (die cmd.exe) nicht den Fokus hat. Verhält sich also so wie HOTKEY. Das ist ja auch "systemweit" als Hook eingetragen, richtig?

    Hätte ich ein Fenster(gui) könnte ich das über die Fenster Handles abfragen (aktiv oder eben nicht)
    Leider kann ich auch nicht mit "titel" vorher die cmd umbenennen und dann nach diesem Titel suchen lassen.

    Wie schaffe ich es, in einer Fensterlosen App, die Tastendrücke so zu filtern das nur die jeweils aktive Instanz den Input erhält?

    Ich hoffe jemand kann mir helfen. Alle bisherigen Versuche fragten immer das Fenster der EXE ab.

    Als notnagel habe ich schon folgendes vor:

    Zuerst finde ich per Batch die Fenster ID der CMD, die übergebe ich dann der Autoit EXE als Parameter und die sucht ob das entsprechende Fenster aktiv ist....aber das wäre nur der Notnagel.....

    Falls es das oder so ein ähnliches Problem schon als gelöst gibt, Link genügt.

    Vielen Dank.

  • das udf von Progandy hilft dir vieleicht

    Spoiler anzeigen
    [autoit]


    #include<WinAPI.au3>
    #include-once
    Func _Console_Open()
    ; Author: Prog@ndy
    Return _WinAPI_CreateFile("CON", 2, 2)
    EndFunc
    Func _Console_Read($hConsole, $sPrompt='')
    ; Author: Prog@ndy
    If Not @Compiled Then
    If $sPrompt = '' Then $sPrompt = "Your input:"
    Return InputBox("Console Input", $sPrompt)
    EndIf
    If Not $hConsole Then Return SetError(1,0,'')
    If $sPrompt<>'' Then ConsoleWrite($sPrompt)
    Local $tStruct = DllStructCreate("char[1024]"), $sString='', $iRead
    Do
    _WinAPI_ReadFile($hConsole, DllStructGetPtr($tStruct), 1024, $iRead)
    $sString &= DllStructGetData($tStruct,1)
    Until $iRead<1024 Or StringRight($sString, 2) = @CRLF
    Return StringTrimLeft($sString,2)
    EndFunc
    Func _Console_Close($hConsole)
    ; Author: Prog@ndy
    _WinAPI_CloseHandle($hConsole)
    EndFunc

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

    ;-----------------------------------------------------------------------------
    #AutoIt3Wrapper_Change2CUI=y
    If Not @Compiled Then MsgBox(0, '', "Konsole funktioniert nur kompiliert")
    Global $hConsole = _Console_Open()
    MsgBox(0, '', _Console_Read($hConsole, "Name eingeben >"))
    _Console_Close($hConsole)

    [/autoit]
  • Danke für die Vorschläge :D
    name22:
    Leider wird vorher mit dem Shell Kommando title der cmd fenster Titel geändert und wenn zwei cmd geöffnet wären mit gleichem Fenster titel, kommt es zu eben dem von mir beschriebenen Nebeneffekt das beide beglückt werden.
    Deswegen schließt sich das fast aus. Fast, weil ich könnte den Titel in etwas einzigartiges verändern.

    Sprenger120:
    Bin mir noch nicht ganz sicher ob ich das verwenden kann.
    Das mit den CON habe ich im internationalen Forum auch schon mal gesehen.
    Will zwar keinen Input mit Abschlußtaste abfragen sondern einzelen tasten, aber evtl. kann man mit CON doch was erreichen.
    Muß nochmal nachsehen.

    Schon mal Danke für die Tips.