{"id":184,"date":"2007-12-27T10:25:06","date_gmt":"2007-12-27T09:25:06","guid":{"rendered":"http:\/\/blog.m-ri.de\/index.php\/2007\/12\/27\/die-unsitte-tastatureingaben-mit-wm_keydown-nachrichten-zu-simulieren\/"},"modified":"2007-12-27T10:13:57","modified_gmt":"2007-12-27T09:13:57","slug":"die-unsitte-tastatureingaben-mit-wm_keydown-nachrichten-zu-simulieren","status":"publish","type":"post","link":"http:\/\/blog.m-ri.de\/index.php\/2007\/12\/27\/die-unsitte-tastatureingaben-mit-wm_keydown-nachrichten-zu-simulieren\/","title":{"rendered":"Die Unsitte Tastatureingaben mit WM_KEYDOWN Nachrichten zu simulieren"},"content":{"rendered":"<p>Dies ist eine Erg\u00e4nzung zu meinem Blog Eintrag <a href=\"http:\/\/blog.m-ri.de\/index.php\/2007\/12\/24\/die-unsitte-windows-interne-nachrichten-zu-versenden\/\">Die Unsitte Windows interne Nachrichten zu versenden<\/a>.<br \/>\nIn einem der Kommentare wurde ich gefragt wie man es nun mit <em>WM_KEY&#8230; <\/em>Nachrichten richtig macht, weil ich auch diese Nachrichten als\u00a0&#8222;intern&#8220; definiert habe. In meinen Augen ist es unzul\u00e4ssig WM_KEY&#8230; Nachrichten per <em>PostMessage <\/em>oder <em>SendMessage <\/em>zu versenden.\u00a0Also ist die Frage berechtigt:<br \/>\nWie macht man es richtig, mit der Simulation von Tastatureingaben f\u00fcr andere Prozesse \u2753<\/p>\n<p>Ersteinmal m\u00f6chte ich erkl\u00e4ren, warum das Senden einer <em>WM_KEY&#8230; <\/em>Nachricht nicht funktioniert, oder oft genug nicht richtig funktioniert:<\/p>\n<ol>\n<li>Alleine wenn das Programm <em>GetKeyState <\/em>oder <em>GetAsynchKeystate <\/em>benutzt um zu ermitteln ob gleichzeitig sie Strg- oder die Umschalttaste gedr\u00fcckt wird, dann funktioniert <em>SendMessage\/PostMessage <\/em>nicht mehr.<\/li>\n<li>Wenn das fremde Programm Accelerator verwendet, dann wird hier auch durch senden einer <em>WM_KEY<\/em>&#8230; Nachricht der Accelerator oft genug nicht ausgel\u00f6st. Die Folge: Der gew\u00fcnschte Effekt bleibt aus.<\/li>\n<li>Man bekommt schnell Probleme mit synthetisierten Zeichen, die zwei Tasteneingaben erfordern, z.B. ^ und a, f\u00fcr \u00e2.<\/li>\n<li>Man muss f\u00fcrchterlich darauf achten, wenn ein Befehl den Fokus wechselt.<\/li>\n<li>Die Applikation hat nicht\u00a0den Fokus! Alleine das kann schon Fehlverhalten ausl\u00f6sen, denn normalerweise kann nur eine aktive Applikation mit Fokus Tastatur- und Mauseingaben erhalten.<\/li>\n<li><em>WM_SYSKEY<\/em>&#8230; Nachrichten werden nicht korrekt erzeugt.<\/li>\n<\/ol>\n<p>Wie macht man es nun \u2753 &nbsp;<br \/>\nEs ist ganz einfach: Man benutzt <a href=\"http:\/\/msdn2.microsoft.com\/en-us\/library\/ms646310.aspx\"><em>SendInput<\/em><\/a> \u2757 &nbsp;<br \/>\nDer Vollst\u00e4ndigkeit halber sei hier noch die legacy Funktion <a href=\"http:\/\/msdn2.microsoft.com\/en-us\/library\/ms646304.aspx\"><em>keybd<\/em>_event<\/a> erw\u00e4hnt.<\/p>\n<p><em>SendInput <\/em>reiht die\u00a0Eingaben ein in die Eingabequeue f\u00fcr das gesamte Windows System ein\u00a0und liefert diese an die aktive Applikation aus und an das Fenster, das den aktuellen Eingabefokus hat. Man kann also nicht einfach so auch das Zielfenster angeben, dass die Eingaben erhalten soll. Das merkt man schon daran, dass es kein Fensterhandle gibt, dass man als Ziel angeben k\u00f6nnte f\u00fcr <em>SendInput<\/em>.<\/p>\n<p>Frage aber nun: Wie gew\u00e4hrleistet man, dass das richtige Programm die Tastaturnachricht bekommt\u00a0 \u2753<\/p>\n<p>Auch hier ist die Antwort relativ einfach! Zwei Dinge sind dazu n\u00f6tig:<\/p>\n<ol>\n<li>Dass Zielfenster, bzw. den Thread in dem das Zielfenster muss ausgew\u00e4hlt werden, damit er diese Eingaben auch erhalten darf. Das wird durch <a href=\"http:\/\/msdn2.microsoft.com\/en-us\/library\/ms681956(VS.85).aspx\"><em>AttachThreadInput<\/em> <\/a>erreicht. Denn wir wollen die Daten ja nicht an unsere Applikation senden. \u2757 Bitte hinterher nicht vergessen <em>AttatchThreadInput <\/em>mit <em>FALSE <\/em>aufzurufen und den Thread wieder zu detachen.<\/li>\n<li>Man muss den Fokus korrekt setzten f\u00fcr das Fenster, dass die Eingaben erhalten soll!<br \/>\nIst der Zielthread jetzt an die Eingabequeue angeschlossen, kann man ohne Probleme <em>SetFocus\u00a0<\/em>ausf\u00fchren (was ohne <em>AttachThreadInput <\/em>normalerweise auch nicht m\u00f6glich w\u00e4re).<\/li>\n<li>Wird jetzt SendInput ausgef\u00fchrt, werden alle Nachrichten korrekt erzeugt und auch alle Commands entsprechend der Tastaturfolge ausgel\u00f6st. Auch spezielle Umlaute und Unicode Zeichne lassen sich so erzeugen.<\/li>\n<\/ol>\n<p>Es ist gar nicht so schwer es richtig zu machen. <img src=\"http:\/\/blog.m-ri.de\/wp-includes\/images\/smilies\/mrgreen.png\" alt=\":mrgreen:\" class=\"wp-smiley\" style=\"height: 1em; max-height: 1em;\" \/><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Dies ist eine Erg\u00e4nzung zu meinem Blog Eintrag Die Unsitte Windows interne Nachrichten zu versenden. In einem der Kommentare wurde ich gefragt wie man es nun mit WM_KEY&#8230; Nachrichten richtig macht, weil ich auch diese Nachrichten als\u00a0&#8222;intern&#8220; definiert habe. In meinen Augen ist es unzul\u00e4ssig WM_KEY&#8230; Nachrichten per PostMessage oder SendMessage zu versenden.\u00a0Also ist die &hellip; <a href=\"http:\/\/blog.m-ri.de\/index.php\/2007\/12\/27\/die-unsitte-tastatureingaben-mit-wm_keydown-nachrichten-zu-simulieren\/\" class=\"more-link\"><span class=\"screen-reader-text\">\u201eDie Unsitte Tastatureingaben mit WM_KEYDOWN Nachrichten zu simulieren\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,4,3,2],"tags":[370,352,74,61],"class_list":["post-184","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\/184","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=184"}],"version-history":[{"count":0,"href":"http:\/\/blog.m-ri.de\/index.php\/wp-json\/wp\/v2\/posts\/184\/revisions"}],"wp:attachment":[{"href":"http:\/\/blog.m-ri.de\/index.php\/wp-json\/wp\/v2\/media?parent=184"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"http:\/\/blog.m-ri.de\/index.php\/wp-json\/wp\/v2\/categories?post=184"},{"taxonomy":"post_tag","embeddable":true,"href":"http:\/\/blog.m-ri.de\/index.php\/wp-json\/wp\/v2\/tags?post=184"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}