AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Win32/Win64 API (native code) Delphi Titelleiste von Konsolen ausblenden
Thema durchsuchen
Ansicht
Themen-Optionen

Titelleiste von Konsolen ausblenden

Ein Thema von Shaman · begonnen am 20. Dez 2004 · letzter Beitrag vom 23. Dez 2004
Antwort Antwort
Benutzerbild von Shaman
Shaman

Registriert seit: 2. Nov 2003
Ort: Schweiz
407 Beiträge
 
Turbo Delphi für Win32
 
#1

Titelleiste von Konsolen ausblenden

  Alt 20. Dez 2004, 10:53
Hallo zusammen

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

Gruss
Shaman
Daniel Pauli
Looking for answers from the great beyond
  Mit Zitat antworten Zitat
Benutzerbild von Shaman
Shaman

Registriert seit: 2. Nov 2003
Ort: Schweiz
407 Beiträge
 
Turbo Delphi für Win32
 
#2

Re: Titelleiste von Konsolen ausblenden

  Alt 21. Dez 2004, 15:24
*Schwupps*
Daniel Pauli
Looking for answers from the great beyond
  Mit Zitat antworten Zitat
BKempf

Registriert seit: 1. Jun 2004
103 Beiträge
 
Delphi 6 Enterprise
 
#3

Re: Titelleiste von Konsolen ausblenden

  Alt 21. Dez 2004, 15:52
Die Assertions sind in den Optionen aber eingeschaltet?
BTW warum überhaupt als Assertion?
The problem with troubleshooting is that sometimes the trouble shoots back.
  Mit Zitat antworten Zitat
Benutzerbild von Shaman
Shaman

Registriert seit: 2. Nov 2003
Ort: Schweiz
407 Beiträge
 
Turbo Delphi für Win32
 
#4

Re: Titelleiste von Konsolen ausblenden

  Alt 21. Dez 2004, 16:00
Das ist nur zum verdeutlichen, dass es nicht geht. Man kann es auch weglassen, dann passiert einfach nichts.
Daniel Pauli
Looking for answers from the great beyond
  Mit Zitat antworten Zitat
Christian Seehase
(Co-Admin)

Registriert seit: 29. Mai 2002
Ort: Hamburg
11.105 Beiträge
 
Delphi 11 Alexandria
 
#5

Re: Titelleiste von Konsolen ausblenden

  Alt 21. Dez 2004, 16:10
Moin Daniel,

wie holtst Du Dir denn das Handle der Konsole?
Tschüss Chris
Die drei Feinde des Programmierers: Sonne, Frischluft und dieses unerträgliche Gebrüll der Vögel.
Der Klügere gibt solange nach bis er der Dumme ist
  Mit Zitat antworten Zitat
Benutzerbild von Sprint
Sprint

Registriert seit: 18. Aug 2004
Ort: Edewecht
712 Beiträge
 
Delphi 5 Professional
 
#6

Re: Titelleiste von Konsolen ausblenden

  Alt 21. Dez 2004, 16:25
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.
Ciao, Sprint.

"I don't know what I am doing, but I am sure I am having fun!"
  Mit Zitat antworten Zitat
Benutzerbild von Shaman
Shaman

Registriert seit: 2. Nov 2003
Ort: Schweiz
407 Beiträge
 
Turbo Delphi für Win32
 
#7

Re: Titelleiste von Konsolen ausblenden

  Alt 22. Dez 2004, 07:03
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
Daniel Pauli
Looking for answers from the great beyond
  Mit Zitat antworten Zitat
Benutzerbild von Shaman
Shaman

Registriert seit: 2. Nov 2003
Ort: Schweiz
407 Beiträge
 
Turbo Delphi für Win32
 
#8

Re: Titelleiste von Konsolen ausblenden

  Alt 22. Dez 2004, 14:20
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...
Daniel Pauli
Looking for answers from the great beyond
  Mit Zitat antworten Zitat
w3seek
(Gast)

n/a Beiträge
 
#9

Re: Titelleiste von Konsolen ausblenden

  Alt 23. Dez 2004, 00:44
die konsolenfenster werden intern von csrss.exe verwaltet und unterliegen daher speziellen schutzvorkehrungen. Der zugriff darauf ist daher nur eingeschraenkt moeglich.
  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 18:57 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