Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi Titelleiste von Konsolen ausblenden (https://www.delphipraxis.net/36455-titelleiste-von-konsolen-ausblenden.html)

Shaman 20. Dez 2004 10:53


Titelleiste von Konsolen ausblenden
 
Hallo zusammen

Wie lässt sich die Titelleiste von Konsolenanwendungen ausblenden, damit sich diese nicht mehr resizen/verschieben lassen?
Delphi-Quellcode:
assert(SetWindowLong(hConsole, GWL_STYLE, GetWindowLong(hConsole, GWL_STYLE) and not WS_CAPTION) <> 0);
scheint nicht zu funktionieren... :?

Gruss
Shaman

Shaman 21. Dez 2004 15:24

Re: Titelleiste von Konsolen ausblenden
 
*Schwupps*

BKempf 21. Dez 2004 15:52

Re: Titelleiste von Konsolen ausblenden
 
Die Assertions sind in den Optionen aber eingeschaltet?
BTW warum überhaupt als Assertion?

Shaman 21. Dez 2004 16:00

Re: Titelleiste von Konsolen ausblenden
 
Das ist nur zum verdeutlichen, dass es nicht geht. Man kann es auch weglassen, dann passiert einfach nichts.

Christian Seehase 21. Dez 2004 16:10

Re: Titelleiste von Konsolen ausblenden
 
Moin Daniel,

wie holtst Du Dir denn das Handle der Konsole?

Sprint 21. Dez 2004 16:25

Re: Titelleiste von Konsolen ausblenden
 
Zitat:

Zitat von Shaman
Das ist nur zum verdeutlichen, dass es nicht geht. Man kann es auch weglassen, dann passiert einfach nichts.

Kann auch nicht gehen, weil ein Konsolenfenster kein WS_CAPTION hat. Das was du als Titelleiste siehst, wird intern wohl mit DrawCaption gezeichnet.

Shaman 22. Dez 2004 07:03

Re: Titelleiste von Konsolen ausblenden
 
Zitat:

Zitat von Christian Seehase
wie holtst Du Dir denn das Handle der Konsole?

Ich starte sie und such es mir dann raus. Bis jetzt mach ich das so:

Delphi-Quellcode:
function RunConsoleApp(const FileName: string; const Parent: TWinControl): THandle;

type
  PWndInfo = ^TWndInfo;
  TWndInfo = record
    ProcessID: DWORD;
    Handle: THandle;
  end;

  function EnumWindowsProc(hWnd: HWND; lParam: LPARAM): BOOL; stdcall;
  // Klappert alle Prozesse ab, bis derjenige der geöffneten Konsole gefunden wird
  var
    ProcessId: DWORD;
  begin
    GetWindowThreadProcessId(hWnd, ProcessId);
    if ProcessId = PWndInfo(lParam)^.ProcessID then // gefunden!
    begin
      PWndInfo(lParam)^.Handle:= hWnd; // Handle zurückliefern
      Result:= False; // Enumeration abbrechen
    end else
      Result:= True;  // Enumeration fortfahren
  end;

var
  SI: TStartupInfo;
  PI: TProcessInformation;
  Console: TWndInfo;
  cyCaption: Integer;
  cxFrame, cyFrame: Integer;
  ConsoleRect: TRect;
begin
  Result:= 0;
  // Struktur initialisieren
  FillChar(SI, SizeOf(TStartupInfo), 0);
  SI.cb        := SizeOf(TStartupInfo);
  SI.dwFlags   := STARTF_USESHOWWINDOW;  // Konsole soll am Anfang unsichtbar sein
  SI.wShowWindow:= SW_HIDE;               // und erst auf unserer Form angezeigt werden

  // Konsolenprogramm starten
  if CreateProcess(nil, PChar(FileName), nil, nil, False, 0, nil, nil, SI, PI) then
  begin
    CloseHandle(PI.hProcess); // Die beiden Handles brauchen wir nicht
    CloseHandle(PI.hThread);  // und können sie sofort wieder freigeben

    Console.ProcessID:= PI.dwProcessId;  // OK, die ProcessId der Konsole kennen wir...
    Console.Handle  := 0;               // ... aber ihr Handle noch nicht!

    while Console.Handle = 0 do                        // Also suchen wir es solange,
      EnumWindows(@EnumWindowsProc, LPARAM(@Console)); // bis wir es gefunden haben

    if Assigned(Parent) then
    begin
      SetParent(Console.Handle, Parent.Handle); // Konsole in unsere Anwendung platzieren

      // Jetzt wirds ungemütlich... Damit man die Konsole nicht verschieben/resizen kann,
      // muss ihr Rahmen ausgeblendet werden. Da dies über SetWindowLong nicht zu klappen
      // scheint, müssen wir ihn halt verstecken :(

      cyCaption:= GetSystemMetrics(SM_CYCAPTION);
      cxFrame:= GetSystemMetrics(SM_CXFRAME);
      cyFrame:= GetSystemMetrics(SM_CYFRAME);

      // Konsolengrösse festlegen
      // Achtung: Irgendetwas stimmt hier noch nicht so ganz!
      SetWindowPos(Console.Handle, 0,
        - cxFrame, - cyFrame - cyCaption,
        Parent.ClientWidth - 2*cxFrame, Parent.ClientHeight - cyCaption - 2*cyFrame,
        SWP_SHOWWINDOW); // Hier wird die Konsole schliesslich angezeigt

      // Da die Konsole nicht stetig resized werden kann, muss der Parent halt noch
      // ein wenig angepasst werden...
      GetWindowRect(Console.Handle, ConsoleRect);
      with ConsoleRect do
      begin
        Parent.ClientWidth:= Right - Left + 1 - 2*cxFrame;
        Parent.ClientHeight:= Bottom - Top + 1 - cyCaption - 2*cyFrame;
      end;
    end;
    // So, das wäre geschafft. Konsolenhandle zurückgeben und Feierabend.
    Result:= Console.Handle;
  end;
end;
Es geht mir jetzt eben drum, dass ich den Blödsinn mit dem Rahmen verdecken rausnehmen kann.

Gruss
Shaman

Shaman 22. Dez 2004 14:20

Re: Titelleiste von Konsolen ausblenden
 
Zitat:

Zitat von Sprint
Kann auch nicht gehen, weil ein Konsolenfenster kein WS_CAPTION hat. Das was du als Titelleiste siehst, wird intern wohl mit DrawCaption gezeichnet.

Aber WS_BORDER z.B. hat es, und das kann man genausowenig rausnehmen... :(

w3seek 23. Dez 2004 00:44

Re: Titelleiste von Konsolen ausblenden
 
die konsolenfenster werden intern von csrss.exe verwaltet und unterliegen daher speziellen schutzvorkehrungen. Der zugriff darauf ist daher nur eingeschraenkt moeglich.


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