問題タブ [mshtml]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
mshtml - 埋め込まれた MSHTML: マウス ホイールは無視されました
私の VC++ アプリケーションには、組み込みブラウザー (MSHTML) があります。正常に動作し、マウスを適切に処理します (たとえば、クリックと選択は正常に処理されます)。ただし、組み込みブラウザ上でマウス ホイールを回転させても効果はありません。これは私の問題です。
私は、MSHTML 埋め込みの内部構造や OLE 全般についてあまり詳しくありません。これは wxWidgets アプリケーション (wxWidgets は C++ GUI ライブラリ) であり、その IEHTMLWin コンポーネント (MSHTML コントロールをホストし、wxWindow インターフェイスでラップする) を利用しています。しかし、私はソースを持っているので、喜んでデバッグを行います。
wxWidgets を忘れて、純粋に OLE と MSHTML について話しているとしたら、問題の原因を探すのに適切な場所はどこでしょうか? 「mshtml マウス イベント」または「mshtml ホイール」の亜種を簡単にグーグル検索してみましたが、適切なポインタは得られませんでした。
IEHTMLWin のコードを確認したい場合は、ここで参照できます。iehtmlwin.c ファイル (1.5 k 行) には、OLE 関連のコードがすべて含まれており、Web ブラウザー コントロールをホストするために必要なすべてのインターフェイスが実装されています。マウス イベントが含まれている wxWindow にまったく進まないことに注意してください (OnMouse は呼び出されません)。
{UPD} mshtml バージョン: 6.00.2900.3314。このコントロールをホストする他のアプリケーション (IE を含む) は、ホイールをサポートします。{/UPD}
jdigital ヒント (winspector に関して) は非常に役に立ちました。メッセージのスニッフィングを行った後、問題がフォーカスに関連していることに気付きました。ブラウザー コントロールをクリックしても、何らかの理由でブラウザー コントロールにフォーカスが設定されず (RichEdit などとは異なります)、WM_MOUSEWHEEL がそこに送信されません。したがって、新しい問題は焦点を設定することです。
mshtml - Set focus to embedded MSHTML
In my application I have an embedded MSHTML control. The problem is that I cannot set focus to this control. I can click, select, push buttons etc, but it won't accept keyboard input and mouse wheel notifications as a result. Even left-clicks on the control do not set the focus. (The question is related to this issue.)
Ultimately, I've tried 4 approaches. (Error handling is omitted here for brevity.) The first is sending WM_SETFOCUS to the control.
Using Winspector, I made sure that the messages came through to the control's window, but it seems to ignore them.
The second is calling the focus() method of IHtmlWindow2.
This time, I get E_FAIL from focus().
MSDN says that the call may fail when the document hasn't loaded, but pHTMLDoc2->get_readyState() returns "complete". So this isn't the case.
The third is doing the UIACTIVATE verb.
This seems to achieve nothing.
The fourth is calling focus() of IHtmlDocument4.
Does nothing.
I've spent a full day on this already and know google's links by heart now :) Hoping for a hint from experts.
c# - IE の getBoundingClientRect は、windows.forms.webbrowser とは異なる答えをブラウザに与えます - なぜですか?
次のhtmlを取ります
それをブラウザにロードして任意の場所をクリックします - 210 が得られます。これは #Body div の左の値です
ただし、webbrowser コントロールを含む win フォームでは、同じ html に移動します。
もう一度クリックすると、10 になります。
なぜ...なぜ...なぜ?
parsing - mshtml でフレームのコンテンツを取得するにはどうすればよいですか?
問題は次のとおりです。
WebBrowser.OnNavigateComplete2
イベントに反応してドキュメントのコンテンツを解析し、正確な情報を取得するフックが IE にあります。
そのドキュメントにはフレームが含まれているため、HTMLDocument.frames
. それぞれについて、document.body.outerHTML プロパティを調べてコンテンツを確認します。
問題は、探している文字列がそこに表示されないのに対し、フィナーレ ページに表示されることです。それで、私は間違った場所を探していますか?ページが完全にロードされたときに表示される場合は、ある時点でダウンロードされていますよね? しかし、どのオブジェクトを見ればよいのでしょうか?
ところで、それが重要かどうかはわかりませんが、検索しているページは ASP.NET アプリケーションからのものです。
助けてくれてありがとう。
@ramsこのイベントはページごとに何度も起動されるため、探しているものをキャッチできなくても、フレームが読み込まれるたびに発生すると考えました。そうでない場合、フレームのコンテンツをキャッチするイベントは何ですか?
私がやりたいのは、正確なフレームに関する正確な情報を検出して保存することです。後で、何らかのユーザー アクションによってトリガーされた Web ページが読み込まれ、フレームの解析から取得した情報が必要になります。
c# - IHTMLEventObj2::fromElement を設定できません
Internet Explorer 拡張機能で合成 Javascript イベントを生成しようとしていますが、fromElement プロパティを保持するのに問題があります。これが私のコードの抜粋です:
ここで何が間違っていますか?eObj.fromElement は from と等しいはずですが、設定されていないようです。
c# - mshtml イベントに .NET デリゲートをアタッチするにはどうすればよいですか?
Internet Explorer の拡張機能 (BHO) に取り組んでいますが、.NET デリゲートを mshtml オブジェクトにアタッチして DOM イベントをキャッチするのに問題があります。
IHTMLElementEvents2_Event、... インターフェイスによって発行されたイベントを使用してみましたが、それは機能しますが、イベントをキャッチしたい DOM 要素に正しいタイプを指定した場合に限ります。また、要素の型をコードで指定する必要がありますが、この手法ではカスタム DOM イベントをキャッチできません。
IHTMLElement2.attachEvent メソッドを介して IDispatch オブジェクトを DOM 要素にアタッチするHtmlEventProxy クラスも使用してみましたが、まったく機能しません。このスレッドで説明されているようにイベント オブジェクトにアクセスしようとすると、DOM 要素のドキュメント プロパティにアクセスするときにハングします。
では、あらゆる種類の要素やあらゆる種類のイベントを特殊なケースにする必要なく、DOM 要素にイベント ハンドラーをアタッチするにはどうすればよいでしょうか?
ありがとう。
c# - EventInfo.RemoveEventHandlerがNullReferenceExceptionをスローするのはなぜですか?
リフレクションを使用してInternetExplorerBHOのMSHTMLオブジェクトに.NETイベントハンドラーをインストールするコードがありますが、正常に機能しているようです。しかし、イベントハンドラーを削除しようとすると、問題が発生します。
イベントハンドラのインストールと削除のコードは次のようになります。
の呼び出しはInstallEventHandler
正常に機能Handler
し、ブラウザでイベントがトリガーされると呼び出されます。呼び出しRemoveEventHandler
と同じ引数を使用してInstallEventHandler
呼び出すと、最後の行はTargetInvocationException
、内部例外を除いて、をスローしNullReferenceException
ます。ここで何が間違っているのか理解できず、スタックトレースはあまり役に立ちません。
編集:デバッガーでコードをステップ実行しましたが、直接参照するオブジェクト変数はどれもnullではありません。
また、InstallHandlerメソッドとの両方を呼び出してみましたが、これは正しく機能しAddEventHandler
ます。RemoveEventHandler
スタックトレースは次のとおりです。
これを引き起こしている可能性があり、どうすれば修正できますか?
html - 生成されたHTMLサイズを縮小するツール
私はグーグルドキュメントを使用しています、そして私たちが使用しているいくつかのテンプレートはMS-Officeを使用して作成されました。
結果として得られるHTMLは太くて醜く、Googleでのドキュメントあたり500KBの制限により、クリーンアップが必須になります。冗長な「スタイル」属性を見つけてCSSクラスに移動し、最も冗長なクラス名の名前を短い名前に変更することができました。これにより、元のサイズの約50%を節約できます。
私にとってこの苦痛な仕事をすることができる、または少なくとも私がこの魔法のツールを書くのを助けることができるいくつかの既存のツール/スクリプト/ libを知っていますか?
前もって感謝します !
編集:私は整頓、デモロナイザーと「手動書き換え」の両方を試してみました:
-入力:140Kb-
整頓:110Kb-
デモロン化:135Kb
だから私の好きな答えは「書き直して!」です。
ありがとう !
c++ - C++ の GUI に MSHTML を使用していますが、チュートリアルはありますか?
毎回 C++ を書き直さずにレイアウトを試す方がはるかに簡単なので、アプリを GUI に MHTML を使用するように移行したいと考えています。
残念ながら、私が見つけたものは必要なものではありません。
- メモリから HTML をフィードする
- onclick などのイベントを C++ コードで受け取る
- DOM を介して操作します。たとえば、特定の要素の innerHtml を設定します。
.net - .NET mshtml: BSTR SAFEARRAY を渡す方法は?
Microsoft.mshtml.dll アセンブリのクラス mshtml.HTMLDocumentClass には次のメソッドがあります。
ちょっと本当の質問を避けて、 write()を呼び出すためにどのコードを使用しますか? 使用しますか:
または、次を使用しますか?
どちらも例外をスローするためです。(タイプの不一致。0x80020005)
HTMLDocumentClass.writeメソッドは、実際にはIHTMLDocument2 インターフェイスから来ており、次のように文書化されています。
IHTMLDocument2::write メソッド
指定されたウィンドウ内のドキュメントに 1 つ以上の HTML 式を書き込みます。
構文
パラメーター
psarray
したがって、実際には、Microsoft のMicrosoft.mshtml相互運用機能アセンブリで書き込みメソッドが通常の配列を取るように定義されていても、書き込みメソッドには SAFEARRAY へのポインターが必要です。
mshtml 相互運用宣言を無視して、SAFEARRAYオブジェクト (オブジェクト配列に対して) を構築し、BSTR 文字列 (文字列に対して) で埋め、オブジェクト配列でなければならないパラメーターにそれを詰め込む必要があります。
注: paramsキーワードの意味がよくわかりません。可変数のパラメータを示すために使用されます。
それは複数の配列パラメータを取ることができるということですか?
それとも object[] は複数のパラメーターが渡されるメソッドであり、文字通り配列を作成する必要がありますか?
または、配列[]は単なるおとりであり、実際に渡します:
ネイティブの Win32 アプリからこのコードを最初に使用したとき、BSTR は SAFEARRAY 内に配置されていました。IDispatch ベースのオートメーションでは、すべてが配列内にあります。この場合、遅延バインディング コード:
コンパイラによって SAFEARRAY に変換されました。ここで、0 番目の要素には BSTR 文字列 (長さの接頭辞付きの Unicode 文字列) が含まれています。
私の問題は、SAFEARRAY を構築しようとすること、文字列を BSTR に変換すること、BSTR を SAFEARRAY の 0 番目の要素に配置すること、および SAFEARRAY を含む変数をオブジェクト配列 (object[ ]))。
これが本当の問題です: BSTR SAFEARRAY を作成する方法は?
Microsoft.mshtml
C:\Program Files\Microsoft.NET\Primary Interop Assemblies\Microsoft.mshtml.dll