2010-11-27 10 views
1

私はC++でイベントフックを理解しようとしています。私はイベントが何であるかを知っています。私はJava、C#、Javascriptで多く使っています。C++イベントフック

私が問題を抱えているのは、グローバルフック、DLLインジェクション、DLLなしのグローバルフックなどのドキュメントやチュートリアルを見つけることです。

FireFoxのブラウザtabisを繰り返し実行したいと言っていますが、FireFoxにC++用のAPIがあることを願っていますか?または、ユーザーが新しいタブを開いたときに何かしたいと言うと、FireFoxがAPIで提供するフックを使用する必要がありますか?

これは単なる例であり、人々は私が習得しようとしていることを知っています。私は正しいことを考えていますか?

私はフォーラムで投稿を見て、過去2時間私は興味を持った。私は常に、難しい挑戦、または新しい挑戦が、より強力なプログラマーを作ると言います。

すべてのリソース、または助けていただければ幸いです。

+2

C++自体には、「イベント」や「イベントフック」といったものはありません。それは、しかし、いくつかのフレームワークの一部かもしれません。 「DLLインジェクション」は、おそらくWinAPIのいくつかの機能を指していることを示唆しています。 – Vlad

+0

Firefox(または他のアプリケーション)が特定の言語でAPIを提供するかどうかは、開発チームによってのみ決定されます。 APIを任意の言語(または複数の言語、またはまったく提供しない)で提供することを選択することができます。 – Vlad

+0

第2段落では、あなたがWindowsについて話していると思います。もしそうなら、あなたの質問を明確にしてください。 Windowsにはフック機構があり、 "グローバルフックw/o DLL"として記述することもできます。しかし、C++とは何の関係もありません(システムAPI、言語に依存しません)。 – atzz

答えて

3

C++自体にイベントやフックはありませんが、多くのC++ライブラリやフレームワークで実装されています。汎用イベントライブラリの例については、Boost.Signalsを参照してください。

一部の実装では、他のアプリケーションでイベントを表示できますが、APIはアプリケーション固有です(Firefoxの場合はXPCOMを参照)。


Windowsには、ウィンドウシステム内のさまざまなイベントを監視できるフックの機構があります。しかし、これはOSの機能であり、C++には関係しません。それがシステムの仕組みなので、Windowsアプリケーションは何もしなくても影響を受けます。 Windowsフックのドキュメントは hereです。また、「DLLなしのグローバルフック」については、前述のWindowsフックより高いレベルのAPIである SetWinEventHookを参照し、DLLまたはEXEで実装されたフック関数で使用することもできます。

+0

ありがとうございます!非常に感謝しています。 –

+0

@Jack Harvin - ようこそ! – atzz

3

SetWindowsHookExのMSDNを参照してください。それはWindowsフックのあなたの入り口でなければなりません。あなたがmtheシステム用のparituclarウィンドウをターゲットに設定していれば、あまり侵入しないオプションはSetWindowLongPtrです。最初のAPIのために、あなたはシステムによってあなたのために自動的に取得されるDllの注入が必要になります。ただ、次の手順を実行します。

はHOOKPROC機能(フックTPEに依存し、実際のタイプ - ドキュメントを読み込む)エクスポートDllファイルを作成

ロードのDLLアプリケーションでのことをしてHOOKPROC関数へのポインタを取得します。これにはLoadLibrary/GetProcAddress APIを使用できます。

アプリケーションから、適切なパラメータでSetWindowsHookExフィードを呼び出します。これにより、ターゲットプロセスにdllが注入されます。これで、dllはアプリケーションのプロセスとターゲットプロセスの両方に読み込まれます。おそらく、2つのプロセス間のIPCのメカニズムが必要になるでしょう。

旧式のAPIは、あまり強力ではないが、DLL注入を必要としません。これは、DLL、ファイルシステム、Windowsメッセージ、COMサーバー+イベントなどのソケット、パイプ、共有セグメントです。

賢く選択してください&幸運!

+0

うん、それだよ。文字の建物のもの、確かに。 –

0

私はfirefoxがC++のaPIを持っていると思っていません。 開いているタブを見つけたい場合、または新しいタブが開いているときは、基本的にfirefoxウィンドウをフックして、そのウィンドウで発生しているすべてのイベントをフックプロシージャに渡すことができます。

VC++とfirefoxウィンドウでspy ++を開くと、新しいタブが開かれるたびに新しいMozillaContentWindowClassが作成されます。基本的にウィンドウハンドルを繰り返し、開いているタブについての情報を得ることができます。

SetWindowLongPtrを使用して、そのウィンドウのサブクラスプロシージャを設定できます。