{"id":335,"date":"2008-10-23T19:35:40","date_gmt":"2008-10-23T17:35:40","guid":{"rendered":"http:\/\/blog.m-ri.de\/?p=335"},"modified":"2008-10-24T12:50:17","modified_gmt":"2008-10-24T10:50:17","slug":"die-unsitte-getcursorpos-statt-getmessagepos-zu-verwenden","status":"publish","type":"post","link":"http:\/\/blog.m-ri.de\/index.php\/2008\/10\/23\/die-unsitte-getcursorpos-statt-getmessagepos-zu-verwenden\/","title":{"rendered":"Die Unsitte GetCursorPos statt GetMessagePos zu verwenden"},"content":{"rendered":"<p>Im Endeffekt ist es der gleiche Grund warum man\u00a0<em>GetKeyState <\/em>und nicht <em>GetAsynchKeyState <\/em>verwenden\u00a0sollte (siehe <a title=\"Permanent Link: Die Unsitte GetAsyncKeyState statt GeyKeyState zu verwenden\u2026\" rel=\"bookmark\" href=\"http:\/\/blog.m-ri.de\/index.php\/2008\/06\/11\/die-unsitte-getasynchkeystate-statt-geykeystate-zu-verwenden\/\">Die Unsitte GetAsyncKeyState statt GeyKeyState zu verwenden\u2026<\/a>).<\/p>\n<p>Auch hier liefert <a href=\"http:\/\/msdn.microsoft.com\/en-us\/library\/ms648390(VS.85).aspx\">GetCursorPos<\/a> die aktuelle Mauszweiger Position w\u00e4hrend <a href=\"http:\/\/msdn.microsoft.com\/en-us\/library\/ms644938(VS.85).aspx\">GetMessagePos<\/a>\u00a0die Position liefert in dem Moment in dem die aktuelle Windows Nachricht eingeliefert wurde.<br \/>\nOft genug wird hier kein Unterschied sein, aber durch aufwendigere Berechnungen oder gar durch eine verz\u00f6gerte Abarbeitung von Windows Nachrichten (lange Zeit wurde evtl. keine Nachrichtenschleife mehr abgearbeitet), kann es sehr wohl passieren, dass ein Mausklick f\u00fcr eine Position eingeliefert wird, der (Millisekunden) her ist, w\u00e4hrend die aktuelle Mausposition schon Millimeter weiter ist.<\/p>\n<p>Ist ein User dann richtig schnell und hektisch, kann die folgende Kombination fatale Folgen bei Verwendung von <em>GetCursorPos <\/em>haben.<\/p>\n<ul>\n<li>System ist etwas besch\u00e4ftigt und die Nachrichtenschleife wird nicht zeitnah abgearbeitet<\/li>\n<li>User klickt mit Maus auf <em>Item1<\/em><\/li>\n<li>Die Maus wird etwas weiter bewegt und steht nun auf <em>Item2<\/em><\/li>\n<li>Verz\u00f6gertes Abarbeiten beginnt jetzt und das Programm ermittelt mit <em>GetCursorPos Item2 <\/em>und selektiert es.<\/li>\n<li>User dr\u00fcckt <em>Entf<\/em>-Taste und wundert sich \ud83d\ude2e dass <em>Item2 <\/em>weg ist!<\/li>\n<\/ul>\n<p>W\u00e4re <em>GetMessagePos <\/em>hier verwendet worden, w\u00e4re das korrekte <em>Item1 <\/em>gel\u00f6scht worden.<\/p>\n<p>Das Verwechseln dieser beiden Funktionen hatte mir in einem St\u00fcck Software sogar einen richtigen Crash beschert. Wir hatten in einem bestimmten Fenster eigent\u00fcmliche Abst\u00fcrze. Er trat immer auf wenn bestimmte Leute (Kategorie <em>Poweruser <\/em>oder <em>\u00dcbernerv\u00f6s<\/em>) mit der Maus bestimmte Teile in der Auswertung markierten bzw. selektierten.<\/p>\n<p>Ein Programmierer nutze <em>GetMessagePos<\/em>, der andere <em>GetCursorPos <\/em>f\u00fcr einige Kalkulationen. Meistens ist kein gro\u00dfer Unterschied zwischen den beiden Werten aber manchmal kam es schon vor. Effekt war aber hier, dass die eine Routine mit einem Objekt eine Funktion einleitete und an anderer Stelle ein anderes Objekt ermittelt wurde. Und gerade einige <em>hektische<\/em> Leute, die Klicken w\u00e4hrend Sie noch nicht mal genau gezielt haben, brachten es zustande, dass es einen Unterschied\u00a0gab zwischen der urspr\u00fcnglichen Position (bei der ersten ausl\u00f6senden Nachricht) und der aktuellen Mausposition (wenn die Nachricht dann abgearbeitet wurde).<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Im Endeffekt ist es der gleiche Grund warum man\u00a0GetKeyState und nicht GetAsynchKeyState verwenden\u00a0sollte (siehe Die Unsitte GetAsyncKeyState statt GeyKeyState zu verwenden\u2026). Auch hier liefert GetCursorPos die aktuelle Mauszweiger Position w\u00e4hrend GetMessagePos\u00a0die Position liefert in dem Moment in dem die aktuelle Windows Nachricht eingeliefert wurde. Oft genug wird hier kein Unterschied sein, aber durch aufwendigere Berechnungen &hellip; <a href=\"http:\/\/blog.m-ri.de\/index.php\/2008\/10\/23\/die-unsitte-getcursorpos-statt-getmessagepos-zu-verwenden\/\" class=\"more-link\"><span class=\"screen-reader-text\">\u201eDie Unsitte GetCursorPos statt GetMessagePos zu verwenden\u201c <\/span>weiterlesen<\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_jetpack_memberships_contains_paid_content":false,"footnotes":""},"categories":[30,3,2],"tags":[370,74,61],"class_list":["post-335","post","type-post","status-publish","format-standard","hentry","category-c","category-programmieren","category-windows-api","tag-c","tag-unsitten","tag-winapi"],"jetpack_featured_media_url":"","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"http:\/\/blog.m-ri.de\/index.php\/wp-json\/wp\/v2\/posts\/335","targetHints":{"allow":["GET"]}}],"collection":[{"href":"http:\/\/blog.m-ri.de\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"http:\/\/blog.m-ri.de\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"http:\/\/blog.m-ri.de\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"http:\/\/blog.m-ri.de\/index.php\/wp-json\/wp\/v2\/comments?post=335"}],"version-history":[{"count":1,"href":"http:\/\/blog.m-ri.de\/index.php\/wp-json\/wp\/v2\/posts\/335\/revisions"}],"predecessor-version":[{"id":353,"href":"http:\/\/blog.m-ri.de\/index.php\/wp-json\/wp\/v2\/posts\/335\/revisions\/353"}],"wp:attachment":[{"href":"http:\/\/blog.m-ri.de\/index.php\/wp-json\/wp\/v2\/media?parent=335"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"http:\/\/blog.m-ri.de\/index.php\/wp-json\/wp\/v2\/categories?post=335"},{"taxonomy":"post_tag","embeddable":true,"href":"http:\/\/blog.m-ri.de\/index.php\/wp-json\/wp\/v2\/tags?post=335"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}