Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Konsole Fenster unsichtbar machen (https://www.delphipraxis.net/207331-konsole-fenster-unsichtbar-machen.html)

Zodi 14. Mär 2021 12:42

Konsole Fenster unsichtbar machen
 
Hi Delphianer

Ich versuche mich gerade etwas mit der Konsole.
Nun würde ich gerne das Konsolefenster unsichtbar machen wenn ich mein Programm ausführe da das schwarze Fenster ja nicht unbedingt schön ist.
Ich habe gelesen das man nur das
Delphi-Quellcode:
{$APPTYPE CONSOLE}
weglassen muss.
Leider funktioniert das bei mir nicht, weiss wer warum das so ist und an was es liegen kann?

Bisher schaut mein Code so aus.
Delphi-Quellcode:
program meinprogi;

{$R *.res}

//{$APPTYPE CONSOLE}

uses
  messages, windows;

var
  Msg: TMsg;

begin

  NoErrMsg := True;
  SetErrorMode(SEM_FAILCRITICALERRORS + SEM_NOALIGNMENTFAULTEXCEPT + SEM_NOGPFAULTERRORBOX + SEM_NOOPENFILEERRORBOX);

  Randomize;

  while true do begin
    sleep(10);
    PeekMessage(Msg, 0, 0, 0, PM_REMOVE);
    TranslateMessage(Msg);
    DispatchMessage(Msg);
  end;

end.
Grüsse Zodi

KodeZwerg 14. Mär 2021 12:52

AW: Konsole Fenster unsichtbar machen
 
Pack diese Anweisung
Delphi-Quellcode:
ShowWindow(GetConsoleWindow(), SW_HIDE);
über Deine Schleife, sollte das machen was Du möchstest, eine Console App ohne Console :-]

Wenn es doch noch mal sichtbar werden soll, genau, ShowWindow(GetConsoleWindow(), SW_SHOW); und fertig.

//edit
{$APPTYPE CONSOLE} <<-- drinnen lassen!

//reedit
zum erklären hat himitsu bestimmt viel zu sagen, da verlasse ich mich mal drauf *zwinker*
(Ich vermute mal das ohne das {$APPTYPE CONSOLE} Windows eine Fenster Initialisierung erwartet, wie bei non-Vcl Anwendungen.)

Zodi 14. Mär 2021 13:04

AW: Konsole Fenster unsichtbar machen
 
Hi CodeZwerg leider funktioniert das nicht ganz sauber.
Das Fenster blitzt schnell auf und dann ist es weg.

Habe mitlerweile die Lösung gefunden und das
Delphi-Quellcode:
{$APPTYPE CONSOLE}
durch
Delphi-Quellcode:
{$APPTYPE GUI}
ersetzt nun funktioniert es einwandfrei.

KodeZwerg 14. Mär 2021 13:10

AW: Konsole Fenster unsichtbar machen
 
Hmmm, dann probiere es mal doch ohne {$APPTYPE CONSOLE} bzw mit {$APPTYPE GUI}.
In Deine Schleife solltest Du schon gelangen.

Wenn Du dann doch mal die Console brauchen solltest ist AllocConsole() Dein Freund.

//edit
Zitat:

Zitat von Zodi (Beitrag 1485091)
Hi CodeZwerg leider funktioniert das nicht ganz sauber.
Das Fenster blitzt schnell auf und dann ist es weg.

Meinst Du mit "dann ist es weg" das sich der Process geschlossen hat? Weil wenn nicht ist es doch das was Du wolltest.

himitsu 14. Mär 2021 13:40

AW: Konsole Fenster unsichtbar machen
 
Mit
Delphi-Quellcode:
{$APPTYPE CONSOLE}
wird die EXE im PE-Header als Consolen-Anwendung markiert.
Windows stellt dann beim Programmstart eine Verbindung zur Console her (wenn aus einer Console oder einer anderen Consolen-Anwendung gestartet wurde) oder Windows erstellt eine Console, wenn noch Keine existiert.

Ohne
Delphi-Quellcode:
{$APPTYPE CONSOLE}
kommt durch Windows also keine "automatische" Console.
Dann kann man sich aber selber damit verbinden oder Eine erstellen.
Bei Google suchenAttachConsole bzw. Bei Google suchenAllocConsole und mit Bei Google suchenFreeConsole wieder weg.

https://www.delphipraxis.net/103940-...v2-0-15-a.html
Für windows ist das eine GUI-Anwendung, aber wenn aus einer Console gestartet, verhält es sich wie eine Consolen-Anwendung.
* AttachConsole ... wenn das ging, dann ist schon eine Console verbunden (kann man also auch zum Prüfen verwenden, ob Console oder nicht)
* will man immer eine Console, dann AttachConsole und wenn nicht AllocConsole
* und will man nur GUI, dann eben nichts machen

Auch wenn es eine Console-Anwendung ist, kann man dennoch eine GUI anzeigen
und auch andersrum, kann eine GUI-Anwendung ebenfalls eine Console einblenden.


ACHTUNG:
Wenn PeekMessage ein False sagt, dann darf TranslateMessage/DispatchMessage nicht gemacht werden.
Da dein WHILE keine Abbruchbedingung hat (warum nicht?), kannst auch Sleep und PeakMessage weglassen und GetMessage verwenden.

Delphi-Quellcode:
+
beim SetErrorMode?
Da werden Bits "kombiniert" und das macht man gefälligst mit OR.

KodeZwerg 14. Mär 2021 13:49

AW: Konsole Fenster unsichtbar machen
 
Herrlich Dein Erklärung!
Zitat:

Zitat von himitsu (Beitrag 1485094)
* AttachConsole ... wenn das ging, dann ist schon eine Console verbunden (kann man also auch zum Prüfen verwenden, ob Console oder nicht)

Mit
Delphi-Quellcode:
GetConsoleWindow() <> 0 und <> INVALID_HANDLE_VALUE
hab ich bei meinen "dual"-Projekten verwendet. (dual = es war console und/oder gui in einer .exe, kam auf Parameter an was die .exe beim start machen sollte)

himitsu 14. Mär 2021 14:02

AW: Konsole Fenster unsichtbar machen
 
Gibt oft mehrere Wege.
Ich hatte dort halt mit AttachConsole/AllocConsole gespielt.
* einmal automatisch von wo es gestartet wurde (z.B. aus CMD oder Explorer/Link) und dementsprecht Ausgabe in Console oder Anzeige einer GUI
* oder via Parameter

GetConsoleWindow geht explizit auf ein ConsolenFenster.

Was ist, wenn das Programm unsichtbar als Console mit Umleitung der Ausgabe läuft?
Auch ist es möglich eine Anwendung auf einem anderen Nuteraccount oder gar Rechner laufen zu lassen und das ConsolenFenster wo anders zu haben. Da gibt es "hier" dann kein Fenster.
Mir fällt grade ein, dass ich das damals aber auch nicht beachtet hatte. Aber da könnte man die Prüfung einfach auf StdOut bzw. StdIn machen.

KodeZwerg 14. Mär 2021 16:12

AW: Konsole Fenster unsichtbar machen
 
Zitat:

Zitat von himitsu (Beitrag 1485099)
GetConsoleWindow geht explizit auf ein ConsolenFenster.

GetConsoleWindow gibt ein Handle vom einer zugewiesenen Console wieder oder NULL bei "iss nix da". Vielleicht meinen unsere Sätze beide das gleiche nur anders ausgedrückt.

Zitat:

Zitat von himitsu (Beitrag 1485099)
Was ist, wenn das Programm unsichtbar als Console mit Umleitung der Ausgabe läuft?

Dann werde ich es ja wohl programmiert haben und Wissen das mein GetConsoleWindow Probleme hat :)

Zitat:

Zitat von himitsu (Beitrag 1485099)
Aber da könnte man die Prüfung einfach auf StdOut bzw. StdIn machen.

Aber besser hätte ich Deine Frage auch nicht beantworten können, ich hätte mich halt vorher noch schlau machen müssen, hiermit getan, Danke!


Aber was ist bei Stromausfall? Zappenduster alles, auch Console ist weg :)

himitsu 14. Mär 2021 17:10

AW: Konsole Fenster unsichtbar machen
 
Neeee, dafür hat man doch seine App für Restart und Recovery registriert, damit es danach wieder da ist. :lol:
https://docs.microsoft.com/en-us/win...cation-restart


Alle Zeitangaben in WEZ +1. Es ist jetzt 02:09 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