2017-03-13 4 views
0

Ich habe eine kleine Konsole App. Ich möchte sein Fenster ausblenden, wenn es von meinem Hauptprogramm aufgerufen wird (mit -Hide als Befehlszeilenparameter) und es anzeigen, wenn der Benutzer es startet (kein Befehlszeilenparam).Wie zeigt/versteckt man eine Konsolenfenster-App?

This question schlägt vor, dass die Verwendung von {$ APPTYPE GUI} anstelle von {$ APPTYPE CONSOLE} das Fenster verdeckt. Und tatsächlich funktioniert es. Aber wie mache ich das Fenster sichtbar, wenn es vom Benutzer ausgeführt wird?

Zweck: Ich möchte, dass mein Hauptprogramm still mit der Konsolen-App im Hintergrund interagiert (Konsole ist unsichtbar). Wenn der Benutzer die Konsolen-App also alleine startet, möchte ich ihn nur warnen: "Diese Konsolen-App macht x-Aufgabe. Sie können es nicht manuell starten ".

+0

AFAIK ist dies nicht möglich, ein Konsolenfenster Sichtbarkeit zu ändern, nachdem es bereits geöffnet ist. Zumindest nicht ohne ein paar Hacks. Denken Sie daran, dass ein Konsolenfenster von mehreren verschiedenen Anwendungen verwendet werden kann. Der Benutzer kann sogar eine Eingabeaufforderung öffnen und diese Anwendung von dort aus öffnen. –

+0

@JerryDodge - Sie können natürlich. Es ist ein Fenster. Siehe Link. – Ampere

+0

Wie gesagt, zumindest nicht ohne ein paar Hacks :-) Scheint wirklich fischig. Was wäre, wenn ich Ihre Anwendung manuell über eine Eingabeaufforderung öffnen würde? Es würde das Konsolenfenster verwenden, das bereits geöffnet war, in welchem ​​Fall das Fenster nicht zu dieser Anwendung gehört. –

Antwort

1
  1. Lassen Sie das Programm als Konsolenanwendung in Ruhe. Machen Sie es nicht zu einer GUI-Anwendung, da dies bedeutet, dass Benutzer keine direkte Konsole erhalten, wenn sie direkt gestartet werden.
  2. Wenn Sie das Programm von Ihrer Hauptanwendung aus starten, geben Sie CreateProcess ein und übergeben Sie dabei die CREATE_NO_WINDOW-Flagge. Dieses Flag stellt sicher, dass kein Konsolenfenster erstellt wird.
0

Ich benutze diese Methode in meiner app

function ExecuteDosCommand(CommandA : String) : string; 
var myStartupInfo : TStartupInfo; 
myProcessInformation : TProcessInformation; 
S : string; 
begin 
    myStartupInfo.dwFlags   := STARTF_USESHOWWINDOW; 
    myStartupInfo.wShowWindow  := SW_HIDE; 
    myStartupInfo.lpReserved  := nil; 
    myStartupInfo.cbReserved2  := 0; 
    myStartupInfo.lpReserved2  := nil; 
    myStartupInfo.lpTitle   := nil; 
    myStartupInfo.lpDesktop   := nil; 
    CreateProcess(nil,Pchar(CommandA),nil,nil,False,CREATE_DEFAULT_ERROR_MODE, 
       nil,nil,myStartupInfo ,myProcessInformation); 

    with myProcessInformation do 
    result := 'hProcess : THandle >> '+ IntToStr(hProcess )+#13+ 
      'hThread  : THandle >> '+ IntToStr(hThread )+#13+ 
      'dwProcessId : DWORD >> '+ IntToStr(dwProcessId)+#13+ 
      'dwThreadId : DWORD >> '+ IntToStr(dwThreadId )+#13; 
end; 
+0

Fehler beim Überprüfen auf Fehler. Lecks Griffe. Stellt nicht sicher, dass der zweite Arg schreibbar ist. Initialisiert nicht alle Felder der Startup-Informationen. Sie wenden sich nicht an die Konsole vs GUI-App. So viele Mängel. –