AGB  ·  Datenschutz  ·  Impressum  







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

Konsole Fenster unsichtbar machen

Ein Thema von Zodi · begonnen am 14. Mär 2021 · letzter Beitrag vom 14. Mär 2021
Antwort Antwort
Benutzerbild von Zodi
Zodi

Registriert seit: 19. Jul 2017
Ort: Berlin
47 Beiträge
 
Delphi XE7 Ultimate
 
#1

Konsole Fenster unsichtbar machen

  Alt 14. Mär 2021, 13:42
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{$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
Pascal
  Mit Zitat antworten Zitat
Benutzerbild von KodeZwerg
KodeZwerg

Registriert seit: 1. Feb 2018
3.691 Beiträge
 
Delphi 11 Alexandria
 
#2

AW: Konsole Fenster unsichtbar machen

  Alt 14. Mär 2021, 13:52
Pack diese Anweisung 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.)
Gruß vom KodeZwerg

Geändert von KodeZwerg (14. Mär 2021 um 14:02 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Zodi
Zodi

Registriert seit: 19. Jul 2017
Ort: Berlin
47 Beiträge
 
Delphi XE7 Ultimate
 
#3

AW: Konsole Fenster unsichtbar machen

  Alt 14. Mär 2021, 14:04
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 {$APPTYPE CONSOLE} durch {$APPTYPE GUI} ersetzt nun funktioniert es einwandfrei.
Pascal

Geändert von Zodi (14. Mär 2021 um 14:12 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von KodeZwerg
KodeZwerg

Registriert seit: 1. Feb 2018
3.691 Beiträge
 
Delphi 11 Alexandria
 
#4

AW: Konsole Fenster unsichtbar machen

  Alt 14. Mär 2021, 14:10
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
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.
Gruß vom KodeZwerg

Geändert von KodeZwerg (14. Mär 2021 um 14:17 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

AW: Konsole Fenster unsichtbar machen

  Alt 14. Mär 2021, 14:40
Mit {$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 {$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.

+ beim SetErrorMode?
Da werden Bits "kombiniert" und das macht man gefälligst mit OR.
$2B or not $2B

Geändert von himitsu (14. Mär 2021 um 14:44 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von KodeZwerg
KodeZwerg

Registriert seit: 1. Feb 2018
3.691 Beiträge
 
Delphi 11 Alexandria
 
#6

AW: Konsole Fenster unsichtbar machen

  Alt 14. Mär 2021, 14:49
Herrlich Dein Erklärung!
* AttachConsole ... wenn das ging, dann ist schon eine Console verbunden (kann man also auch zum Prüfen verwenden, ob Console oder nicht)
Mit 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)
Gruß vom KodeZwerg

Geändert von KodeZwerg (14. Mär 2021 um 14:52 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

AW: Konsole Fenster unsichtbar machen

  Alt 14. Mär 2021, 15:02
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.
$2B or not $2B

Geändert von himitsu (14. Mär 2021 um 15:04 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von KodeZwerg
KodeZwerg

Registriert seit: 1. Feb 2018
3.691 Beiträge
 
Delphi 11 Alexandria
 
#8

AW: Konsole Fenster unsichtbar machen

  Alt 14. Mär 2021, 17:12
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.

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

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
Gruß vom KodeZwerg
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

AW: Konsole Fenster unsichtbar machen

  Alt 14. Mär 2021, 18:10
Neeee, dafür hat man doch seine App für Restart und Recovery registriert, damit es danach wieder da ist.
https://docs.microsoft.com/en-us/win...cation-restart
$2B or not $2B
  Mit Zitat antworten Zitat
Antwort Antwort


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 22:58 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