{"id":182,"date":"2007-12-24T09:33:07","date_gmt":"2007-12-24T08:33:07","guid":{"rendered":"http:\/\/blog.m-ri.de\/index.php\/2007\/12\/24\/die-unsitte-windows-interne-nachrichten-zu-versenden\/"},"modified":"2010-03-11T19:53:46","modified_gmt":"2010-03-11T18:53:46","slug":"die-unsitte-windows-interne-nachrichten-zu-versenden","status":"publish","type":"post","link":"http:\/\/blog.m-ri.de\/index.php\/2007\/12\/24\/die-unsitte-windows-interne-nachrichten-zu-versenden\/","title":{"rendered":"Die Unsitte Windows interne Nachrichten zu versenden"},"content":{"rendered":"<p>Neulich im <a href=\"http:\/\/www.c-plusplus.de\/forum\/\">http:\/\/www.c-plusplus.de\/forum\/<\/a>\u00a0fand sich folgende Empfehlung:<\/p>\n<blockquote><p>XYZ schrieb:<br \/>\nSchreibe knapp vor der MAIN MESSAGE LOOP:<br \/>\nC\/C++ Code:<\/p>\n<p class=\"ccode\">PostMessage(DeinHandle,WM_CREATE,NULL,NULL); \/\/oder so \u00e4hnlich vielleicht noch mit Instanz<br \/>\nwhile \/\/MAIN MESSAGE LOOP<\/p>\n<\/blockquote>\n<p>Ich staunte nicht schlecht.\u00a0Grund f\u00fcr diesen Holzhammer war, dass &#8222;angeblich&#8220; die Nachricht <em>WM_CREATE,<\/em> von Windows nicht verschickt wird. Also helfen wir einfach etwas nach und versenden diese selber.<br \/>\nDas sich dieser Code verbietet ist klar und ich will hier gar nicht weiter darauf eingehen warum.<\/p>\n<p>Aber es bringt mich zum Thema:<br \/>\nEs ist eine beliebte Unsitte Windows Nachrichten, die nur f\u00fcr das interne Zusammenspiel der Komponenten und als &#8222;Benachrichtigungen&#8220; dienen, selber zu versenden.<br \/>\nFavoriten hier sind oft <em>WM_SETFOCUS<\/em>, <em>WM_PAINT, WM_SIZE, WM_KEYDOWN\u00a0<\/em>und manche andere.<\/p>\n<p>Und Windows macht es dem Programmierer nicht einfach. In den Anfangszeiten von Windows wurde zu wenig bei der Namensgebung darauf geachtet, welche Nachrichten mehr oder weniger Aktionen ausl\u00f6sen und Eigenschaften setzen (z.B. <em>WM_SETFONT<\/em>) und welche Nachrichten als <em>Notifications<\/em> des OS dienen einem Programm mitzuteilen, dass etwas passiert ist, oder geschehen soll (z.B. <em>WM_CREATE, WM_PAINT, WM_SETFOCUS, WM_SIZE, WM_ACTIVATE\u00a0<\/em>etc.<em>).<br \/>\n<\/em>Vieles w\u00e4re einfacher, wenn man Anhand des Nachrichtenamens erkennen w\u00fcrde, dass diese Nachricht vom OS versendet wird und damit nicht f\u00fcr den Eigenbedarf bestimmt ist.<br \/>\nDie letzte Gruppe der Nachrichten steht hier oft in einem direkten Zusammenhang mit einer API-Funktion (<em>CreateWindow<\/em>, <em>UpdateWindow, SetFocus, SetWindowPos, SetActivteWindow\u00a0etc.).<\/em> Mit in diese Kategorie f\u00e4llt, der Versuch mit <em>WM_KEY&#8230; <\/em>Nachrichten Tastatureingaben zu simulieren was auch nur in Ausnahmef\u00e4llen korrekt funktioniert.<\/p>\n<p>Mit der Einf\u00fchrung der neuen Common Controls, wurde hier nachgebessert. Sicherlich auch weil <em>WM_COMMAND <\/em>als Benachrichtigungs Medium etwas schmalbr\u00fcstig ist. <em>WM_NOTIFY<\/em> wurde eingef\u00fchrt<br \/>\nDieser Schritt war gut. \u00a0Interessanter Weise habe ich noch niemals den Versuch gesehen solche Notifications zu simulieren. Obwohl dies hier auch kein Problem w\u00e4re, denn es gibt hier keine API Funktionen, die Konfliktpotential anbieten w\u00fcrden.<\/p>\n<p>H\u00e4ufigster Grund solch einer <em>Versuchung<\/em> nachzugeben eine Nachricht selbst zu versenden, ist oft einfach Unwissen \u00fcber die Windows-API. Und Eingangs erw\u00e4hnte ich es schon: Die Dokumentation ist oft genug nicht eindeutig und macht zu selten auch Hinweise auf die entsprechenden verbundenen API Funktionen, siehe Doku zu <a href=\"http:\/\/msdn2.microsoft.com\/en-us\/library\/ms646283.aspx\">WM_SETFOCUS<\/a> in der wir nichts zu <a href=\"http:\/\/msdn2.microsoft.com\/en-us\/library\/ms646312(VS.85).aspx\">SetFocus <\/a>lesen, au\u00dfer in der Fu\u00dfnote f\u00fcr <em>See also.<\/em> Erst die Doku der <em>SetFocus<\/em> API-Funktion gibt Aufschluss, dass diese Nachricht durch SetFocus versendet wirdund damit in gewisser Weise intern ist. Windows f\u00fchrt Buch welches Fenster den Fokus hat, aber dieser wird eben durch <em>SetFocus <\/em>gesetzt und nicht durch <em>WM_SETFOCUS<\/em>!<\/p>\n<p>Fazit: Verurteilen kann man diese Unsitte schwer, au\u00dfer mit dem Hinweis: &#8222;Es wurde nicht korrekt in der Doku gelesen, RTFM (Read the fine MSDN)&#8220;. Allerdings ist f\u00fcr Anf\u00e4nger die MSDN oft genug einfach nur mehr erschlagend als informativ.<br \/>\nDennoch kommt man nicht umhin sorgf\u00e4ltig auf die Zusammenh\u00e4nge von Nachrichten und API-Funktionen zu studieren. Das bedeutet in diesem Zusammenhang, gerade die Dokumentationen der Funktionen, Nachrichten\u00a0und Methoden zu lesen, die in der Fu\u00dfnote unter <em>See also <\/em>aufgef\u00fchrt werden<em>. <\/em>Oft genug findet man auf diesem Weg die Zusammenh\u00e4nge (oft etwas m\u00fchsam) heraus.<\/p>\n<p>Anmerkung: Die Dokumentation der MFC mach das Ganze leider noch schlimmer, denn hier werden nur kurze Ausz\u00fcge der Windows-API wiedergegeben, die leider oft genug nicht detailliert genug sind. Hier ist immer angeraten, hinter einer virtuellen <em>On&#8230; <\/em>Funktion einen Windows Nachrichten Handler zu vermuten und in der Windows API noch einmal genauer nachzulesen. Allerdings macht sie auch einiges wiederklarer, denn sie kapselt die <em>WM_&#8230;<\/em> Nachrichten, die als Methoden\/Getter\/Setter funktionieren direkt in eigenst\u00e4ndigen Memberfunktionen. Aber auch hier empfiehlt es sich nachzusehen was unter <em>See also <\/em>steht.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Neulich im http:\/\/www.c-plusplus.de\/forum\/\u00a0fand sich folgende Empfehlung: XYZ schrieb: Schreibe knapp vor der MAIN MESSAGE LOOP: C\/C++ Code: PostMessage(DeinHandle,WM_CREATE,NULL,NULL); \/\/oder so \u00e4hnlich vielleicht noch mit Instanz while \/\/MAIN MESSAGE LOOP Ich staunte nicht schlecht.\u00a0Grund f\u00fcr diesen Holzhammer war, dass &#8222;angeblich&#8220; die Nachricht WM_CREATE, von Windows nicht verschickt wird. Also helfen wir einfach etwas nach und versenden &hellip; <a href=\"http:\/\/blog.m-ri.de\/index.php\/2007\/12\/24\/die-unsitte-windows-interne-nachrichten-zu-versenden\/\" class=\"more-link\"><span class=\"screen-reader-text\">\u201eDie Unsitte Windows interne Nachrichten zu versenden\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_newsletter_access":"","_jetpack_dont_email_post_to_subs":false,"_jetpack_newsletter_tier_id":0,"_jetpack_memberships_contains_paywalled_content":false,"_jetpack_feature_clip_id":0,"_jetpack_memberships_contains_paid_content":false,"footnotes":"","jetpack_post_was_ever_published":false},"categories":[30,4,3,2],"tags":[370,352,74,61],"class_list":["post-182","post","type-post","status-publish","format-standard","hentry","category-c","category-mfc","category-programmieren","category-windows-api","tag-c","tag-mfc","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\/182","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=182"}],"version-history":[{"count":1,"href":"http:\/\/blog.m-ri.de\/index.php\/wp-json\/wp\/v2\/posts\/182\/revisions"}],"predecessor-version":[{"id":603,"href":"http:\/\/blog.m-ri.de\/index.php\/wp-json\/wp\/v2\/posts\/182\/revisions\/603"}],"wp:attachment":[{"href":"http:\/\/blog.m-ri.de\/index.php\/wp-json\/wp\/v2\/media?parent=182"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"http:\/\/blog.m-ri.de\/index.php\/wp-json\/wp\/v2\/categories?post=182"},{"taxonomy":"post_tag","embeddable":true,"href":"http:\/\/blog.m-ri.de\/index.php\/wp-json\/wp\/v2\/tags?post=182"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}