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 WM_SIZE + SIZE_MINIMIZED geht nicht? (https://www.delphipraxis.net/6993-wm_size-size_minimized-geht-nicht.html)

MathiasSimmack 29. Jul 2003 15:12


WM_SIZE + SIZE_MINIMIZED geht nicht?
 
Mal auf Verdacht in die API-Sparte

Reagiert bei euch Delphi korrekt auf WM_SIZE + SIZE_MINIMIZED?
Meins nicht (D5 Pro Updatepack #1). :(
Delphi-Quellcode:
type
  TForm1 = class(TForm)
    { ... }
  private
    procedure WMSize(var Message: TWMSize); message WM_SIZE;
  end;

{ ... }

procedure TForm1.WMSize(var Message: TWMSize);
begin
  if(Message.Msg = WM_SIZE) and
    (Message.SizeType = SIZE_MINIMIZED) then
  begin
    MessageBox(self.Handle,'yo',nil,0);
  end else
    inherited;
end;
Die Box ist nicht zu sehen. Wenn ich allerdings SIZE_MAXIMIZED einsetze, dann erscheint sie.

Ist das ein Bug?
Und wenn Ja: hat jemand eine Idee, wie man das beheben kann?

Gruß.

oki 30. Jul 2003 10:44

Re: WM_SIZE + SIZE_MINIMIZED geht nicht?
 
Hi,

ich nutze D5 Enterprise und habe den gleichen Fehler. Bei mir wird wmSize nur für die Typen SIZE_MAXIMIZED und SIZE_RESTORED aufgerufen.

Für SIZE_MINIMIZED wird nicht mal die Ereignisbehandlung durchlaufen (gerade getestet).

Hab dazu leider auch keine schnelle Idee, kann deinen Fehler aber bestätigen.

Vermutung:

SIZE_MINIMIZED wird nicht über das Ereignis wmSize weitergeleite, so dass dafür unsere Ereignisbehandlung nicht reagieren kann oder es gibt eine andere Stelle wo man es erfäht.

Tut mir leid, dass ich nicht richtig helfen konnte,

Gruß oki

Motzi 30. Jul 2003 10:53

Re: WM_SIZE + SIZE_MINIMIZED geht nicht?
 
Hm.. also ich kann mich noch erinnern, dass es bei mir funktioniert hat..!

Schonmal versucht die WndProc zu überschreiben und dort die Message zu checken anstatt über einen Message-Handler?

MathiasSimmack 30. Jul 2003 11:48

Re: WM_SIZE + SIZE_MINIMIZED geht nicht?
 
Ja, gerade eben:
Delphi-Quellcode:
procedure TForm1.WndProc(var Message: TMessage);
begin
  case Message.Msg of
    WM_SIZE:
      if(Message.wParam = SIZE_MINIMIZED) then begin
        MessageBox(self.Handle,'yo',nil,0);
        exit;
      end;

    { ... }
  end;

  inherited WndProc(Message);
end;
Bei SIZE_MINIMIZED passiert auch hier nichts, SIZE_MAXIMIZED dagegen zeigt die MessageBox wieder an.

MathiasSimmack 30. Jul 2003 12:33

Nachtrag
 
Liste der Anhänge anzeigen (Anzahl: 1)
Ach so, der Sinn der Frage ist folgender:

Es gab ja schon einige Male Fragen wie: Wie kann ich mein Programm in die TNA minimieren? Und bisher habe ich´s bei VCL-Programmen immer über WM_SYSCOMMAND/SC_MINIMIZE geregelt. Sprich: trat diese Message auf, ließ ich den Button in der Startleiste verschwinden und erzeugte das TNA-Symbol, usw.

Allerdings klappt das Minimieren in die TNA nicht, wenn der globale Systemhotkey WIN+M benutzt wird, mit dem man ja alle aktiven Fenster auf einmal minimieren kann. In dem Fall wird die Anwendung einfach nur normal minimiert, aber sie verschwindet nicht in der TNA.
Nach ein bisschen Rätselraten bei einem nonVCL-Programm habe ich das Problem nun mit WM_SIZE/SIZE_MINIMIZED lösen können. So wird auch auf den o.g. Sys-Hotkey reagiert, und das Programm verschwindet korrekt in der TNA.

Tja, und beim Versuch, das für die VCL umzusetzen, bin ich dann auf das obige Problem gestoßen. Vielleicht ist´s auch keins, sondern ich mache bloß irgendwo einen Fehler. Darum habe ich mal die beiden Beispiele (VCL und nonVCL) rangehangen.


Gruß.

oki 30. Jul 2003 13:12

Re: WM_SIZE + SIZE_MINIMIZED geht nicht?
 
Hi,

ich hab auch noch mal etwas rumgetestet. Bei mir ist eins definitiv klar, beim Minimieren wird wmSize nicht aufgerufen.

Egal was man macht, wenn wmSize aufgerufen wird, dann ausschließlich für SIZE_MAXIMIZED und SIZE_RESTORED!

Das heißt, dass wmSize beim minimieren nicht aufgerufen wird.

Ich habe auch schon mal bis runter ins TWinControl geschaut. Dort steht SIZE_MAXIMIZED und SIZE_MINIMIZED mit drin.

Also auch keine Lösung.

Gruß oki

CalganX 30. Jul 2003 13:50

Re: WM_SIZE + SIZE_MINIMIZED geht nicht?
 
Hi,
nicht nur Delphi 5 ist betroffen. Sowohl bei Delphi 6 Personal (alle Updates) und Delphi 7 Enterprise Trial (ohne Updates [natürlich]) tritt dieser "Bug" auf.

Was mich wundert ist, dass im PSDK drin steht, dass SIZE_MINIMIZED auch "dazu gehört".

Wenn ich es noch schaffe, versuche ich gleich mal auf die Stelle in C++ ein WinAPI-Programm zu coden, um zu gucken, ob das wirklich ein Bug in Delphi ist, oder nicht!

Chris

Alexander 30. Jul 2003 14:17

Re: WM_SIZE + SIZE_MINIMIZED geht nicht?
 
Ähm es ist sehr wahscheinlich, dass es ein Bug ist, denn ohne die VCL läuft es ja anscheind.
einen Lösungsweg habe ich aber áuch nciht anzubieten :sad:

Motzi 30. Jul 2003 14:31

Re: WM_SIZE + SIZE_MINIMIZED geht nicht?
 
Also bei meiner Taskbar-Kompo (auf www.x-spy.net/personal) subclass ich die Fenster die der Taskbar hinzugefügt werden um die Buttons der Taskbar an die Zustände der Fenster anzupassen. Und in dieser "gesubclassten" WndProc funzt die WM_SIZE Message (auch mit SIZE_MINIMIZED) problemlos..!

CalganX 30. Jul 2003 14:31

Re: WM_SIZE + SIZE_MINIMIZED geht nicht?
 
Zitat:

Zitat von alexander
denn ohne die VCL läuft es ja anscheind

Hehe... das ist es ja: unter C++ läuft es wunderbar. Unter Delphi (nonVCL) geht es nur sporadisch. D.h. beim normalen Minimieren funzt es und beim Win+M wieder nicht...

Chris

mirage228 30. Jul 2003 14:36

Re: WM_SIZE + SIZE_MINIMIZED geht nicht?
 
Bei Delphi3 funktioniert es übrigens auch nicht......


mfG
mirage228

Alexander 30. Jul 2003 15:18

Re: WM_SIZE + SIZE_MINIMIZED geht nicht?
 
@Chakotay1308
Ohne VCL scheint es funktionieren:
Zitat:

Zitat von Mathias
Nach ein bisschen Rätselraten bei einem nonVCL-Programm habe ich das Problem nun mit WM_SIZE/SIZE_MINIMIZED lösen können. So wird auch auf den o.g. Sys-Hotkey reagiert, und das Programm verschwindet korrekt in der TNA.

Tja, und beim Versuch, das für die VCL umzusetzen, bin ich dann auf das obige Problem gestoßen. Vielleicht ist´s auch keins, sondern ich mache bloß irgendwo einen Fehler. Darum habe ich mal die beiden Beispiele (VCL und nonVCL) rangehangen.


Snoopy240871 30. Jul 2003 15:20

Re: WM_SIZE + SIZE_MINIMIZED geht nicht?
 
Hallo Mathias,


vielleicht hilft dir das weiter. Das funktioniert in meinem Programm einwandfrei:

private
procedure ApplicationMinimize(Sender: TObject);

beispielsweise im TForm1.FormCreate...

with Application do

OnMinimize:=ApplicationMinimize;

und anschließend kannst du die procedure im implementations Teil beliebig verwenden...

procedure TForm1.ApplicationMinimize(Sender: TObject);
begin
// hier Code was beim minimieren der Anwendung passieren soll
end;

entsprechendes geht auch für
procedure ApplicationRestore(Sender: TObject); (wiederherstellen)
procedure ApplicationActivate(Sender:TObject); (Aktivierung)

Gruß Martin.... :dancer:

MathiasSimmack 30. Jul 2003 16:18

Re: WM_SIZE + SIZE_MINIMIZED geht nicht?
 
Zitat:

Zitat von oki
Das heißt, dass wmSize beim minimieren nicht aufgerufen wird.

Doch, eigentlich schon (s. nonVCL-Demo).

Zitat:

Zitat von Chakotay1308
Unter Delphi (nonVCL) geht es nur sporadisch. D.h. beim normalen Minimieren funzt es und beim Win+M wieder nicht...

Das kann ich nicht bestätigen. Ich habe natürlich mein nonVCL-Beispiel (OnMinimize.dpr) mehrmals ausprobiert, und es verschwand immer in der TNA - egal, ob ich´s nun via Maus oder Systemmenü oder WIN+M minimiert habe.

Zitat:

Zitat von Snoopy240871
vielleicht hilft dir das weiter. [...]

Ich hatte mal so etwas ähnliches bei AUQ.de gepostet. Aber das entspricht der Idee mit WM_SYSCOMMAND/SC_MINIMIZE. Wenn ich das Programm mit der Maus oder dem Systemmenü minimiere, dann verschwindet es natürlich in der TNA. Aber wenn ich den Hotkey WIN+M benutze, dann wird es nur normal in die Startleiste minimiert.
Darum bin ich ja auf die Sache mit WM_SIZE/SIZE_MINIMIZED gekommen. Aber dennoch Danke für den Vorschlag. :)


@Motzi: Ich werde mir deine Komponente wohl mal ansehen müssen. Ich hab´s gerade mal so versucht:
Delphi-Quellcode:
var
  oldproc  : pointer;

function FormProc(wnd: HWND; uMsg: UINT; wp: WPARAM; lp: LPARAM): LRESULT;
  stdcall;
begin
  case uMsg of
    WM_SIZE:
      if(wp = SIZE_MINIMIZED) and
        (Shell_NotifyIcon(NIM_ADD,@NID)) then
      begin
        ShowWindow(Application.Handle,SW_HIDE);
        Result := 0;
        exit;
      end;
  end;

  Result := CallWindowProc(oldproc,wnd,uMsg,wp,lp);
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  NID.wnd  := self.Handle;
  NID.hIcon := LoadIcon(hInstance,'DIABLO');

  oldproc  := pointer(SetWindowLong(self.Handle,GWL_WNDPROC,
    integer(@FormProc)));
end;
Ist zwar IMHO rein technisch mit dem Überschreiben der "WndProc" identisch (s. Code oben), nur halt auf dem Weg, den man normalerweise für API-Programme benutzt. Ergebnis: keine Wirkung ... es sei denn, ich benutze SIZE_MAXIMIZED ... :nerd:


Alle Zeitangaben in WEZ +1. Es ist jetzt 12:25 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz