Autor Beitrag
NewMori
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 45
Erhaltene Danke: 1



BeitragVerfasst: Sa 19.05.12 21:53 
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

_________________
Es ist keine Kunst in ein Programm 20 Fehler zu schreiben. Die Kunst ist es das Programm dann noch zum laufen zu bekommen.
IhopeonlyReader
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 600
Erhaltene Danke: 23


Delphi 7 PE
BeitragVerfasst: 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:


user profile iconNewMori hat folgendes geschrieben Zum zitierten Posting springen:
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ß ;)

_________________
Sucht "neueres" Delphi :D
Wer nicht brauch was er hat, brauch auch nicht was er nicht hat!


Zuletzt bearbeitet von IhopeonlyReader am Di 22.05.12 19:54, insgesamt 1-mal bearbeitet
NewMori Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 45
Erhaltene Danke: 1



BeitragVerfasst: 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.

_________________
Es ist keine Kunst in ein Programm 20 Fehler zu schreiben. Die Kunst ist es das Programm dann noch zum laufen zu bekommen.
IhopeonlyReader
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 600
Erhaltene Danke: 23


Delphi 7 PE
BeitragVerfasst: So 20.05.12 21:04 
user profile iconNewMori hat folgendes geschrieben Zum zitierten Posting springen:
@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 www.delphipraxis.net...derung-abfragen.html

Ich hoffe ich konnte dir helfen

_________________
Sucht "neueres" Delphi :D
Wer nicht brauch was er hat, brauch auch nicht was er nicht hat!
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19274
Erhaltene Danke: 1740

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Mo 21.05.12 07:23 
user profile iconIhopeonlyReader hat folgendes geschrieben Zum zitierten Posting springen:
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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 600
Erhaltene Danke: 23


Delphi 7 PE
BeitragVerfasst: Mo 21.05.12 15:42 
user profile iconjaenicke hat folgendes geschrieben Zum zitierten Posting springen:
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 ;)
forum.chip.de/java-d...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)

_________________
Sucht "neueres" Delphi :D
Wer nicht brauch was er hat, brauch auch nicht was er nicht hat!
NewMori Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 45
Erhaltene Danke: 1



BeitragVerfasst: 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).

_________________
Es ist keine Kunst in ein Programm 20 Fehler zu schreiben. Die Kunst ist es das Programm dann noch zum laufen zu bekommen.