Können Sie eine Grenzenlose Anwendung Hauptfenster in Windows, ohne WS_POPUP Stil?

Ich möchte ein Fenster erstellen, wird im Hauptfenster und das Windows selbst erkennt als das Hauptfenster der Anwendung. Jedoch, wenn ich meine Fenster ohne Rand und ohne nicht-client-Bereich von Windows nicht mehr erkennt, dass dieses Fenster ist eine Anwendung Hauptfenster. Dies hat mehrere Auswirkungen:

  1. WindowsKey+M minimiert alle Fenster außer meine Anwendung Hauptfenster.

  2. Einmal klicken auf der Taskleiste (win7) und dann wieder, sollte Umschalten der Anwendung Haupt-Fenster Status/Sichtbarkeit zwischen normal-und minimierten Zustand. Das funktioniert aber nicht so ein Fenster.

In der bloßen Win32-Programmierung angeht, ich bin zu Fragen, über die parameter-Werte für dwStyle wie beim Aufruf CreateWindow (WS_... - Konstanten), oder CreateWindowEx (WS_EX_... - Konstanten). Für delphi-Anwender, diese Werte würden in der CreateParams-Methode, die Sie überschreiben, und legen Sie dann Params.Stil := WS_xxx; Für MFC/C++ und C Benutzer, etwas in Ihrem Rahmen schließlich dem Aufruf CreateWindow, mit diesem dwStyle Wert.

In delphi Bedingungen, Einstellung Ihrer form.BorderStyle=bsNone, Ergebnisse im dwStyle=WS_POPUP. Aber ich will ein randloses Fenster ohne Verwendung dwStyle=WS_POPUP.

Hinweis: Alle Antworten sind gut, aber mit jedem in der Produktion-Szenarien ist problematisch, und meine versuche dazu geführt haben, in der Begegnung mit vielen glitches, die für eine professionelle Anwendung, die ich noch finden kann ich nicht umgehen. Davids Antwort ist ein großartiger Reine Win32-API-Antwort aber, und das passt die Rechnung. Es scheint, dass eine industrielle Stärke-Lösung kombinieren mehrere Eigenschaften, einschließlich alle, die ich in meiner Frage oben. In kurzen, randlosen Formen mit BorderStyle=bsNone (dwStyle=WS_POPUP) blockieren Sie alle Windows-Funktionen gilt in der Regel für Haupt-windows-Anwendungen, und alle Lösungen unter Lösung Teil davon.

Basierend auf David ' s Vorschläge, ich schrieb das folgende, was nicht funktioniert:
Ich möchte ein Fenster ohne Rahmen, das verhält sich in allen Möglichkeiten, wie Sie eine windows-Anwendung Fenster, um das system, das heißt, es kann sein, minimiert/wiederhergestellt, indem Sie auf das Fenster in der Taskleiste minimiert werden, indem Sie WindowsKey+M. ich bin Anfang zu denken, dass der einzige Weg, dies zu tun ist das hinzufügen von nicht-client-paint-code und ändern Sie die Größe der Spitze nicht-Clientbereich Grenzen zu null. Dies ist natürlich nicht eine triviale Idee.

Es stellt sich heraus, dass ich einen einfachen Fehler in meiner Codierung (daher die beiden Absätze oben) und in der Tat der code unten funktioniert jetzt wie ich es möchte. Dieses ist in pascal, aber es sollte einfach sein, es zu konvertieren, um C++ oder sonst was.

program NoBorderProject;

uses
  Windows, Messages;
  {the Messages unit contains the windows
  Message constants like WM_COMMAND}

{$R *.RES}

var
  wClass: TWndClass;
  Msg: TMsg;
  win:HWND;
function WindowProc(hWnd,Msg,wParam,lParam:Integer):Integer; stdcall;
begin
 if Msg = WM_DESTROY then PostQuitMessage(0);
 Result := DefWindowProc(hWnd,Msg,wParam,lParam);
end;

begin
 wClass.lpszClassName:= 'CN';
 wClass.lpfnWndProc :=  @WindowProc;
 wClass.hInstance := hInstance;
 wClass.hbrBackground:= 1;
 RegisterClass(wClass);
 win := CreateWindow(wClass.lpszClassName,'Title Bar',
              WS_POPUP,//WS_OVERLAPPEDWINDOW or WS_VISIBLE,
              10,10,340,220,0,0,hInstance,nil);
 SetWindowLong(win, GWL_STYLE, WS_POPUP or WS_MINIMIZEBOX);
 SetWindowLong(win, GWL_EXSTYLE, 0 );
 ShowWindow(win,SW_SHOW);
 while GetMessage(Msg,0,0,0) do
   DispatchMessage(Msg);
end. 
  • Ich fand Ihre Fehler. Sie setzen GWL_STYLE zweimal. Der zweite Aufruf SetWindowLong sollte festgelegt GWL_EXSTYLE.
  • Hier mit D7, MainForm.BorderStyle = bsNone trotzdem nicht verhindern, dass WinKey+M aus arbeiten. Auch minimieren/wiederherstellen schaltet einwandfrei. Könnte dies zurückgeführt werden auf die Eigenschaft MainFormOnTaskbar von TApplication, die standardmäßig festgelegt ist, in neueren Delphi-Versionen?
  • NGLN - Genau. Delphi 7 hat eine falsche top-level application window und so in Windows nicht denken, dass Ihre form ist Ihre Anwendung Hauptfenster, verwendet es die alten Delphi-hack eines verborgenen Spezial-Hauptfenster. Dieses Verhalten ist auch die Wurzel der Z-Reihenfolge Fehler, die in der Delphi-7-ära Hauptformular hack.
InformationsquelleAutor Warren P | 2011-02-04
Schreibe einen Kommentar