Delphi-PRAXiS
Seite 3 von 4     123 4      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Fenster nicht minimieren (https://www.delphipraxis.net/123142-fenster-nicht-minimieren.html)

Optiplex 31. Okt 2008 09:02

Re: Fenster nicht minimieren
 
OK jfheins,
dass es so schwierig wird, habe ich mir am Anfang nicht vorgestellt. Werde am Wochenende mich mit deinem Code mal ausführlich auseinandersetzen. Melde mich spätestens am Montag wieder bei dir, hoffentlich mit einem positiven Ergebnis.

Falls jemand noch eine andere Idee hat, ich bin für jeden Einfall dankbar.

Gruss Optiplex

Optiplex 3. Nov 2008 11:27

Re: Fenster nicht minimieren
 
Hallo jfheins,

mir ist es nicht gelungen diese Message mit deinem Code abzufangen, irgendwie steht ich da auf dem Schlauch. Ich gehe davon aus, dass

begin // Change WndProc
OldWndProc := SetWindowLong({Handle}, GWLP_WNDPROC, @NewWndProc);
end;

in der Create des Formulars steht und

function NewWndProc(hWnd: HWND; uMsg: UINT; wParam: WPARAM; lParam: LPARAM): LRESULT;
begin
if ({Message})
// Handle Message
else // Call old WndProc
CallWindowProc(OldWndProc, hWnd, uMsg, wParam, lParam);
end;

als eigenständige Funktion im Implementation teil ist.

So und nun habe ich das Problem die Message genau zu deklarieren und abzufangen, vielleicht kannst du mir da nochmal helfen

Danke und Gruss Optiplex

Sir Rufo 3. Nov 2008 11:49

Re: Fenster nicht minimieren
 
Liste der Anhänge anzeigen (Anzahl: 2)
Hi,

schau doch mal hier Bild auf Desktop überlagern damit tut das.

cu

Oliver

[edit]hmmm, irgendwie doch nicht ... ich habe da ein kleines projekt realisiert, das immer im vordergrund bleibt und sich auch nicht von diesem minimieren beeindrucken lässt, ich schau nochmal nach, warum das so reagiert[/edit]

[edit2]so ich habe jetzt mal mein kleines DemoProjekt hier platziert, das angezeigte Fenster ist durchklickbar, always OnTop (auch bei Bildschirmschoner, TaskManager) und lässt sich auch nicht minimieren[/edit2]

[edit3]für alle die es interessiert, dieses benötige ich für ein Netzwerk-Überwachungs-Proggie, das die Netzwerkverbindung von Filialen zur Zentrale überwacht, und bei entsprechenden Störungen an allen Arbeitsplätzen diese Hinweise einblendet. Damit kann das Telefonaufkommen in der Zentrale entscheidend verringert werden (die Betonung liegt aber hier auf "kann") :mrgreen: [/edit3]

Optiplex 4. Nov 2008 11:37

Re: Fenster nicht minimieren
 
Hallo Oliver,
danke für das Beispiel, aber leider kann man dieses Fenster micht mehr mit der Maus ansprechen, ich gehe davon aus, dass dies von der Transparentz kommt, diese schein mir auch dafür verantwortlich zu sein, dass der 'Button Desktop' anzeigen in der Taskbar das Fenster nicht erreicht. Die Lösung ist soweit gut, nur müsste mein Fenster Mausklicks registrieren. Hast du dafür auch eine Lösung perat.

Dieter

jfheins 4. Nov 2008 11:58

Re: Fenster nicht minimieren
 
Zitat:

Zitat von Optiplex
Hallo jfheins,

mir ist es nicht gelungen diese Message mit deinem Code abzufangen, irgendwie steht ich da auf dem Schlauch. Ich gehe davon aus, dass

...

in der Create des Formulars steht und

...
als eigenständige Funktion im Implementation teil ist.

Korrekt. Außerdem ist OldWndProc eine globale Variable (oder ein Feld im private teil des Forms)

Zitat:

So und nun habe ich das Problem die Message genau zu deklarieren und abzufangen, vielleicht kannst du mir da nochmal helfen

Danke und Gruss Optiplex
Du solltest eine Konstante definieren
Delphi-Quellcode:
const DTM_RAISE = WM_USER + 83;
und dann prüfen
Delphi-Quellcode:
if (uMsg = DTM_Raise)
// Handle Message
else // Call old WndProc
CallWindowProc(OldWndProc, hWnd, uMsg, wParam, lParam);
end;
Wenns nicht geht: wird die Funktion überhaupt aufgerufen? (Breakpoint rein und Desktop anzeigen)

Kann aber auch sein, dass es ne sackgasse ist ... :angel2:

Sir Rufo 4. Nov 2008 18:30

Re: Fenster nicht minimieren
 
Liste der Anhänge anzeigen (Anzahl: 1)
Hi Dieter,
Zitat:

Zitat von Optiplex
Hallo Oliver,
danke für das Beispiel, aber leider kann man dieses Fenster micht mehr mit der Maus ansprechen, ich gehe davon aus, dass dies von der Transparentz kommt, diese schein mir auch dafür verantwortlich zu sein, dass der 'Button Desktop' anzeigen in der Taskbar das Fenster nicht erreicht. Die Lösung ist soweit gut, nur müsste mein Fenster Mausklicks registrieren. Hast du dafür auch eine Lösung perat.

Dieter

du brauchst in meinem Beispiel-Code nur die Zeile im TMsg.OnCreate mit SetWindowLog( ... ) auskommentieren, denn das sorgt für die "Durchklickbarkeit"

Ich lade aber nochmal eine überarbeitete Version hoch, da kann man dann über das PopUp die "Durchklickbarkeit" ein- und ausschalten.

cu

Oliver

Optiplex 5. Nov 2008 08:27

Re: Fenster nicht minimieren
 
hallo jfheins,
habe esst gestern Abend ausprobiert, bin aber bei @NewWndProc in FormCreate hängen geblieben ich bekam den Fehler
[Fehler] E2036 Variable erforderlich,. Weist du welche Variable gemeint ist und wie und wo ich diese deklarieren muss?
Ich habe auch probiert die NewWndProc eingenständig ohne sie im Private teil anzugeben, hier bekomme ich noch den Fehler,
dass die Typen Pointer und Integer nicht kombatibel sind. Kann dir deshalb nicht sagen ob die function überhaupt aufgerufen wird.

const DTM_Raise=WM_User+83;

type
TForm2 = class(TForm)
private
function NewWndProc(hWnd:HWND;uMsg:Uint;wparam:WParam;lPara m:LPARAM):Lresult;
end;
var
Form2: TForm2;
OldwndProc:Pointer;

implementation

procedure TForm2.FormCreate(Sender: TObject);
begin

OldwndProc:=Setwindowlong(self.Handle,GWL_WNDPROC, @NewWndProc);

end;

function TForm2.NewWndProc(hWnd:HWND;uMsg:Uint;wparam:WPara m;lParam:LPARAM):Lresult;
begin
if (uMsg=DTM_RAISE) then begin
sleep(3000);
end else CallwindowProc(Oldwndproc,hwnd,umsg,wparam,lparam) ;

end;


Hallo Oliver,
wenn die Transparent nicht am diesem Verhalten schuld ist, was bewirkt dann, dass dein Fenster für Win+D bzw Win+M tasten scheinbar unempfindlich ist, erklärs mir bitte. Ich kann nämlich keine besonderen Messageaufrufe in deinem Code erkennen, er funktioniert aber.

gruss Dieter

Gruss Optiplex

jfheins 5. Nov 2008 09:32

Re: Fenster nicht minimieren
 
1. sein code verwendent, soweit ich das sehe, einen Timer der das Formular immer wieder in den vordergrund holt (topmost)

2. Zu meiner alternative:

:arrow: newwndproc darf keine methode des forms sein

:arrow: Das handle musst du ermitteln, und nicht dein eigenes nehemn !!

:arrow: mach dir statt dem sleep erstmal nen breakpoint rein ;)

Delphi-Quellcode:
   
   handle = FindWindow("Progman", "Program Manager");

    Oldwndproc = Setwindowlong(handle, GWL_WNDPROC, NewWndProc);
Mit den Delphi-Tags wird dein code übrigens wesentlich besser lesbar ;)

:arrow: Pointer und Integer kannst du casten

Wenn ich Delphi hätte, könnte ich das Beispiel überprüfen, aber das ist alles aus dem Kopf im Browser geschrieben ;)

Sir Rufo 5. Nov 2008 09:54

Re: Fenster nicht minimieren
 
Zitat:

Zitat von Optiplex
wenn die Transparent nicht am diesem Verhalten schuld ist, was bewirkt dann, dass dein Fenster für Win+D bzw Win+M tasten scheinbar unempfindlich ist, erklärs mir bitte. Ich kann nämlich keine besonderen Messageaufrufe in deinem Code erkennen, er funktioniert aber.

Zitat:

Zitat von jfheins
1. sein code verwendent, soweit ich das sehe, einen Timer der das Formular immer wieder in den vordergrund holt (topmost)

Nein, daran liegt es nicht ... ich musste aber gerade selber erst nachsehen, woran das liegt ...

1. MainForm.Hide
2. SubForm.FormStyle := fsStayOnTop

In der Kombination wird die SubForm nicht minimiert.

cu

Oliver

Optiplex 5. Nov 2008 11:41

Re: Fenster nicht minimieren
 
Zitat:

Zitat von jfheins
:arrow: Pointer und Integer kannst du casten

jfheins was meinst du mit casten? das andere habe ich verstanden und werde es testen.




Zitat:

Zitat von Sir Rufo
1. MainForm.Hide
2. SubForm.FormStyle := fsStayOnTop

In der Kombination wird die SubForm nicht minimiert.

Oliver das würde aber bedeuten, dass wenn der Topmost geändert wird, die Form wieder minimiert bzw ausgeblendet wird und wie ich am Anfang von diesem Thema beschrieb sollte das Formular direkt auf dem Desptop liegen.


Dieter


Alle Zeitangaben in WEZ +1. Es ist jetzt 14:28 Uhr.
Seite 3 von 4     123 4      

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