AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Konsolenfenster im GUI-Mode unterdrücken

Ein Thema von naujo · begonnen am 23. Aug 2005 · letzter Beitrag vom 19. Apr 2014
Antwort Antwort
Seite 1 von 3  1 23      
naujo

Registriert seit: 31. Jan 2005
25 Beiträge
 
Delphi 6 Enterprise
 
#1

Konsolenfenster im GUI-Mode unterdrücken

  Alt 23. Aug 2005, 16:22
Hallo zusammen,

ich habe das folgende Problem:
Das Programm welches ich schreibe soll eine grafische Oberfläche verfügen und auch über die Kommandozeile sich bedienen lassen. Wenn die Kommandozeile verwendet wird dann kommt keine GUI. Wenn jetzt aber die GUI aufgerufen werden soll, dann erscheint im Hintergrund immer das Konsolenfenster.

Das möchte ich aber nicht anzeigen, weil den Anwender sonst zu sehr verwirrt.

Wenn ich aber die {$APPTYPE CONSOLE} Compiler-Direktive lösche, dann kann ich keinen Text mehr auf der Konsole ausgeben, es kommt dann immer eine Zugriffverletzung.

Hier mal ein Auszug aus dem Hauptprogramm:
Delphi-Quellcode:
begin
  Application.Initialize;
  Application.Title := 'Main';
  Application.CreateForm(TMainFrm, MainFrm);
  Application.CreateForm(TFrmInfo, FrmInfo);
  (...)

  if (not BatchMode) then
  begin
    (...)
    Application.Run;
  end
  else
  begin
    // Muss eingefuegt werden, da es sonst zu einem Programmabsturz kommt
    {$APPTYPE CONSOLE}
    (...)
    // Hier erfolgen dann Ausgaben in Konsolenfenster
  end;
end.
Vielen Dank dann schon mal für eure Antworten.

MfG

Naujo
  Mit Zitat antworten Zitat
Benutzerbild von c113plpbr
c113plpbr

Registriert seit: 18. Nov 2003
Ort: localhost
674 Beiträge
 
Delphi 2005 Professional
 
#2

Re: Konsolenfenster im GUI-Mode unterdrücken

  Alt 23. Aug 2005, 17:39
Hi Naujo,

nur dass es da keine missverständnisse gibt:
{$APPTYPE CONSOLE} ist eine *compiler direktive*, d.h. es ist im grunde egal wo das dingens steht, selbst wenn die zeile in der es steht nicht "aufgerufen" wird, besitzt die anwendung dennoch ein konsolenfenster!
D.h. das mit ner einfachen if-abfrage zu lösen kannst du schonmal vergessen.

Wenn du nicht unbedingt eine ausgabe auf der konsole brauchst, sondern nur das programm ausführen willst, dann lass die $APPTYPE CONSOLE-Direktive weg, und erzeuge einfach nur keine graphische oberfläche. Das läuft dann auch in der konsole, nur eben ohne ausgabe & graphische oberfläche.

Eine weitere möglichkeit wäre evtl. noch, das konsolenfenster nach dem start des programmes zu verstecken. Also fenster suchen, und verstecken.

Andere möglichkeiten fallen mir dazu atm. nicht ein ...

ciao, Philipp
Philipp
There is never enough time to do all the nothing you want.
*HABENWILL*
  Mit Zitat antworten Zitat
jbg

Registriert seit: 12. Jun 2002
3.483 Beiträge
 
Delphi 10.1 Berlin Professional
 
#3

Re: Konsolenfenster im GUI-Mode unterdrücken

  Alt 23. Aug 2005, 17:45
AllocConsole macht eine neue Konsole auf.
  Mit Zitat antworten Zitat
r2c2

Registriert seit: 9. Mai 2005
Ort: Nordbaden
925 Beiträge
 
#4

Re: Konsolenfenster im GUI-Mode unterdrücken

  Alt 23. Aug 2005, 17:49
Ich weiß jetzt nicht, ob du das hören willst, aber du könntest 2 Programme schreiben. Wenn du OO Programmierst sollte es kein Problem sein, aus der GUI ne Console zu machen.

Ich muss aber zugeben, dass ich wahrscheinlich auch einfach nur das Consolen-Fenster verstecken würde...

mfg

Christian
Kaum macht man's richtig, schon klappts!
  Mit Zitat antworten Zitat
naujo

Registriert seit: 31. Jan 2005
25 Beiträge
 
Delphi 6 Enterprise
 
#5

Re: Konsolenfenster im GUI-Mode unterdrücken

  Alt 24. Aug 2005, 07:45
Moin moin,

Zitat:
Ich weiß jetzt nicht, ob du das hören willst, aber du könntest 2 Programme schreiben.
Das wollte ich auf jeden fall vermeiden. Aber es wäre kein Problem, weil ich alles in Klassen gekapselt habe. Und die Ausgaben sauber von einander getrennt habe, die Logik arbeitet unabhängig vom Modus (so es eigenlich immer sein soll, auch wenn man nur eine grafische Oberfläche oder nur aus Konsolenebene arbeitet).

Zitat:
Eine weitere möglichkeit wäre evtl. noch, das konsolenfenster nach dem start des programmes zu verstecken. Also fenster suchen, und verstecken.
Wie setzt man das in DeLphi um? Das stellt für mich die beste Lösung dar.

Vielen Dank für eure Antworten.

MfG

Naujo
  Mit Zitat antworten Zitat
r2c2

Registriert seit: 9. Mai 2005
Ort: Nordbaden
925 Beiträge
 
#6

Re: Konsolenfenster im GUI-Mode unterdrücken

  Alt 24. Aug 2005, 09:08
Zitat von naujo:
Zitat:
Eine weitere möglichkeit wäre evtl. noch, das konsolenfenster nach dem start des programmes zu verstecken. Also fenster suchen, und verstecken.
Wie setzt man das in DeLphi um? Das stellt für mich die beste Lösung dar.
Such mal nach Delphi-Referenz durchsuchenFindWindow(Ex). Damit bekommst du das Handle des Fensters. Zum Verstecken gibts auch ne Funktion(HideWindow? weiß nicht mehr). Auf jeden Fall fidest du was, wenn du danach suchst(DP, dsdt.info, swissdelphicenter.ch, goolge...).

mfg

Christian
Kaum macht man's richtig, schon klappts!
  Mit Zitat antworten Zitat
Olli
(Gast)

n/a Beiträge
 
#7

Re: Konsolenfenster im GUI-Mode unterdrücken

  Alt 24. Aug 2005, 10:37
1.) Diese Frage gibt es hier im Forum mindestens schon einmal
2.) Vergiß es!

Kurze Begründung: a.) habe ich das sehr lange probiert und dazu auch versucht mit RE den Konsolen auf die Spur zu kommen. b.) kann es nicht gehen, weil der PE-Loader bereits die Konsole für den Prozeß alloziert (bei APPTYPE CONSOLE). Damit bist du machtlos und die Konsole wir in jedem Fall kurz erscheinen. Selbst Tricks mit der PEB/TEB (nur unter NT) waren zwecklos. Man dreht sich dort im Kreis, weil die Überprüfung erst geschehen kann, wenn das Programm bereits läuft - zu dem Zeitpunkt existiert aber bereits eine Konsole oder sie existiert eben nicht (APPTYPE GUI) - dann gibt's allerdings auch keine Elternkonsolhandles.

Ich denke mal, daß du das gleiche erreichen möchtest wie ich bei meinem RShutdown2 damals: daß dein Programm von einer "Elternkonsole" aus gestartet werden kann und dann dort seine Ausgaben/Eingaben bekommt. Ich will nicht behaupten, daß es komplett unmöglich sei, aber es ist doch recht fragwürdig - zumal bei dem Aufwand in Sachen RE usw.

Ich habe es übrigens dann ganz pragmatisch über MSDN-Library durchsuchenFreeConsole() gelöst. So wird zwar die Konsole kurz angezeigt, ich habe aber dennoch volle Konsolenfunktionialität, wenn die Parameter dies erfordern. Logischerweise kannst du FindWindow() usw. dann auch knicken, weil Konsolennamen theoretisch verschieden sein können. FreeConsole() tut aber seinen Job hervorragend, da es eh nur eine Konsole (pro Prozeß) geben kann ... sonst würde ja MSDN-Library durchsuchenAllocConsole() das Handle zu einer beliebigen neu erzeugten Konsole zurückliefern und nicht nur Erfolg oder Mißerfolg

Ab Windows XP gibt's noch MSDN-Library durchsuchenAttachConsole(), welches dem o.g. Ziel (wenn dies denn deines ist) durchaus helfen könnte. Ich werde mir das mal im Disassembler angucken und vielleicht mit einer Lösung auch ab NT4 rüberrücken. Aber Win9x-Kompat. kannste da definitiv knicken.

Nachtrag: Ich habe es mir gerade angeguckt. Es hängt doch einiges mehr dran. Das größte Problem aber sind die Client/Server-Nachrichten (CSR-Messages), welche nunmal leider nicht dokumentiert sind. Wenn du eine CSR auf Windows 2000 mit einer bestimmten ID zum Laufen bekommen hast, kannst du dir auf Windows XP damit gut und gerne Hardware zerschiessen. Ist also nix wirklich kompatibles. Zumal fraglich ist, ob diese spezifische CSR schon in Windows 2000 existieren würde. Ich werde es mal demnächst versuchen, könnte ja sein, daß es auch ohne die geht. Aber wer weiß :-/
  Mit Zitat antworten Zitat
naujo

Registriert seit: 31. Jan 2005
25 Beiträge
 
Delphi 6 Enterprise
 
#8

Re: Konsolenfenster im GUI-Mode unterdrücken

  Alt 24. Aug 2005, 10:47
Moin,

also wenn das alles so einen erheblichen Aufwand darstellt, dann muss halt der Anwender mit einem Konsolenfenster im Hintergrund leben, dafür kann ich dann auch nix.

Und was ich nicht erwähnt hatte das Programm soll auch ab Win 95 bzw. Win NT 4 laufen. Ich hatte gedacht, dass es irgendeine Möglichkeit gibt, dass per Schalter oder API-Aufruf einfach zu unterdrücken.

Vielen Dank aber schon mal für eure Mühe.

MfG

Naujo
  Mit Zitat antworten Zitat
Olli
(Gast)

n/a Beiträge
 
#9

Re: Konsolenfenster im GUI-Mode unterdrücken

  Alt 24. Aug 2005, 11:02
Zitat von naujo:
Und was ich nicht erwähnt hatte das Programm soll auch ab Win 95 bzw. Win NT 4 laufen. Ich hatte gedacht, dass es irgendeine Möglichkeit gibt, dass per Schalter oder API-Aufruf einfach zu unterdrücken.
Leider nein, da dieses Flag wie gesagt nicht von der EXE sondern schon davor ausgewertet wird ...
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.184 Beiträge
 
Delphi 12 Athens
 
#10

Re: Konsolenfenster im GUI-Mode unterdrücken

  Alt 10. Nov 2007, 09:42
hab jetzt mal einiges von da oben ausprobiert...

AllocConsole und AttachConsole erzeugen beide eine neue Console (unter WinXP)
sieht vorallem witzig aus wenn das Programm von einer Console (oder Batchfile) aus gestartet wurde und nun zwei davon da sind.

mit $APPTYPE CONSOLE hatte ich es schon versucht, aber da bleib ich nun bei GUI (das Programm läuft ja vorwiegend damit)
OK, das Programm arbeitet zwar NonVCL und da werden die Fenster genauso mit Console, als auch ohne (GUI) angezeigt, aber da stört mich schon dieses Konsolenfenster, wenn es nicht benötigt wird.


ich wollte einfach nur eine Statusmeldung in der Konsole ausgebn (wenn diese exisiert) ...
gibt es da nun inzwischen irgendwo eine Lösung dafür?
Input wird nicht benötigt, ich würde nur genr irgendwie ein/zwei Zeilen dareinschreiben.

MfG <(^_^<)


[add]
aaaalso, FreeConsole schließt zwar nur die vom Programm erzeugte
Konsoleund Eine z.B. von 'ner Batch-Datei bleibt geöffnet,
aber nach dem Aufruf st dennoch (war ja irgendwie klar) die Verbindung
zur "Batch-Datei"-Konsole futsch.

Delphi-Quellcode:
{$APPTYPE CONSOLE}
Sleep(2000);
WriteLn('123'); // << in "alter" Konsole
Sleep(2000);
if FreeConsole then A := 'f';
Sleep(2000);
{$i-} WriteLn('456'); {$i+}  // << dieses wird natürlich nie ausgegeben
Sleep(2000);
if AllocConsole then A := A + 'a';
Sleep(2000);
{$i-} WriteLn('789'); {$i+}  // << Ausgabe in neuer Konsole (AllocConsole)
Sleep(2000); // auch geschützt, da beim der mit AllocConsole
Exception(998, [A]); // erzeugten Konsole zwar der Text geschrieben wird,
                             // aber dennoch eine Exception auftritt
[add2]
wenn jetzt dieses "kurzzeitige" Konsolenfenster und die Beschränkung auf WinXP/Vista nich wäre,
dann könnte man es wohl so lassen
Delphi-Quellcode:
{$APPTYPE CONSOLE}
FreeConsole;
isConsole := AttachConsole(ATTACH_PARENT_PROCESS);

if isConsole then WriteLn('irgendwas');
dieses hat mir auch gleich mal eine Lösug gegeben, wie ich automatisch rausbekommen kann ob GUI oder Konsole.
$2B or not $2B
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 3  1 23      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 08:30 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz