Ausgabe in CMD mittlerweile möglich ?

  • hi

    es geht :)

    nent sisch _winapi_atachconsole oder so...wieso bin ich der einzige, der das weiß ?!


    grez

    • Offizieller Beitrag

    Hallo,

    jetzt würde mich mal interessieren wie Du mit _WinAPI_AttachConsole einen Text in einer DosBox ausgibst!?

  • z.B. so: Verwendet die Console, aus der es aufgerufen wurde, sonst erzeugt es eine neue.

    Spoiler anzeigen
    [autoit]

    #include<WinAPI.au3>
    Global $aResult, $hConsole

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

    if not _WinAPI_AttachConsole() then
    $ret = DllCall("Kernel32.dll", "long", "AllocConsole")
    If $ret = 0 Then Exit MsgBox(0, 'EXIT', "No Console allocated!")
    endif

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

    $hConsole = _WinAPI_GetStdHandle(1)
    $hConsoleIn = _WinAPI_GetStdHandle(0)
    if $hConsole = -1 then
    MsgBox(0, "Error", "GetStdHandle failed")
    Exit
    endif

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

    _WinAPI_WriteConsole($hConsole, "Bitte Name eingeben: ")
    $test = DllStructCreate("char[10000]")
    $read = 500
    _WinAPI_ReadFile($hConsoleIn,DllStructGetPtr($test),DllStructGetSize($test),$read)
    MsgBox(0, '', DllStructGetData($test,1))


    if not _WinAPI_WriteConsole($hConsole, "Hello World" & @CRLF) then
    MsgBox(0, "Error", "WriteConsole Failed")
    endif
    _WinAPI_WriteConsole($hConsole, "PAUSE: ENTER druecken")
    _WinAPI_ReadFile($hConsoleIn,DllStructGetPtr($test),DllStructGetSize($test),$read)
    Exit

    [/autoit]
    • Offizieller Beitrag

    Ja funktioniert, wenn es kompiliert ist!

    Nicht schlecht @progandy, mich hätte nur interessiert ob @maycontainnuts es auch hinbekommen hätte, es gehört ja etwas mehr dazu wie nur _WinAPI_AttachConsole aufzurufen.

  • hi

    jo..es gehört schon mehr dazu als nur winapi_atach_console aber ich hatte in Errinerung, das da in der Hilfe nen Beispiel dazu gegebe war...


    grez

    • Offizieller Beitrag

    Hi,

    man muss aber vorsichtig sein. Die Dinge werden als Befehle interpretiert, oder? Sprich wenn das Skript aus einer DOSBOX aufgerufen wird, es erscheint der Satz : Gib deinen Namen ein: wenn man hier nun zufällig den Namen einer exe im Ordner eingibt, dann wird diese gestartet!

    Bestätigung?

    Mega

  • ist korrekt ;)

    EDIT: wenn ich jetzt per _WinAPI_WriteConsole etwas an das CMD-fenster schicke, schreibt er das auch schön da rein, aber ...

    man muss danach manuell enter drücken, um danach wieder befehle eingeben zu können, bzw, man kann zwar befehle eingeben, aber der pfad ist in der aktiven cmd-linie nicht zu sehen.
    kann man da was gegen machen? oder einfach controlsend enter an das fenster?

  • Man muss noch MakeCUI verwenden, damit man eine ConsoleApp erstellt.:

    [autoit]

    #AutoIt3Wrapper_Change2CUI=y

    [/autoit]


    ins Skript einfügen (Wenn man den AutoIt3Wrapper hat)

    • Offizieller Beitrag

    Hallo

    Jo, mit der Beta version kann man direkt Kompelierte AutoIt scripts als CUI Programm erstellen. Also Consolenprogramme die mit ConsoleWrite("bla") schreiben können.

    Dafür brauchst du neuste Beta und am besten den neusten AutoIt3Wrapper den es bei SciTe gibt. Alles einfach links inder leiste Downloaden.

    Mfg Spider

  • Bei mir gehts auch mit Stable ??

    Zum lesen aus ser Console braucht man aber nach wie vor die Funcs von oben

  • Hier hab ich das ganze mal in UDFs verpackt :)

    Spoiler anzeigen
    [autoit]

    #AutoIt3Wrapper_Change2CUI=y
    #include<WinAPI.au3>
    Global $GLOBAL_hConsole,$GLOBAL_hConsoleIn
    ; Initialize the CMD Funcs
    ; Parameter: [Opt] $ExitOnFatal - If True, The App exits with Fatal error if an error occurs in this Function (Default: False)
    ; Return values: Success: 1
    ; Error: 0 and @error:
    ; 1 - Could not allocate Console -> no In or outuput-Handle
    ; 2 - GetStdHandle for Output failed -> No Output-Handle, too
    ; 3 - GetStdHandle for Input failed, but we have an Ouput-Handle
    ;Author: Prog@ndy
    Func _CMD_STARTUP($ExitOnFatal=0)
    if not _WinAPI_AttachConsole() then
    $ret = DllCall("Kernel32.dll", "long", "AllocConsole")
    If $ret = 0 Then
    If $ExitOnFatal Then _WinAPI_FatalAppExit("Could not allocate Console")
    Return SetError(1,0,0)
    EndIf
    EndIf
    Global $GLOBAL_hConsole = _WinAPI_GetStdHandle(1)
    if $GLOBAL_hConsole= -1 then
    If $ExitOnFatal Then _WinAPI_FatalAppExit("GetStdHandle for Output failed")
    Return SetError(2,0,0)
    EndIf
    Global $GLOBAL_hConsoleIn = _WinAPI_GetStdHandle(0)
    if $GLOBAL_hConsoleIn = -1 then
    If $ExitOnFatal Then _WinAPI_FatalAppExit("GetStdHandle for Input failed")
    Return SetError(1,0,0)
    EndIf
    Return 1
    EndFunc

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

    ; PASUES CMD, waits for ENTER
    ;Prog@ndy
    Func _CMD_PAUSE()
    _CMD_Write("PAUSE: ENTER drücken")
    _CMD_READ()
    EndFunc

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

    ;Writes Text to CMD
    ;Prog@ndy
    Func _CMD_Write($text)
    Local $temp = _WinAPI_WriteConsole($GLOBAL_hConsole, CharToOem($text))
    Return SetError(@error,@extended,$temp)
    EndFunc

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

    ;REads Text from CMD
    ;Prog@ndy
    Func _CMD_READ()
    Local $test = DllStructCreate("char[10000]")
    Local $read = 5000
    Local $temp = _WinAPI_ReadFile($GLOBAL_hConsoleIn,DllStructGetPtr($test),DllStructGetSize($test),$read)
    If @error Then Return SetError(@error,@extended,$temp)
    Return OemToChar(DllStructGetData($test,1))
    EndFunc

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

    ;===============================================================================
    ; Name: OemToChar
    ; Description: Wandelt einen ASCII- in einen ANSI-String
    ; Parameter(s): $szSrc = String der umgewandelt werden soll
    ; Requirement(s): keine
    ; Return Value(s): bei Erfolg: umgewandelter String
    ; bei Fehler: "" und @error = 1
    ; Author(s): bernd670
    ;===============================================================================
    Func OemToChar($szSrc)
    ;~ Private Declare Function OemToChar Lib "user32.dll" Alias "OemToCharA" (ByVal lpszSrc As String, ByVal lpszDst As String) As Long
    Local $placeholder
    For $i = 0 To StringLen($szSrc)
    $placeholder &= " "
    Next
    Local $lRetVal = DllCall("user32.dll", "long", "OemToChar", "str", $szSrc, "str",$placeholder)
    If IsArray($lRetVal) And $lRetVal[0] = 1 Then
    Return SetError(0,0,$lRetVal[2])
    EndIf

    Return SetError(1,0,"")
    EndFunc ;==>OemToChar

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

    ;===============================================================================
    ; Name: CharToOEM
    ; Description: Wandelt einen ANSI- in einen ASCII-String
    ; Parameter(s): $szSrc = String der umgewandelt werden soll
    ; Requirement(s): keine
    ; Return Value(s): bei Erfolg: umgewandelter String
    ; bei Fehler: "" und @error = 1
    ; Author(s): Prog@ndy
    ;===============================================================================
    Func CharToOEM($szSrc)
    Local $placeholder
    For $i = 0 To StringLen($szSrc)
    $placeholder &= " "
    Next
    Local $lRetVal = DllCall("user32.dll", "long", "CharToOem", "str", $szSrc, "str",$placeholder)
    If IsArray($lRetVal) And $lRetVal[0] = 1 Then
    Return SetError(0,0,$lRetVal[2])
    EndIf

    Return SetError(1,0,"")
    EndFunc ;==>OemToChar

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

    _CMD_STARTUP(True) ; IMPORTANT !!!!!

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

    _CMD_Write("Bitte Name eingeben: ")
    $name = _CMD_READ()
    MsgBox(0, '', $name)
    _CMD_Write("Hallo, " &$name & @CRLF)
    _CMD_PAUSE()

    if not _CMD_Write("Hello World" & @CRLF) then
    MsgBox(0, "Error", "WriteConsole Failed")
    endif

    [/autoit]

    //Edit: Startup-Funktion verbessert, thx to Fast2 :)

    Einmal editiert, zuletzt von progandy (26. April 2008 um 11:50)

  • @progandy: Schöne UDF :thumbup: aber [kleinkariert]dazu gleich ein paar Dinge die mir aufgefallen sind(nix großes): 1. Oben fehlt das #include-once und 2. Seit wann kann man das Change2CUI in ne UDF schreiben(gibt es da keine Probleme wenn das z. B. noch mal im Hauptscript steht?)[/kleinkariert]
    Edit: Beim durchschauen sind mir noch eine Anregung gekommen: Ich würde anstatt MsgBoxen auszugeben lieber @Error setzen(bei _CMD_Startup()).
    So, jetzt aber genug reingeredet ;):P

    Projekte: Keine größeren (und fertigen)
    Gegen Internetzensur:
    https://epetitionen.bundestag.de/index.php?acti…s;petition=3860
    (Zeichnungsfrist abgelaufen)
    __________________________________________________________________________________________________________________________________
    Dieser Beitrag wurde bereits 264 mal editiert, zuletzt von »Fast2« (30. Februar 2009, 12:99)

    Einmal editiert, zuletzt von Fast2 (25. April 2008 um 23:06)

  • Ja, hast recht, habs geändert.
    [kleinkariert]: Denk mal, es gibt Probleme, wenn im Hauptskript Change2CUI = False NACH dem include steht. Davor sollte es nicht stören. Außerdem verwendet das eigentlich keineer mit False. Entweder fehlt es oder steht mit y (Ja) drin

  • Zitat

    [kleinkariert]: Denk mal, es gibt Probleme, wenn im Hauptskript Change2CUI = False NACH dem include steht. Davor sollte es nicht stören. Außerdem verwendet das eigentlich keineer mit False. Entweder fehlt es oder steht mit y (Ja) drin


    Das war leider falsch. #AutoIt3Wrapper_Change2CUI=y muss ins Hauptskript.
    Von dem Script aus Samstag, 19. April 2008, 15:55 Zeile 1 - 100 (Was für eine schöne Zahl :P ) in ein Include packen. und includen. Jetzt mal ein Bsp im Anhang
    //Edit: Version 1.5 gibt es hier:
    Console.zip
    Downloads Alte Version: 12

    2 Mal editiert, zuletzt von progandy (30. April 2008 um 14:50)

  • Hi,

    geht aber auch teilweise ohne _WinAPI_...

    [autoit]


    Func _CMD_Write($szText)
    ConsoleWrite($szText)
    EndFunc

    [/autoit]


    :D

    Nur ConsoleRead will nicht so richtig, obwohl es in der Hilfe so steht ..., aber ConsoleRead funzt nur mit der Text Konsole.


    Gruß
    Greenhorn