Delphi-PRAXiS

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 28. Okt 2008 12:14


Fenster nicht minimieren
 
Hallo zusammen,
ich habe die ganze Zeit auf alle meine Fragen Antworten über die DP Suche gefunden, doch nun finde ich einfach keine Lösung für folgendes Problem:

Ich möchte ein Fenter (nicht Mainform) auf dem Desktop liegen haben welches nicht minimiert werden kann, auch nicht über das Desktop Icon in der Taskleite, und genau da liegt das Problem. Ich kann die Message WM_Syscommand mit SC_Minimieze abfangen und bearbeiten, nur funktioniert das nicht mit dem Desktop Icon. Windows sendet scheinbat hier eine andere Message die ich nicht kenne.
Vielleicht kennt jemand die Lösung oder hat hierfür ein Codeschnipsel für mich.

Gruß
Optiplex

s.h.a.r.k 28. Okt 2008 13:27

Re: Fenster nicht minimieren
 
was verstehst du unter "desktop icon"? :gruebel: ich habe über die verknüpfung auf dem desktop noch nie eine anwendung minimieren können! meinst du etwa das symbol in der tastleiste, auf das du einen rechtsklick machen und "minimieren" auswählen kannst?

Tyrael Y. 28. Okt 2008 13:29

Re: Fenster nicht minimieren
 
Ich denke er meint das "Desktop anzeigen"

Meflin 28. Okt 2008 13:36

Re: Fenster nicht minimieren
 
Zitat:

Zitat von Tyrael Y.
Ich denke er meint das "Desktop anzeigen"

und wenn dem so ist, dann führt daran wohl auch kein Weg vorbei, als die Form als Deskband zu registrieren :stupid:

Optiplex 28. Okt 2008 13:51

Re: Fenster nicht minimieren
 
hallo

Zitat:

Zitat von Meflin
Zitat:

Zitat von Tyrael Y.
Ich denke er meint das "Desktop anzeigen"

und wenn dem so ist, dann führt daran wohl auch kein Weg vorbei, als die Form als Deskband zu registrieren :stupid:

genau dieses Desktop anzeigen Icon meine ich.

wie kann man eine Form als Deskband registieren bzw wie funktioniert denn das, habe davon noch nichts gehört.

Optiplex

Tyrael Y. 28. Okt 2008 14:05

Re: Fenster nicht minimieren
 
Ich glaube es wird WM_SYSCOMMAND mit dem Parameter SC_MINIMIZE gesendet.

Optiplex 28. Okt 2008 14:18

Re: Fenster nicht minimieren
 
hallo Tyrael Y.

Zitat:

Zitat von Tyrael Y.
Ich glaube es wird WM_SYSCOMMAND mit dem Parameter SC_MINIMIZE gesendet.

ich habe in meinem ersten posting bereits geschrieben, dass es diese Message nicht sein kann, da ich diese bereits abfange, diese funktioniert auch soweit bis auf dieses 'Desktop anzeigen' Icon, hier wird trotz allem die Form minimiert.

Gruss Optiplex

Sherlock 28. Okt 2008 14:26

Re: Fenster nicht minimieren
 
Mal sorum gefragt: Kennst Du eine Applikation, die das "Desktop anzeigen" ignoriert?

Edith: Hui verdammt, hab tatsächlich eine gefunden...die DesktopWidgetEngine macht das... Oh!

Sherlock

Die Muhkuh 28. Okt 2008 14:26

Re: Fenster nicht minimieren
 
Gibt es überhaupt einen sinnvollen Grund, warum man das verhindern sollte? Dafür ist die Funktion ja da.

Tyrael Y. 28. Okt 2008 14:40

Re: Fenster nicht minimieren
 
Ups sry deinen Anfangspost wohl etwas überlesen.

WM_SIZE könnte es auch sein mit SIZEICONIC bzw. SIZE_MINIMIZED

Optiplex 28. Okt 2008 14:42

Re: Fenster nicht minimieren
 
Zitat:

Zitat von Die Muhkuh
Gibt es überhaupt einen sinnvollen Grund, warum man das verhindern sollte? Dafür ist die Funktion ja da.

Die Antwort hat dir Sherlock bereits gegeben, es gibt Anwendungen,da möcht man einfach ein Fenster
egal in welcher Form auf dem Desktop liegen haben, und dieses soll dann natürlich nicht einfach minimiert werden können.

Optiplex

Meflin 28. Okt 2008 16:23

Re: Fenster nicht minimieren
 
Zitat:

Zitat von Optiplex
Die Antwort hat dir Sherlock bereits gegeben, es gibt Anwendungen,da möcht man einfach ein Fenster
egal in welcher Form auf dem Desktop liegen haben, und dieses soll dann natürlich nicht einfach minimiert werden können.

Argml. Sorry, aber wenn ich als Benutzer auf "Desktop anzeigen" klicke, dann soll gefälligst auch der Desktio angezeigt werden, und nicht irgendeine Form, die meint, sie müsse sich trotzdem auf den Desktop pflanzen :roll: Es ist einfach nur ein scheiß Stil, das Standardverhalten des Betriebssystems derart abzuändern.

Btw bezweifle ich, dass Deskbands eine Lösung für dich sind. Du kannst nämlich nur festlegen, ob es unten, oben, rechts oder links ist, und es geht dann immer über die komplette Breite/Höhe. Außerdem wird es *immer* angezeigt, andere Anwendungen können nicht in den Bereich des Deskbands verschoben oder maximiert werden. Aber es dürfte denke ich die einzige Lösung sein, die zuverlässig sicherstellt, dass dein Zeug auch nach "Desktio anzeigen" noch angezeigt wird.

jfheins 28. Okt 2008 16:34

Re: Fenster nicht minimieren
 
Um noch mehr zur Verwirrung beizutragen: Drück mal [Windows]+M ;)

Win+M minimiert alle Fenster.

Win+D (bzw. "Desktop anzeigen") Holt den Desktop in den Vordergund.

Ein nicht zu vernachlässigender Unterschied ;)

(Da du ja bereits das Minimieren verhinderst, nehme ich mal an, dass dir dies bei Win+M gelingt ?)

Du könntest jetzt natürlich die Message-Loop von dem Progman Fenster subclassen und die DTM_RAISE message (WM_USER + 83) abfangen.

Empfehlenswert ist das jedoch nicht (allg. das Verhalten sich nicht minimieren zu lassen.)

Quellen:
http://blogs.msdn.com/oldnewthing/ar...28/143771.aspx
und http://www.eggheadcafe.com/forumarch...st23443993.asp

Optiplex 29. Okt 2008 08:18

Re: Fenster nicht minimieren
 
Zitat:

Zitat von Tyrael Y.
WM_SIZE könnte es auch sein mit SIZEICONIC bzw. SIZE_MINIMIZED

Hallo Tyrael Y. das habe ich getestet, hat aber nichts geholfen.



Zitat:

Zitat von Meflin
Argml. Sorry, aber wenn ich als Benutzer auf "Desktop anzeigen" klicke, dann soll gefälligst auch der Desktio angezeigt werden, und nicht irgendeine Form, die meint, sie müsse sich trotzdem auf den Desktop pflanzen :roll: Es ist einfach nur ein scheiß Stil, das Standardverhalten des Betriebssystems derart abzuändern.

Meflin, ich will das Standardverhalten nicht ändern, es soll auch kein großes Fenster über dem Desktop liegen.Soweit mir bekannt bleiben Widgets bei 'Desktop anzeigen' ebenfalls auf dem Desk sichbar und minimieren sich nicht. Ansonsten hast du recht dass Deskbands nicht die Lösung für mein Problem ist.

jfheins,
die Links muss ich mir noch ansehen, ich gebe dir noch Bescheid ob sie mir weiterhelfen.

Danke für die Antworten
Optiplex

Frankfurtoder 29. Okt 2008 08:29

Re: Fenster nicht minimieren
 
Soll das Fenster dann niemals minimiert werden oder einfach nur dieses Desktop Anzeigen trotzen? Ansonsten könntest du doch prüfen ob das Fenster minimiert wurde und es wieder aufrufen.

Optiplex 29. Okt 2008 11:55

Re: Fenster nicht minimieren
 
Zitat:

Zitat von jfheins
Du könntest jetzt natürlich die Message-Loop von dem Progman Fenster subclassen und die DTM_RAISE message (WM_USER + 83) abfangen.

Empfehlenswert ist das jedoch nicht (allg. das Verhalten sich nicht minimieren zu lassen.)

Quellen:
http://blogs.msdn.com/oldnewthing/ar...28/143771.aspx
und http://www.eggheadcafe.com/forumarch...st23443993.asp

Hallo jfheins,
ich will nicht das allg. Verhalten von Windows ändern, ich möchte nur, dass mein kleines Fenster sichtbar bleibt und diese "ToggleDesktop" Nachricht ignoriert.

Zitat:

Zitat von Frankfurtoder
Ansonsten könntest du doch prüfen ob das Fenster minimiert wurde und es wieder aufrufen.

Dies könnte man machen, hat nur einem Schönheitsfehler, dass die Minimize Animation zu sehen ist , dies wirkt Amateurhaft

Gruss Optiplex

jfheins 29. Okt 2008 16:20

Re: Fenster nicht minimieren
 
Okay, also nochmal :mrgreen:

1. Würde es immernoch nicht mögen. Persönliche Meinung ;)

2. Was passiert wenn du statt "Desktop anzeigen" mal Win+M drückst?

3. Um es abzufangen, wenn der Desktop in den Vordergung geholt wird (nicht dasselbe wie alle Minimieren) könntest du versuchen, dich in die Nachrichtenschleife vom Desktop ("Progman") einzuhängen und auf die DTM_RAISE Nachricht zu reagieren. (bspw. mit einem Postmessage an deine anwendung, die sich dann beim verarbeiten dieser message in den vordergrund holt)

Meflin 29. Okt 2008 17:35

Re: Fenster nicht minimieren
 
Zitat:

Zitat von Optiplex
Soweit mir bekannt bleiben Widgets bei 'Desktop anzeigen' ebenfalls auf dem Desk sichbar und minimieren sich nicht. Ansonsten hast du recht dass Deskbands nicht die Lösung für mein Problem ist.

Doch, die Widgets sind dann "verschwunden" und auch die Sidebar wird nicht mehr angezeigt (so lange, bis man wieder ein anderes Fenster öffnet/maximiert und "normal" minimiert) ;)

Optiplex 30. Okt 2008 08:20

Re: Fenster nicht minimieren
 
Zitat:

Zitat von jfheins
2. Was passiert wenn du statt "Desktop anzeigen" mal Win+M drückst?

3. Um es abzufangen, wenn der Desktop in den Vordergung geholt wird (nicht dasselbe wie alle Minimieren) könntest du versuchen, dich in die Nachrichtenschleife vom Desktop ("Progman") einzuhängen und auf die DTM_RAISE Nachricht zu reagieren. (bspw. mit einem Postmessage an deine anwendung, die sich dann beim verarbeiten dieser message in den vordergrund holt)

Hallo jfheins,

Win+M bekommt man mit WM_Syscommand in den Griff. Wie hängt man sich in die Nachrichtenschleife von "Progman" ein, da bin ich mit meinem Wissen an eine Grenze gestoßen :oops:, vielleicht kann du mir da ein bischen Nachhilfe geben. Auf jeden Fall habt ihr mich dahingehend überzeugt, dass ich diese Funktion (falls es gelingt sie zu realisieren) in die Options aufnehmen werde, so dass jeder User selbst bestimmen kann ob er dieses Fenster auf dem Desktop liegen hat oder nicht.

Zitat:

Zitat von Meflin
Doch, die Widgets sind dann "verschwunden" und auch die Sidebar wird nicht mehr angezeigt (so lange, bis man wieder ein anderes Fenster öffnet/maximiert und "normal" minimiert) ;)

Sorry Meflin, da habe ich mich scheinbar getäuscht, da ich kein Vista sondern nur da allte XP habe, hatte ich das anders in Erinnerung.

Optiplex

jfheins 30. Okt 2008 14:46

Re: Fenster nicht minimieren
 
So ungefähr:
Delphi-Quellcode:
var
  OldWndProc: Pointer;

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

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;
Das Handle bekommst du über FindWindow ;)

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

Sir Rufo 5. Nov 2008 12:02

Re: Fenster nicht minimieren
 
Zitat:

Zitat von Optiplex
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.

:wiejetzt:
Solange wie die oben genannten Bedingungen erfüllt sind, dann ist das so und ändert sich auch nicht ... ich konnte bisher das SubForm nicht minimieren ... ausser durch das Minimieren-Symbol des Forms selber.

cu

Oliver

Jurai 5. Nov 2008 13:02

Re: Fenster nicht minimieren
 
Hallo zusammen!

Ich kenne mich jetzt in der Delphi-Programmierung nicht so aus, aber vielleicht kann ich so einen anderen Ansatz beisteuern:
Ich habe mal als Diensleister für ein Unternehmen mit hunderten Filialen deutschlandweit gearbeitet. Die unternehmensweite Software wurde auf den Kassen-PCs aller Filialen installiert. Eine einheitliche Domäne gab es nicht. Benutzer durften ausschließlich diese eine Unternehmenssoftware verwenden.

Wir haben das so gelöst:
In der Registry unter "Hkey_Local_Machine\Software\Microsoft\ Windows NT\CurrentVersion\Winlogon" gibt es einen Wert "Shell". Dieser Wert enthält gewöhnlich die Explorer.exe Wir haben die Explorer.exe gegen die Start-Datei der Anwendung ausgetauscht, haben die Benutzer-Rechte so angepasst, dass der Explorer auch nicht über den Taskmanager gestartet werden konnte.

Nach diesem Prinzip funktionieren u.a. auch einige Automaten für die Zimmerbuchung mancher Hotels. Aber auch andere Anwendungen sind im Einsatz. Meiner Erfahrung nach ist es sehr schwer via Anwendung den Zugriff auch den Desktop oder andere Anwendungen zu verweigern, solange Windows dies zulässt. Eine Anwendung kann man auch beenden.

Gruß Jurai

Sir Rufo 5. Nov 2008 17:59

Re: Fenster nicht minimieren
 
@Jurai: Ist schon interessant, aber in diesem Kontext irgendwie OT

Optiplex 6. Nov 2008 08:09

Re: Fenster nicht minimieren
 
Hallo Julius,
Ich habe den Code nach deinen Vorgaben verändert, aber leider bekomme ich immer noch 2 Fehlermeldungen beide in der selben Zeile.

E2003 Undefinierter Bezeichner: 'NewWndProc'
E2010 Inkompatible Typen: 'Pointer' und 'Integer'

er kennt nicht NewWndProc egal ob mit oder ohne @ ich habe auch probiert mit Cardinal( @ NewWndProc)
irgendwie scheint hier noch was zu fehlen

Delphi-Quellcode:
   const DTM_Raise=WM_User+83;

type
  TForm2 = class(TForm)

  end;

var
  Form2: TForm2;
  OldwndProc:Pointer;
  progmanhandle:Thandle;

implementation

procedure TForm2.FormCreate(Sender: TObject);
begin
  progmanhandle:=findwindow('Progman','Program Manager');
  OldwndProc:=Setwindowlong(progmanhandle,GWL_WNDPROC,@NewWndProc);
end;

function NewWndProc(hWnd:HWND;uMsg:Uint;wparam:WParam;lParam:LPARAM):Lresult;
begin
  if (uMsg=DTM_RAISE) then begin
//  sleep(3000);
  end else CallwindowProc(Oldwndproc,hwnd,umsg,wparam,lparam);
end;
Hallo Oliver,
es ist auf jeden Fall sehr nützlich zu wissen durch welche Vorgaben man dieses Verhalten des Fensters erreichen kann, nur das Fenster steht dann ständig im Vordergrund, das ist für den Einsatzbereich für den du das Programm geschrieben hast OK. Für mein Programm kann ich das leider nicht gebrauchen. Ich habe gesehen, dass du im Menu den Punkt Immer im Vordergrund hast, deshalb war ich der Meinung dass man das Topmost ein und ausschalten kann, doch beim durchtesten konnte ich das Fenster nicht in den Hintergrund bekommen. Vielleicht können wir mit dem Ansatz von Oliver und der Erkenntnis, dass das Fenster in den Vordergrund gebracht werden muss, das Verhalten des Fensters so manipulieren, dass es nicht ständig OnTop ist. Das könnte ich mir auch im deinem Programm vorstellen.

Hallo Jurai,
dein Ansatz das Problem zu lösen ist weit überzogen, da wir niemanden in seine rechten beschränken wollen sondern nur das Verhalten eines Fensters ändern.

Gruss Dieter

Sir Rufo 6. Nov 2008 19:36

Re: Fenster nicht minimieren
 
Hi Optiplex,

ich denke wir sind hier auf dem falschen Weg ... oder wie der Engländer so gerne sagt: "heavy on the woodway".
Das Fenster wird gar nicht minimiert, sondern der Desktop wandert nach oben und verdeckt somit die nun darunterliegenden Fenster.
Darum bekommst du auch keine entsprechende Msg gesendet.

Darum funktioniert auch mein Ansatz mit StayOnTop.

Somit müsste also überprüft werden, ob das Fenster immer noch über dem Desktop liegt.

Das müsste der richtige Ansatz sein.

cu

Oliver

Optiplex 7. Nov 2008 08:16

Re: Fenster nicht minimieren
 
Hi Oliver,
es ist genau richtig was du meinst, deshalb schrieb ich ja schon

Vielleicht können wir mit dem Ansatz von Julius und der Erkenntnis, dass das Fenster in den Vordergrund gebracht werden muss, das Verhalten des Fensters so manipulieren, dass es nicht ständig OnTop ist. Das könnte ich mir auch im deinem Programm vorstellen.

den laut Julius wird die Message DTM_Raise WM_User+83 "Toggle Desktop" an die den Program Manager "Progman" gesendet,
und diese Message versuchen wir mit dem oben gennanten Delphi-Code anzufangen aber leider komm ich da nicht weiter, weil ich zu wenig Erfahrung habe. :oops:

Julius hat sich aber leider auch nicht mehr gemeldet. Vielleicht hast du noch eine Idee wie wir den Code zum laufen bringen.

Für die nächsten 2 wochen bin ich viel unterwegs ich hoffe dass ich mich zwischendurch immer mal melden kann.

Gruss Dieter


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