DOBON.NET DOBON.NETプログラミング掲示板過去ログ

ウィンドウプロシージャのフック

環境/言語:[Windows XP、VB.NET]
分類:[.NET]

はじめまして。TJと申します。

あるフォームから、別のフォームのウィンドウプロシージャをフックしたいの
ですがどのような手順で可能なのでしょうか?

フォームA内に、フォームBのウィンドウプロシージャをフックした処理を書
きたいのですが、フックしたいフォームがフォームBだけではなく、条件にあ
った様々なフォームが対象であるため、フォームB内で WndProc をオーバー
ライドすることでは対応できません。

色々探したのですが、見つからず仕舞いです。
言語は VB.NET です。ご存知の方がいらっしゃいましたらお教え下さい。

それでは。
こんばんは、じゃんぬねっと です。(*^-^)/

■No9229に返信(TJさんの記事)
> フックしたいフォームがフォームBだけではなく、
> 条件にあった様々なフォームが対象であるため、
> フォームB内で WndProc をオーバーライドすることでは対応できません。

WndProc をオーバーライドした Form クラスを書き、
その Form クラスを継承したフォームが、フック対象となるようにすれば問題ないのではないでしょうか?
派生元のクラスの型が同じであるので、問題なくフックするフラグにアクセスできますよね?

# もしかすると、そういうことが聞きたいのではないのでしょうか?
こんばんは、TJです。

> # もしかすると、そういうことが聞きたいのではないのでしょうか?

深読みしていただいて恐縮なんですが、単純にウィンドウプロシージャ
をフックする方法が知りたいんです。極端なことを言うと、別のEXE で
作成されたウィンドウのウィンドウプロシージャをフックするような事
も将来的にはやりたいもので。

お返事いただいたのに申し訳ございません。言葉足らずでした。
> 深読みしていただいて恐縮なんですが、単純にウィンドウプロシージャ
> をフックする方法が知りたいんです。極端なことを言うと、別のEXE で
> 作成されたウィンドウのウィンドウプロシージャをフックするような事
> も将来的にはやりたいもので。

フック自体は簡単にできます。
SetWindowsHookEx()でWH_CALLWNDPROCなどを指定してやればいいでしょう。

http://support.microsoft.com/default.aspx?scid=kb;ja;318804
こちらが参考になると思います。

また、SetWindowLong()などを使用すれば、サブクラス化も一応は
実現できますし、少々大掛かりになりますが、
直接MSILを書き換えてWndProcを変更することもできます。

http://msdn.microsoft.com/msdnmag/issues/03/09/NETProfilingAPI/default.aspx
こちらが参考になります。
> 別のEXE で作成されたウィンドウのウィンドウプロシージャをフックするよう
> な事も将来的にはやりたいもので。

.NET ではグローバルフックを仕掛けることは出来ないです。

EXE が違う=別プロセス=別アプリケーションドメインなので。
>>別のEXE で作成されたウィンドウのウィンドウプロシージャをフックするよう
>>な事も将来的にはやりたいもので。
>
> .NET ではグローバルフックを仕掛けることは出来ないです。
>
> EXE が違う=別プロセス=別アプリケーションドメインなので。

全てを.NETで行う必要がないのであれば、方法はあると思います。
参考までに。

http://www.codeproject.com/csharp/GlobalSystemHook.asp
antさん、渋木さん、ありがとうございます。

やはりAPIを使うしか方法がないようですね。
ちょっと難しそうですが頑張ってみます。

後、EXE間のフックができないのは予想外でした。
どうもありがとうございました。
解決済み!

DOBON.NET | プログラミング道 | プログラミング掲示板