問題タブ [bho]
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.
c# - PCに複数のアセンブリがある場合、どの製品の.netアセンブリが登録されているかを確認するにはどうすればよいですか?
自分のマシンで作業しているソフトウェア製品のさまざまなバージョンのコードがあります。製品には、com相互運用機能に登録されている1つ以上のアセンブリが含まれています。現在登録されているものを確認するにはどうすればよいですか?
internet-explorer - IE オートメーション: ユーザーが開始したナビゲーションが行われている/行われたことを判断する方法は?
Internet Explorer BHO (c# .net) があり、ユーザーがいつナビゲーションを開始したか、またはユーザーが開始したナビゲーションが完了したかを識別したいと考えています。ユーザーが開始するとは、リンクまたは同様のアクションをクリックすることを意味します。特に、読み込まれているドキュメントに複数のフレームがある場合、それらを 1 つの「ナビゲーション」として扱いたいのですが、これを行う簡単な方法が思い浮かびません。BeforeNavigate2 および DocumentComplete イベントは知っていますが、ユーザーがリンクをクリックしたときに発生する BeforeNavigate/DocumentComplete と、フレームが読み込まれているために発生するものを区別する方法がわかりません。
私が考えている1つの可能な解決策は、上部フレームのBeforeNavigate2が常に内側フレームの前に起動され(明らかに)、子フレームのDocumentCompleteが上部のDocumentCompleteの前に呼び出され、常に最後に呼び出されることです。 . たとえば、BeforeNavigates でカウンターをインクリメントし、DocumentComplete でカウンターをデクリメントできます。0 の場合のみ、ユーザーが開始したナビゲーションになります。
しかし、これに頼ることができるかどうか、またはそれを行うためのより良い方法があるかどうかはわかりません。たとえば、ユーザーがフレームの 1 つがすべての読み込みを完了していない後に ESC を押すとどうなりますか? 最上位フレームの DocumentComplete が呼び出されることはありますか?
助言がありますか?
c# - Form.ShowDialog(IWin32Window) はどのウィンドウ ハンドルでも動作しますか?
を使用する場合System.Windows.Forms.ShowDialog(IWin32Window)
、任意のウィンドウ ハンドルを表すものを渡して、IWin32Window
そのウィンドウに対してモーダルにする必要がありますか?
Internet Explorer 7 拡張機能の一部として、Internet Explorer タブに関するウィンドウ モーダルを開こうとしています。現在選択されているタブではありませんが、タブの hwnd を取得できれば OK です。ただし、これを ShowDialog に渡すと、フォームが表示されますが、モーダルではありません。所有者であるはずのタブを含め、Internet Explorer で操作を行うことができます。私のフォームは Internet Explorer ウィンドウの上に浮いて表示され、一番上に表示されるので、通常のフォームとして開かれただけではなく、正しくモーダルではありません。
Spy++を使用すると、フォームを見つけることができ、その所有者ハンドルが正しく設定されています。
これは、何かが間違っているということですか、それとも私が何か間違ったことをしているということですか? フォームを正しくモーダルにするにはどうすればよいですか?
参考までに、このラッパー クラスを使用してIWin32Window
fromを作成していますhwnd
(ありがとうRyan! ):
更新: Internet Explorer 7 & .NET 2.0 の使用
更新: Spy++ とそれが公開するハンドルをもう少しいじってみると、別のものを使用するとhwnd
、ウィンドウをタブにモーダルにすることができることがわかりました。
Spy ++では class として表示されるIWebBrowser2.HWND dochwnd
で提案されているように、タブを使用していました。クラス の子があり、これには Internet_Explorer_Server の子があります。の を使用すると、正しく動作します。たとえば、マウスで他のタブをクリックすると、Internet Explorer は正常に反応します。興味のあるタブをマウスでクリックすると、windows d'oh サウンドが再生され、何もしません。TabWindowClass
Shell DocObject View
hwnd
Internet Explorer_Server
Internet_Explorer_Server をプログラムで取得する方法はまだわかりませんが、hwnd
可能なはずです。
また、価値のあることとして、他のウィンドウ ハンドルで遊んでいる間、通常、フォームを他のアプリケーションやダイアログに対してモーダルにすることができました。したがって、私の質問に対する答えは「すべてのハンドルではなく多くのハンドル」であると思います...おそらくアプリケーションに依存しますか?
更新: 別の補足事項: フォームをウィンドウ全体ではなくタブに対してモーダルにしたかった当初の理由は、MessageBox
フォームから a を開くときに、フォームを所有者として渡すと、MessageBox
常にフォームの上に開くとは限らないためです。 . Internet Explorer の新しいタブを開いたばかりでアクティブになっていない場合、MessageBox
タブが非表示になり、そのタブが点滅し始めます。ただし、モーダルでフォームを開いた状態で Internet Explorer が無効になっているため、そのタブに切り替えることができず、Internet Explorer がフリーズしていました。フォームモーダルをタブに開くとこれが解決すると思いましたが、別の解決策は使用を避けることであることがわかりましMessageBox
た.2番目のフォームを使用ShowDialog(this)
し、最初のフォームから2番目のフォームが正しく前面に開きます。Form.ShowDialog()
そのため、よりもうまく機能するようですMessageBox.Show()
ある場合には。モーダル ダイアログとメッセージ ボックスに関する問題 での詳細な議論。
c# - プロジェクト COM 登録のセットアップ
COM Interop を使用して C#/.NET 2.0 で記述された IE BHO (ツールバー) があります。Visual Studio 2005 を使用して、Setup Project を使用してツールバー用の MSI インストーラーを生成しています。
私のアセンブリでは、ComRegisterFunctionAttributeを使用して COM 登録/登録解除メソッドを使用しています。これは、ツールバーに関する重要な情報 (ツールバーの名前など) を IE に提供するレジストリ キーを設定します。私のセットアップ プロジェクトでは、vsdrpCOMRelativePathプロパティを使用して COM 用の dll を登録します (以下のコードを参照)。
MSI をインストールすると、ツールバーは正常に機能しますが、1 つの厄介な問題があります。IE を起動してツールバーを選択すると、有効なツールバーのリストに表示されますが、完全修飾クラス名が「MyToolbar 」になっています。 .IEHelperToolbar " 通常の名前の代わりに: " IEHelperToolbar "
セットアップ プロジェクトによって生成された MSI が、アセンブリで定義したカスタム登録メソッドを呼び出していないようです。regasm.exe を使用して dll を登録すると、IE は正しい名前を表示するため、この結論に達しました。
セットアップ プロジェクトで別の登録設定を使用する必要がありますか、それともこの投稿のアプローチに従うべきですか : または、VS2005 セットアップ プロジェクトをあきらめて WIX などに移動する必要がありますか?
ここに私の登録/登録解除関数があります:
debugging - Visual Studio ではデバッグ メッセージが表示されるのに、DebugView ではデバッグ メッセージが表示されないのはなぜですか?
Internet Explorer 内で実行されるブラウザ ヘルパー オブジェクトを開発しています。ATLTRACE("...");
Visual Studio がプロセスにアタッチされている場合、これらは正常に表示されますiexplore.exe
が、これは簡単なテストには時間がかかります。DebugView は私の BHO から何もキャプチャしません。
DebugView に BHO デバッグ メッセージが表示されないのはなぜですか? 低整合性レベルで実行されている Internet Explorer と関係がありますか?
c# - Internet Explorer のユーザー フォント設定にアクセスする方法を教えてください。
C# で記述されたブラウザ ヘルパー オブジェクト内で、フォント (特にフォント ファミリ) の Internet Explorer ユーザー設定にアクセスしたいと考えています。
SHDocVw.WebBrowser と IHTMLDocument( to 5) を調べましたが、探しているものやプロパティが見つからないものはありません。
BHO は Internet Explorer 7 用です。
どうもありがとうございました!
編集: リチャードは、なぜこの情報が必要なのかを尋ねます: HTML ドキュメントまたは CSS によって指定されたフォント ファミリがシステムにインストールされていない場合、IE7 設定で調整できるフォント ファミリが使用されます。最後のインスタンスでテキストをレンダリングするために使用されるこのアプリケーションベースのフォントファミリが必要です (他のすべての情報が失敗した場合)。
dll - DLL で WTL を使用するにはどうすればよいですか?
インプロセス COM サーバー DLL (IE BHO) 内で WTL を使用しようとしていますが、_Module に苦労しています。
私の DLL は次CMyModule
から派生する必要がありCAtlDllModuleT<>
ます。
しかし、これはほとんどの WTL の例と矛盾しますstdafx.h
。
どちらの方法でも、(当然のことながら) コンパイル エラーが発生します。borks onCMyModule
から派生などborks on codeから派生のような.CAppModule
_Module.DllUnregisterServer()
CMyModule
CAtlDllModuleT<>
_Module.GetMessageLoop()
WTL が DLL 内でどのように機能するかについての参考文献はありますか? Google は多くの質問を見つけますが、答えはほとんどありません。
internet-explorer - BHO - ワーカー スレッドからイベント ハンドラーをアタッチする
DISPID_DOCUMENTCOMPLETE で、ワーカー スレッドから DOM の特定の要素に onclick ハンドラをアタッチすると、クリック中にイベントが発生しません。その理由は何ですか? メインスレッドからイベントハンドラーをアタッチしている場合、これは正常に機能しますが、非同期で処理したいと考えています。
CoMarshalInterThreadInterfaceInStream と CoGetInterfaceAndReleaseStream を使用して、スレッド間で IID_IWebBrowser2 ポインターを渡します。
multithreading - C# IE BHO: 同じスレッドを維持しながら非同期で動作しますか?
C# で開発中の IE BHO があります。ユーザーが何らかの操作を行うのを待ち、サーバーに接続してデータをダウンロードし、現在読み込まれている Web ページの DOM を結果で変更することになっています。
COM のコンパートメント化とスレッド化のルールに関連する一見克服できない問題に直面しています。つまり、現在のスレッドの外で IE DOMDocument にアクセスできないようで、ロックせずに何かを非同期的に実行する方法が思い浮かびません。終了するまで IE を起動します。
私の最初の試みでは、バックグラウンドのサーバー通信がイベント駆動型の方法で行われました。私のプログラムは、mshtml イベント (BeforeNaviagate2 または DocumentComplete など) 内から通信を開始し、別のイベント ハンドラー内から結果をポストしました。サーバー通信オブジェクトが作業を終了したときに起動されます。
この手法は、私がまとめた簡単なシミュレーター (WebBrowser コントロールを備えた単純なアプリ) ではうまく機能しましたが、IE では別のスレッドを介してページ DOM を変更しようとしたため、COM 例外がスローされました。
そこで、すべてを同じ関数に保持し、次のように、サーバー通信オブジェクトが while ループで作業を行うのをコードで待機させようとしました。
このアプローチの問題は、コードが元のスレッドにとどまっている間、コードが起動された IE プロセスと同期して実行されることです (IE8 では、タブごとに 1 つのプロセスであり、Google Chrome のように見えます) ... したがって、ロックアップします。サーバーとの通信が完了するまで IE インターフェースを使用しないでください。
最初は、URL が (NavigationComplete2 イベントを介して) 利用可能になったらすぐに処理を開始したかったのですが、ユーザーのページが読み込まれる前にサーバー通信が終了した場合に <body> タグが利用可能になるのを待つと、IE もロックされることがわかりました。私のコードがHTML本文を待っている間、それは無限ループに入りますが、ページは前述のループに対してそれ自体を更新できません。
これらすべてを実際のユーザーのページの JavaScript に移動することを考えましたが、そうすることで、XSS のセキュリティ問題と格闘する際にワームの缶を開けているようです。
だから...私の質問は次のとおりです.ユーザーのページDOMを操作しながら、C# IE BHOで非同期にコードを実行することは可能ですか? 私は何人かの友人に尋ねましたが、ほとんどの人はそうではないと言いました. C/VB.net/JS/AS 出身で、COM と C# についてはまだ初心者です。
ありがとうございました!
-トム