こんにちは、ヒカルと申します。
http://madia.world.coocan.jp/cgi-bin/VBBBS/wwwlng.cgi?print+200306/03060056.txt
参考リンクを見て、DLLを作成してこれを使わないと不可能だと信じていました。でも、VBでこんな事もできるのかと感動でした。
そこで、以前VCで書いたDLLを不慣れですがVBへ書き換えてみました。
構造体からのキャストができないのでCopyMemoryを使うんですね!?
下記は一部抜粋です。
'フックインストール関数の呼び出し
SetHook App.hInstance, GetCurrentThreadId() 'App.ThreadID
'WH_CALLWNDPROCフックのインストール関数
Public Sub SetHook(ByVal hInst As Long, ByVal hThred As Long)
gHook = SetWindowsHookEx(WH_CALLWNDPROC, AddressOf WndHookProc, hInst, hThred)
End Sub
コンパイルは通りますが、フックをインストールするところで
落ちますので、フックの成功・失敗を戻り値で判断するロジックを
仕掛けたところ、ここまでステップが行っていないようでした。
つまり、SetWindowsHookExで落ちているものと思われました。
SetWindowsHookEx()の引数の設定がマズイのでしょうか?
識者の皆様、宜しくお願いします。
gHook = SetWindowsHookEx(WH_CALLWNDPROC, AddressOf WndHookProc, hInst, 0&)
ではだめでしょうか?
Loreley さんへ
早速のお返事ありがとうございますm(__)m
gHook = SetWindowsHookEx(WH_CALLWNDPROC, AddressOf WndHookProc, hInst, 0&)
これなのですが、参考サイトのほうでも0&これになっていましたが
先ずはこれで試しました、が、これを実行した途端に一般保護違反
になってしまいます。
そこでいろいろ調べていたところThredIDを渡す必要があるのかと
そこへ至った次第です。
ちなみに、その場合では同様にフックのインストールボタンをクリック
すると、フック解除のボタンも押せない状況で
全ての操作がフリーズしてしまっています。
QueryUnloadで解除するコードも書いていますが、
OSを落とすしかないのでこれも効いていないと思うので、
危険は覚悟のうえですが、それでもかなりなことをしていますね(^^;
こういう事でしょうか?
一応、フックのインストールはできているのではないかと思います、
gHook = SetWindowsHookEx(WH_CALLWNDPROC, AddressOf WndHookProc, hInst, 0&)
において、gHookの値が非ゼロは確認できました。
WH_CALLWNDPROC、このフックの場合、参考リンクにありますような
キーボードフックの時と違って、全てのメッセージがフック
されるのでVBのみで作った場合では、
オーバヘッドが大きすぎてしまうからなのでしょうか?
つまり、フックプロシージャが無限ループのような感じで
呼び出されていて、OSへ制御が戻らなくなってしまっている事に
因るフリーズ現象なのでしょうか?
CPUがかなりの音量で動き出して止まらなくなりシステムをダウンさせます。
VB ですべてをグローバルフックするとフリーズするというのは、
http://madia.world.coocan.jp/cgi-bin/VBBBS/wwwlng.cgi?print+200306/03060056.txt
でも書いたとおりです。
Loreley さんへ
>VB ですべてをグローバルフックするとフリーズするというのは、
>http://madia.world.coocan.jp/cgi-bin/VBBBS/wwwlng.cgi?print+200306/03060056.txt
>でも書いたとおりです。
これではなくて、仕様みたいです。
そもそも、VBでグローバルフックできるのはあの
フックプロシージャだからできるようです。
ツイート | ![]() |