Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Postmessage(Handle,WM_RBUTTONDOWN,0,0) an falscher position (https://www.delphipraxis.net/122014-postmessage-handle-wm_rbuttondown-0-0-falscher-position.html)

SimStar001 8. Okt 2008 08:45


Postmessage(Handle,WM_RBUTTONDOWN,0,0) an falscher position
 
Hallo, meine Postmessage(Handle,WM_RBUTTONDOWN,0,0) wird nicht an der vorher festgelegten mausposition ausgeführt, sondern in der oberen linken ecke! wieso das?

Dust Signs 8. Okt 2008 08:47

Re: Postmessage(Handle,WM_RBUTTONDOWN,0,0) an falscher posit
 
Musst du die Koordinaten nicht in lparam mit übergeben?

Dust Signs

SimStar001 8. Okt 2008 08:53

Re: Postmessage(Handle,WM_RBUTTONDOWN,0,0) an falscher posit
 
habe das ganz mal so ausprobiert,

[delphi]PostMessage(Handle,WM_RBUTTONdown,550,550);[delphi]

dann wandert das popupmenü zwar nach rechts aber bleibt oben am rand ?


wieso, oder was amche ich denn falsch!?

taaktaak 8. Okt 2008 09:00

Re: Postmessage(Handle,WM_RBUTTONDOWN,0,0) an falscher posit
 
Besser, du schreibst mal ein paar Worte darüber, was du da genau machen willst...

Dust Signs 8. Okt 2008 09:00

Re: Postmessage(Handle,WM_RBUTTONDOWN,0,0) an falscher posit
 
Die Position wird laut MSDN nur über lParam kodiert.
Zitat:

Zitat von [url
http://msdn.microsoft.com/en-us/library/aa923238.aspx[/url]]xPos Value of the low-order word of lParam. Specifies the x-coordinate of the pointer, relative to the upper-left corner of the client area.
yPos Value of the high-order word of lParam. Specifies the y-coordinate of the pointer, relative to the upper-left corner of the client area.

Dust Signs

SimStar001 8. Okt 2008 09:08

Re: Postmessage(Handle,WM_RBUTTONDOWN,0,0) an falscher posit
 
Also ich berechne aus Koordinaten die Cursor Position die im externen Programm gesetzt werden soll.

soweit ganz gut, Position wird richtig berechnent und die maus mit Setcursorpos dorthin bewegt.

nun soll auch genau an dieser stelle der rechtsklick erfolgen damit sich ein popup öffnent! und das funktioniert nicht.


Nun zu http://msdn.microsoft.com/en-us/library/aa923238.aspx

ich verstehe irgendwie nicht was ich denn nun genau angeben bzw übergeben muss??

Zitat:

xPos

Value of the low-order word of lParam. Specifies the x-coordinate of the pointer, relative to the upper-left corner of the client area.

yPos

Value of the high-order word of lParam. Specifies the y-coordinate of the pointer, relative to the upper-left corner of the client area.

Dust Signs 8. Okt 2008 09:44

Re: Postmessage(Handle,WM_RBUTTONDOWN,0,0) an falscher posit
 
Ganz einfach: ein Word ist 16 Bit lang, ein Integer 32. Ein Integer besteht folglich aus zwei Words. Diese beiden Words enthalten die Koordinaten. Durch Bit-Shifting kannst du das dann so lösen (bin in Delphi nicht mehr so firm, Code ohne Garantie; vielleicht stellt Delphi sogar ein Pendant für diese Funktion bereit):

Delphi-Quellcode:
function WordsToInt(w1: Word; w2: Word): Integer;
begin
  Result := (w1 shr 16) or w2;
end;
Der resultierende Integer ist dann dein lparam. Anmerkung: Cardinal wäre hier eigentlich der richtige Rückgabetyp, da der Rückgabewert kein Vorzeichen haben sollte. Aber wie gesagt: bin ich Delphi nicht mehr sehr firm, da ich schon länger nicht mehr damit programmiert habe.
Dein lparam ergibt sich dann aus X und Y:

Delphi-Quellcode:
lparam := WordsToInt(X, Y);
Dust Signs

SimStar001 8. Okt 2008 09:55

Re: Postmessage(Handle,WM_RBUTTONDOWN,0,0) an falscher posit
 
Habs jetzt so gemacht und das menü wird immer noch links oben ausgegeben



Delphi-Quellcode:
function WordsToLparam(w1: Word; w2: Word): cardinal;
begin
  Result := (w1 shr 16) or w2;
end;


Delphi-Quellcode:
Handle := Find_IvAc_Radar(IvAc);

      appactivate(Handle,1);
      SetCursorPos(x,y);
      PostMessage(Handle,wm_rbuttondown,wordstolparam(x,y),0);

was mache ich nur verkehrt?

Luckie 8. Okt 2008 10:01

Re: Postmessage(Handle,WM_RBUTTONDOWN,0,0) an falscher posit
 
Das Macro MSDN-Library durchsuchenMAKELPARAM gibt es auch als Delphi Funktion, wenn ich mich recht entsinne.

Diskutieren wir hier eigentlich gerade an zwei Stellen: http://www.delphipraxis.net/internal...t.php?t=143934 ???

SimStar001 8. Okt 2008 10:10

Re: Postmessage(Handle,WM_RBUTTONDOWN,0,0) an falscher posit
 
OK, vielleicht sollte mir mal jemand ne gute erklärung geben was denn nun eigentlcih Lparam sind oder mal nen link für ne gute erklärung übder die ganzen msdn befehle, den ich auch verstehe

Luckie 8. Okt 2008 10:14

Re: Postmessage(Handle,WM_RBUTTONDOWN,0,0) an falscher posit
 
Dann guck im MSDN nach: MSDN-Library durchsuchenPostMessage.

Dust Signs 8. Okt 2008 10:18

Re: Postmessage(Handle,WM_RBUTTONDOWN,0,0) an falscher posit
 
Das kann ja nicht funktionieren, wenn du statt lparam wparam auf die Koordinaten setzt. Du musst den letzten Parameter (lparam) auf die Koordinaten setzen:

Delphi-Quellcode:
PostMessage(Handle, WM_RBUTTONDOWN, 0, WordsToLparam(x,y));
Dust Signs

SimStar001 8. Okt 2008 10:27

Re: Postmessage(Handle,WM_RBUTTONDOWN,0,0) an falscher posit
 
Zitat:

Delphi-Quellcode:
PostMessage(Handle, WM_RBUTTONDOWN, 0, WordsToLparam(x,y));

also wenn ich das mache, dann bewegt sich zwar das Popupmenü in x richtung an die richte position, es bleib aber immernoch in y richtung auf null hängen

Dust Signs 8. Okt 2008 10:29

Re: Postmessage(Handle,WM_RBUTTONDOWN,0,0) an falscher posit
 
Luckie hat dich ja bereits auf MakeLparam hingewiesen. Versuch das doch mal.
Es wäre angebracht, wenn du etwas mehr Eigeninitiative zeigen und dir einmal die von Luckie und mir geposteten Links durchlesen würdest :roll:

Dust Signs

Fussball-Robby 8. Okt 2008 10:33

Re: Postmessage(Handle,WM_RBUTTONDOWN,0,0) an falscher posit
 
Zitat:

Zitat von SimStar001
Delphi-Quellcode:
function WordsToLparam(w1: Word; w2: Word): cardinal;
begin
  Result := (w1 shr 16) or w2;
end;

Ich bin mir jetzt nicht 100%ig sicher, aber müsste es, wenn überhaupt, nicht w1 shl 16 heißen?


Edit: Ja, es funktioniert mit shl. Allerdings muss man w2 nach links shiften, also so:
Delphi-Quellcode:
function WordsToLparam(w1: Word; w2: Word): cardinal;
begin
  Result := w1 or (w2 shl 16);
end;
Dann sollte alles wie gewollt funktionieren.

SimStar001 8. Okt 2008 10:38

Re: Postmessage(Handle,WM_RBUTTONDOWN,0,0) an falscher posit
 
Zitat:

Luckie hat dich ja bereits auf MakeLparam hingewiesen. Versuch das doch mal.
Es wäre angebracht, wenn du etwas mehr Eigeninitiative zeigen und dir einmal die von Luckie und mir geposteten Links durchlesen würdest Rolling Eyes

Also ich bin doch schon am lesen und ausprobieren, mehr kann ich auhc nicht machen. und außerdem versteh ich die erklärungen bei msdn nicht wirklich. tut mir leid....

Fussball-Robby 8. Okt 2008 10:42

Re: Postmessage(Handle,WM_RBUTTONDOWN,0,0) an falscher posit
 
Funktionierendes Beispiel ist im Edit meines letzten Posts. Wenn du willst, kann ich dir den Code auch noch erklären..

SimStar001 8. Okt 2008 10:44

Re: Postmessage(Handle,WM_RBUTTONDOWN,0,0) an falscher posit
 
Also bin jett schonmal etwas weiter gekommen:

Zitat:

Ich bin mir jetzt nicht 100%ig sicher, aber müsste es, wenn überhaupt, nicht w1 shl 16 heißen?

Also wenn ich es so mache wie du schreibst, bleibt das popupmenü zumindest nciht mehr bei y = 0 hängen, die richtige postion hat es allerdings immer noch nicht.


Nun zu MakelParam: Also damit wird das popup auf der richtigen position geöffnet!


vielen dank für die Hilfe!


(schwere Geburt!)


Zitat:

Funktionierendes Beispiel ist im Edit meines letzten Posts. Wenn du willst, kann ich dir den Code auch noch erklären..
Ja bitte erklär mir den Code mal, denn ich bekomm es einfach nciht in den kopf wieso man nicht einfach die x,y koordinate angeben kann!

Dust Signs 8. Okt 2008 10:47

Re: Postmessage(Handle,WM_RBUTTONDOWN,0,0) an falscher posit
 
Zitat:

Zitat von Fussball-Robby
Zitat:

Zitat von SimStar001
Delphi-Quellcode:
function WordsToLparam(w1: Word; w2: Word): cardinal;
begin
  Result := (w1 shr 16) or w2;
end;

Ich bin mir jetzt nicht 100%ig sicher, aber müsste es, wenn überhaupt, nicht w1 shl 16 heißen?


Edit: Ja, es funktioniert mit shl. Allerdings muss man w2 nach links shiften, also so:
Delphi-Quellcode:
function WordsToLparam(w1: Word; w2: Word): cardinal;
begin
  Result := w1 or (w2 shl 16);
end;
Dann sollte alles wie gewollt funktionieren.

Mit dem shl hattest du recht (mein Fehler). Trotzdem muss das erste Word geshiftet werden, also:

Delphi-Quellcode:
Result := (w1 shl 16) or w2;
Dann wäre die Funktion wahrscheinlich ident zu MakeLparam und würde ebenfalls funktionieren.

Dust Signs

Dust Signs 8. Okt 2008 10:48

Re: Postmessage(Handle,WM_RBUTTONDOWN,0,0) an falscher posit
 
Zitat:

Zitat von SimStar001
ich bekomm es einfach nciht in den kopf wieso man nicht einfach die x,y koordinate angeben kann!

Wie bereits in meinem ersten Post geschrieben: X und Y sind je ein Word breit (16 Bit), und du übergibst einen Integer (lparam, 32 Bit). In 32 Bit passen 2 * 16 Bit, also 2 Koordinaten - X und Y mit jeweils 16 Bit.

Dust Signs

Fussball-Robby 8. Okt 2008 18:39

Re: Postmessage(Handle,WM_RBUTTONDOWN,0,0) an falscher posit
 
Zitat:

Zitat von Dust Signs
Trotzdem muss das erste Word geshiftet werden, also:

Delphi-Quellcode:
Result := (w1 shl 16) or w2;
Dann wäre die Funktion wahrscheinlich ident zu MakeLparam und würde ebenfalls funktionieren.

Hast du es schonmal ausprobiert? Entweder muss man das 2. Word shiften oder die Y-Koordinate zuerst angeben, ich war auch etwas verwirrt..


Zitat:

Zitat von SimStar001
Ja bitte erklär mir den Code mal, denn ich bekomm es einfach nciht in den kopf wieso man nicht einfach die x,y koordinate angeben kann!

Alsoo..
Die beiden Koordinaten müssen in EINEN Parameter, wozu der andere gebraucht wird, weiß ich nicht. der Parameter ist vom Typ Integer, hat also 32 Bit. Dann nimmt man also 2 Words (16 Bit), einen für jede Koordinate, z.B.:
Code:
X: 0001100100111001
Y: 0011011000011100
Wenn man diese jetzt zusammenaddieren würde, wüsste man nachher nichtmehr, welche Koordinaten welchen Wert hatte. Aber der Integer hat ja 32 Bits, jedes Word 16, also bekommt einfach jede Koordinate die Hälfte des Integers. Dazu fügt man in den Integer mit 32 Bits erstmal eine Koordinate ein:
Code:
Integer: XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
X rein: XXXXXXXXXXXXXXXX0001100100111001
Mittels shl 16 werden dann alle Bits um 16 nach links verschoben, dannach wird die 2. Koordinate eingefügt:
Code:
nach shl 16: 0001100100111001XXXXXXXXXXXXXXXX
Y rein:     00011001001110010011011000011100
So hat man nun ZWEI Werte in EINER Variablen, indem jeder Wert die Hälfte der Bits bekommt, und man kann die Werte nachher wieder unterscheiden.

Ich hoffe, dir ist das nun etwas verständlich geworden ;)


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