{"id":449,"date":"2009-04-15T22:05:34","date_gmt":"2009-04-15T20:05:34","guid":{"rendered":"http:\/\/blog.m-ri.de\/?p=449"},"modified":"2009-04-15T22:05:34","modified_gmt":"2009-04-15T20:05:34","slug":"das-web-browser-control-stiehlt-den-fokus-wenn-ein-dokument-geladen-wurde","status":"publish","type":"post","link":"http:\/\/blog.m-ri.de\/index.php\/2009\/04\/15\/das-web-browser-control-stiehlt-den-fokus-wenn-ein-dokument-geladen-wurde\/","title":{"rendered":"Das Web Browser Control stiehlt den Fokus wenn ein Dokument geladen wurde"},"content":{"rendered":"<p>Wenn man ein Web Browser Control einbindet und dieses eine Seite l\u00e4dt, dann wird der Fokus in dieses Browser Control gesetzt. Dagegen ist kein Kraut und keine Notification gewachsen.<br \/>\nGenaugenommen ist nicht das Webbrowser Control schuld, sondern der Scriptcode der auf der Seite l\u00e4uft und den Fokus umsetzt. Das sieht man schnell wenn man den Moment der <em>WM_KILLFOCUS <\/em>Nachricht im Debugger abpasst und sich den Stacktrace ansieht.<\/p>\n<pre>0013b84c 4a570824 USER32!NtUserSetFocus \r\n0013b858 4a5ce628 mshtml!CDoc::TakeFocus+0x2a \r\n0013b880 4a63fc0b mshtml!CElement::BecomeCurrent+0x167 \r\n0013b8b4 4a63fb72 mshtml!CElement::focusHelper+0xcc \r\n0013b8c0 4a587c85 mshtml!CElement::focus+0x1d \r\n0013b8cc 4a5d7477 mshtml!Method_void_void+0x17 \r\n0013b94c 4a57fae8 mshtml!CBase::ContextInvokeEx+0x462 \r\n0013b97c 4a575413 mshtml!CElement::ContextInvokeEx+0x72 \r\n0013b9b0 76fa5295 mshtml!CElement::ContextThunk_InvokeEx+0x44 \r\n0013b9e8 76fa5208 jscript!IDispatchExInvokeEx2+0xa9 \r\n0013ba20 76fa5323 jscript!IDispatchExInvokeEx+0x56 \r\n0013ba90 76fa577b jscript!InvokeDispatchEx+0x78 \r\n0013bad8 76fa57c6 jscript!VAR::InvokeByName+0x1c1 \r\n0013bb18 76fa4ab0 jscript!VAR::InvokeDispName+0x43 \r\n0013bb3c 76fa5a14 jscript!VAR::InvokeByDispID+0xfb \r\n0013bd30 76fa46d8 jscript!CScriptRuntime::Run+0x195b \r\n0013bdf4 76fa506e jscript!ScrFncObj::Call+0x69 \r\n0013be6c 76fa5f6a jscript!CSession::Execute+0xb8 \r\n0013bf6c 76fa672f jscript!NameTbl::InvokeDef+0x183 \r\n0013c040 76fa5295 jscript!NameTbl::InvokeEx+0xd2<\/pre>\n<p>Dummerweise gibt es kein Event mehr, das danach gefeuert wird, wenn der Skript-Code abl\u00e4uft. Das letzte Event bevor das aktive Fenster den Fokus verliert\u00a0ist <em>OnDocumentComplete<\/em>.<\/p>\n<p>Es gibt auch einige Threads die dieses Thema behandeln, aber keine vern\u00fcnftige L\u00f6sung.\u00a0Von so manchen\u00a0Timerl\u00f6sungen halte ich nichts, die da so vorgeschlagen werden, wer wei\u00df schon wann eine Seite geladen ist?<br \/>\nBesonders \u00e4rgerlich auch, wenn man das Browser Control nicht mal auf einem sichtbaren Fenster hat, sondern nur in einem versteckten Fenster h\u00e4lt. Auch in diesem Fall verliert das aktive Fenster den Fokus.<\/p>\n<p>Aber mit einem kleinen Trick bekommt man es doch hin ( \ud83d\ude42 warum sonst schreibe ich den Artikel )<\/p>\n<ol>\n<li>Man baut einen <em>OnDocumentComplete <\/em>Handler ein.<\/li>\n<li>Wenn das Event eintritt, besorgt man sich mit <em>GetFocus <\/em>das Fenster, dass aktuell noch den Fokus inne hat.<\/li>\n<li>Nun sendet man mit <em>PostMessage <\/em>eine selbst definierte Nachricht (<em>#define WM_RESTOREFOCUS (WM_APP+x)<\/em>) an den Container des Webbrowser Controls und \u00fcbergibt als <em>wParam <\/em>einfach das Handle des Fensters, dass man soeben mit <em>GetFocus <\/em>ermittelt hat.<\/li>\n<li>Nach diesem Event wird der Skript-Code ausgef\u00fchrt, der den Fokus stiehlt. Das\u00a0st\u00f6rt uns nicht.<\/li>\n<li>Irgendwann kommt die Messageloop jetzt wieder an die Reihe und zieht die benutzerdefinierte Nachricht <em>WM_RESTOREFOCUS <\/em>aus der Queue.<\/li>\n<li>Man hat nat\u00fcrlich einen Handler f\u00fcr diese Nachricht im Container des Webbrowser Controls. Dieser macht nun nichts anderes als einen <em>SetFocus<\/em> auf das <em>HWND <\/em>Handle auszuf\u00fchren, das im <em>wParam <\/em>\u00fcbergeben wurde. Ein Test zuvor mit <em>IsWindow <\/em>versteht sich von selbst.<\/li>\n<\/ol>\n<p>Dadurch, dass die Nachricht in der Message-Queue gepostet wird, wird sie zeitnah ausgef\u00fchrt sobald wirklich der User wieder eine Chance selbst Eingaben zu machen. Problem zufriedenstellend gel\u00f6st.<\/p>\n<p>Das sollte sich sogar mit <em>C#<\/em> oder <em>VB<\/em> hinbekommen lassen \ud83d\ude09<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Wenn man ein Web Browser Control einbindet und dieses eine Seite l\u00e4dt, dann wird der Fokus in dieses Browser Control gesetzt. Dagegen ist kein Kraut und keine Notification gewachsen. Genaugenommen ist nicht das Webbrowser Control schuld, sondern der Scriptcode der auf der Seite l\u00e4uft und den Fokus umsetzt. Das sieht man schnell wenn man den &hellip; <a href=\"http:\/\/blog.m-ri.de\/index.php\/2009\/04\/15\/das-web-browser-control-stiehlt-den-fokus-wenn-ein-dokument-geladen-wurde\/\" class=\"more-link\"><span class=\"screen-reader-text\">\u201eDas Web Browser Control stiehlt den Fokus wenn ein Dokument geladen wurde\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":[25,30,2],"tags":[169,370,54,61],"class_list":["post-449","post","type-post","status-publish","format-standard","hentry","category-atl","category-c","category-windows-api","tag-activex","tag-c","tag-ie","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\/449","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=449"}],"version-history":[{"count":1,"href":"http:\/\/blog.m-ri.de\/index.php\/wp-json\/wp\/v2\/posts\/449\/revisions"}],"predecessor-version":[{"id":451,"href":"http:\/\/blog.m-ri.de\/index.php\/wp-json\/wp\/v2\/posts\/449\/revisions\/451"}],"wp:attachment":[{"href":"http:\/\/blog.m-ri.de\/index.php\/wp-json\/wp\/v2\/media?parent=449"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"http:\/\/blog.m-ri.de\/index.php\/wp-json\/wp\/v2\/categories?post=449"},{"taxonomy":"post_tag","embeddable":true,"href":"http:\/\/blog.m-ri.de\/index.php\/wp-json\/wp\/v2\/tags?post=449"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}