Seite 1 von 2
In bereits geöffnete Console schreiben
Verfasst: 15.03.2011 16:34
von lassma-asma
Hallo Leute ,
ich habe folgendes Problem:
Ich starte einen dedizierten Server des Spiels Call of Juarez, der Server läuft dann an und rattert in einer dann geöffneten Console.
Jetzt möchte ich (um automatisierte Servermessages einzubauen) also die offene Konsole "ansprechen" und ihr Stringinputs geben (die zu übermittelnen zeilen)
Doch leider schaffe ich es nicht recht die Console anzusprechen
Ich starte den Server mit
Code: Alles auswählen
coj = RunProgram(w$,"-server -dedicated -internet -ami","")
wobei w$ der Pfad zur exe ist und dann kommt die CD check. abfrage die sich dann wieder schließt und daraufhin öffnet sich die Serverconsole.
das programm "coj" aber läuft danach nicht mehr (schätze das is nur die dvd abfrage, die dann erst diese console öffnet)
also muss ich die offene konsole iwie finden und in sie schreiben....
und vllt auf ähnlichem weg auch wieder auslesen, das wäre auch noch wichtig ....
kann mir jemand helfen ?
hab auch schon in den Win32 API befehlen nachgeschaut, bin mir auch ziemlich sicher, dass jemand der sich da besser auskennt als ich, das hinbekommen würde
lg lassma-asma !
Re: In bereits geöffnete Console schreiben
Verfasst: 15.03.2011 16:52
von ts-soft
Code: Alles auswählen
coj = RunProgram(w$,"-server -dedicated -internet -ami","", #PB_Program_Open | #PB_Program_Read | #PB_Program_Write)
Für das weitere vorgehen bitte in der Hilfe unter Process nachsehen, sowie das Beispiel zu RunProgram!
Re: In bereits geöffnete Console schreiben
Verfasst: 15.03.2011 19:45
von lassma-asma
hi ts-soft,
danke schonmal aber das habe ich auch schon probiert.
das programm coj läuft kurze zeit später offiziell nicht mehr / ist also auch nicht mit den normalen write read befehlen ansprechbar, es öffnet anscheinend die konsole (nach dem dvd check) welche ich dann ja offiziell nicht mit runprogram gestartet habe und deshalb kann ich nicht über coj und die standard write read befehle zugreifen.
Ich müsste die offene Console also erst iwie "ins programm bringen" um dann darauf zu zu greifen ....
ich schätze es geht iwie mit den win32 api befehlen, kenne mich damit aber noch nich so dolle aus ....
Re: In bereits geöffnete Console schreiben
Verfasst: 15.03.2011 20:04
von ts-soft
Naja, das ist dann schon etwas komplizierter. Die notwendige API wäre wohl:
http://msdn.microsoft.com/en-us/library ... 85%29.aspx
Da dann durch die Processe iterieren, bis der passende da ist, aber erst wenn
dieser existiert.
Wird nicht einfach und ohne Testmöglichkeit kann ich Dir da nichts basteln.
Re: In bereits geöffnete Console schreiben
Verfasst: 15.03.2011 20:26
von lassma-asma
hi !
danke schonmal ...
naja als test ginge einfach sich von "hand" ne console öffnen und versuchen (ohne dass man sie in pb mit runprogram geöffnet hat) iwie anzusteuern ...
also mit der func mach ich nen snapshot aber wie ich genau dann zu dem process komme is mir nich so ganz ersichtlich ..
ginge es nicht iwie den prozess / die console über ihren namen oder so anzusteuern ?
Re: In bereits geöffnete Console schreiben
Verfasst: 15.03.2011 20:56
von lassma-asma
also mittels FindWindow_ findet man die konsole (also das fenster) über den namen ...
somit kann ich mittels simulierten keyboardeingaben (wen die console in den keyboardfocus kommt) dann eine eingabe simnulieren ..
aber wie komme ich von dem fenster zu der console ?! beziehungsweise wie kann ich wenn ich das fenster habe den output der console lesen / verarbeiten ?
eventuell komme ich der sache näher ... mit der funktion GetProcessPIDfromHWND(WindowHandle) komme ich schon mal vom window zur PID .. nur leider bekomme ich beim compilieren den fehler "Folgende PureLibrary fehlt: StringExtension" .. weiß jemand wo ich die her bekomme ?
Re: In bereits geöffnete Console schreiben
Verfasst: 15.03.2011 21:46
von c4s
Re: In bereits geöffnete Console schreiben
Verfasst: 15.03.2011 22:29
von lassma-asma
oh ja super damit kommen wir der sache langsam näher !
das attachen hat echt geholfen ...
ich bin jetzt soweit, dass ich die konsole mit der attachfuntion "zum greifen habe" aber ich bekomme iwie keinen string + enter/return in den input (wie wenn ein user es eintippt und return drückt)
da noch eine idee ?!
Code: Alles auswählen
EnableExplicit
Global hConsole
Global Text$ = "/adminsay lol"+ Chr(13)
Global nbWritten
Global coj
Global AttachConsole
Prototype AttachConsole(dwProcessID)
Global w$ = "E:\Programme\Ubisoft\Techland\Call of Juarez\coj.exe"
coj = RunProgram(w$,"-server -dedicated -internet -ami","",#PB_Program_Open )
Debug coj
Delay(30000) ;bis dvd check weg und server oben
Debug "go"
If OpenLibrary(0, "Kernel32.dll")
AttachConsole.AttachConsole = GetFunction(0, "AttachConsole")
Debug "fun loaded"
If AttachConsole
If AttachConsole(ProgramID(coj))
hConsole = GetStdHandle_(#STD_OUTPUT_HANDLE)
If hConsole <> #INVALID_HANDLE_VALUE
WriteConsoleInput_(hConsole, @Text$, Len(Text$), @nbWritten)
WriteConsoleInput_(hConsole, @Text$, Len(Text$), @nbWritten)
Else
MessageRequester("", "Invalid console handle!")
EndIf
FreeConsole_()
Else
MessageRequester("", "Not started from a console!")
EndIf
Else
MessageRequester("", "AttachConsole not present!")
EndIf
CloseLibrary(0)
EndIf
Re: In bereits geöffnete Console schreiben
Verfasst: 15.03.2011 23:17
von c4s
Das wird etwas schwieriger. Such einfach mal nach ReadConsole_() und ähnlichem. Vorallem im englischen Forum dürftest du ein paar nützliche Funktionen dazu finden.
Re: In bereits geöffnete Console schreiben
Verfasst: 16.03.2011 00:40
von lassma-asma
hi !
danke für den tipp ...
leider habe ich nichts gefunden was mich weiter bringt...
also ich bin auf dem stand, dass ich die konsole als handle hab und mit writefile_ oder writeconsole_ auch etwas "auf den scrren" also in die konsole "schreiben" kan, aber es ist dann nicht im input
es wird also nicht als bzw wie eine "nutzereingabe" behandelt ...
ich müsste also etwas in den input schrieben schätze ich .. also WriteConsoleInput_() benutzen, allerdings weiß ich nicht genau wie das bnei den parametern ist :
The WriteConsoleInput function writes data directly to the console input buffer.
BOOL WriteConsoleInput(
HANDLE hConsoleInput, // handle to a console input buffer
CONST INPUT_RECORD *lpBuffer, // pointer to the buffer for write data
DWORD nLength, // number of records to write
LPDWORD lpNumberOfEventsWritten // pointer to number of records written
);
Parameters
hConsoleInput
Identifies the input buffer. The handle must have GENERIC_WRITE access.
lpBuffer
Points to an INPUT_RECORD buffer containing data to be written to the input buffer.
nLength
Specifies the number of input records to be written.
lpNumberOfEventsWritten
Points to a 32-bit variable that receives the number of input records actually written.
Return Values
If the function succeeds, the return value is nonzero.
If the function fails, the return value is zero. To get extended error information, call GetLastError.
Remarks
WriteConsoleInput places input records into the input buffer behind any pending events in the buffer. The input buffer grows dynamically, if necessary, to hold as many events as are written.
Windows NT: This function uses either Unicode characters or 8-bit characters from the console's current codepage. The console's codepage defaults initially to the system's OEM codepage. To change the console's codepage, use the SetConsoleCP or SetConsoleOutputCP functions, or use the chcp or mode con cp select= commands.
das handle für den inputbuffer bekomme ich ja duch das "getstdhandle"(ich schätze mit "STD_INPUT_HANDLE" als parameter ?!)
aber was hat es mit dem INPUT_RECORD buffer (2. argument) auf sich ?
woher/wie komme ich da ran und was ist er überhaupt ?! sehe ich es richtig, dass ich da dann als input nich einfach einen string schreiben kann sondern bestimmte INPUT_RECORDs also sowas wie tasteneingaben usw in den inputbuffer schreiben muss?
ich verzweifle echt langsam dran
