Entwickler-Ecke
Windows API - Message durch User Aktion
NewMori - Sa 19.05.12 21:53
Titel: Message durch User Aktion
Hallo,
nach einiger Zeit habe ich mal wieder eine Frage, nämlich ob man herausfinden kann, ob eine Message durch den User "ausgelöst" wurde. Ich schreibe im Moment an einem Tool um Fenster an beliebig wählbaren Begrenzungen im Desktop auszurichten. Dazu würde ich gerne einen Hook benutzen, welcher WM_SIZE und WM_MOVE abfängt und das Fenster dann entsprechend ausrichtet. Bis jetzt ist mir aber noch nicht eingefallen wie ich zwischen "Programm resize" und User resize (soll heißen Benutzer resized das Fenster mit der Maus) unterscheiden kann. Eventuell kennt ihr ja eine Möglichkeit.
MfG NewMori
IhopeonlyReader - So 20.05.12 20:26
Wenn ich deine Frage richtig verstehe, dann möchtest du auf das vergrößern/verkleinern einer Form reagieren, aber nur dann wenn es vom User und nicht vom Programm (z.B. per Button) in der Größe verändert wurde. Wenn das richtig ist, dann folgender Vorschlag:
NewMori hat folgendes geschrieben : |
Hallo,
wie ich zwischen "Programm resize" und User resize (soll heißen Benutzer resized das Fenster mit der Maus) unterscheiden kann. Eventuell kennt ihr ja eine Möglichkeit.
|
Wenn du es im Quelltext ausführst kannst du eine Variable (Boolean würde sich gut eignen) deklarieren, die dann z.B.
DurchUser
heißt benutzen. Jedesmal wenn du deine Form per Quelltext veränderst, stellst du DurchUser auf False und im Resize-Ereignis der Form schreibst du dann direkt nach dem
begin ein
if (DurchUser) then begin.. WAS passieren soll... und zum schluss noch ein
DurchUser:=True; end; ;)
Ich hoffe ich habe deine Frage richtig verstanden und wünsche dir VIEL Spaß ;)
NewMori - So 20.05.12 20:51
@IhopeonlyReader: Das kam mir auch in den Sinn, allerdings geht das nur, wenn ich das Resize-Event im eigenen Programm habe. Mir geht es darum jedes Fenster (also auch eines aus anderen Programmen) Ausrichten zu können.
IhopeonlyReader - So 20.05.12 21:04
NewMori hat folgendes geschrieben : |
@IhopeonlyReader: Das kam mir auch in den Sinn, allerdings geht das nur, wenn ich das Resize-Event im eigenen Programm habe. Mir geht es darum jedes Fenster (also auch eines aus anderen Programmen) Ausrichten zu können. |
geDu möchtest also sozusagen mit Programm A auf das Verändern der Größe der Form von Programm B reagieren.
Problem: Programm B ist denk ich mal nicht von dir und bietet dadurch keine Möglichkeit, dass du etwas in den Quelltext von Programm B einbaust, wie z.B. das es eine Message schickt.
Das Vergrößern/Verkleinern wird dann hervorgerufen, wenn man sich an den Rand eines Fensters bewegt (ich glaube die rand 10 pixel) und die Form auf Sizeable steht.
Jedesmal wenn eine Form verändert wird dann wird das natürlich an Windows weitergeleitet (logisch). diese Messages kannst du abfangen und nutzen, ich weiß jedoch nicht ob man dabei unterscheiden kann zwischen von dem Programm größe verändert bzw. vom user.
Das Offensichtlichste ist, das wenn man Vergrößert/verkleinert, sich der Cursor ändert, dann man die linke maustaste drückt, und dann die maus bewegt und man dann die linke maustaste wieder loslässt.
Du könntest ebenfalls die Abläufe der Maus abfangen und abfragen ob diese Reihenfolge eingetreten ist, wenn ja dann tue das. Hierzu eignet sich am ehesten ein Timer.
Um die Cursoränderung zu bemerken ist folgender Thread vielleicht nützlich
http://www.delphipraxis.net/109266-windows-cursor-veraenderung-abfragen.html
Ich hoffe ich konnte dir helfen
jaenicke - Mo 21.05.12 07:23
IhopeonlyReader hat folgendes geschrieben : |
Du könntest ebenfalls die Abläufe der Maus abfangen und abfragen ob diese Reihenfolge eingetreten ist, wenn ja dann tue das. Hierzu eignet sich am ehesten ein Timer. |
Ein Timer? Wie soll das gehen?
Dafür braucht man wohl eher einen Maushook. Aber ob man das mit den Mausinformationen so zuverlässig unterscheiden kann, bin ich mir nicht so sicher...
IhopeonlyReader - Mo 21.05.12 15:42
jaenicke hat folgendes geschrieben : |
Ein Timer? Wie soll das gehen?
Dafür braucht man wohl eher einen Maushook. Aber ob man das mit den Mausinformationen so zuverlässig unterscheiden kann, bin ich mir nicht so sicher... |
Ich denke da an einen angelehnten Befehl zu GetaSyncKeyState. Ich denke da gibt es auch einen bestimmte für mausbefehle, ich glaub, dass geht sogar mit GetaSyncKeyState(VK_LBUTTON) also linker mausbutton und GetaSyncKeyState(VK_RBUTTON)
Die Position der Maus bestimmen kann man mit Mouse.CursorPos.X und entsprehcend Mouse.CursorPos.Y Hierbei werden dann die Integer Werte der Maus gegeben, gegebenenfalls ist es noch nützlich die Bildschirmbreite zu nutzen um herauszufinden, ob das Fenster außerhalb des Screens/Dekstopbereiches liegt. Dies ist einfach mit einer Abfrage zu
if Screen.Width<Mouse.CursorPos.X then
so jetzt weißt du wie du nach mausklick und mausbewegen abfragst, aber die Frage ist noch nach dem Cursor.
Hierzu folgender Links ;)
http://forum.chip.de/java-delphi-pascal/aktuellen-cursor-delphi-auslesen-926189.html
Ich hoffe ich konnte helfen, allerdings weiß ich keine bessere Methode das Abzufragen, da man sonst nicht weiß kommt die Veränderung vom User oder vom Programm selber.
Gegebenenfalls könnte man noch die Möglichkeiten kombinieren...
Hierzu folgendes:
- Es ist möglich auf das Bewegen einer Form (auch von anderen Programmen) zu reagieren, hierzu werden Messages zwischen ich glaub Windows API und dem Programm abgefragt und somit das erkannt.
-> Nachteil: Unterschied: User/Programm nicht erkennbar.
Diesen Nachteil kannst du dann mit der Oben genannten Möglichkeit kombinieren, z.B. dass du fragst ob sich als sich die Form verändert hat auch der Cursor = dem Symbol von <-> bzw. diesem Pfeil nach oben/unten war. (Kenn leider gerade nicht die Codes dieses Cursors)
NewMori - Di 22.05.12 18:25
Danke für alle Antworten, ich denke ich werde das mit dem Cursoricon und dem Mousebutton ausprobieren auch wenn es nicht immer eindeutig ist. (Evtl. schalte ich die Funktion einfach auf einen HotKey welcher während dem Resizen gedrückt werden muss).
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2025 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!