C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

SetWindowsHookExが応答しなくなる

[トピック内 5 記事 (1 - 5 表示)]  << 0 >>

■84497 / inTopicNo.1)  SetWindowsHookExが応答しなくなる
  
□投稿者/ ねこまっしぐら (3回)-(2017/07/07(Fri) 18:55:24)

分類:[.NET 全般] 

vb.net 2005
質問しようにも何がどうなってるのかわからないのであれなんですけど…
ライブラリを作ってそこでマウスをフックしてるのですけど(x86ビルドです)
XP32bitの時はちゃんと動いてたのに7-64bitだとフックがだんまりになります
それも起動してすぐダメな時もあれば1-2時間ちゃんと動いてからダメになる
時もあり平均して2-30分ってとこでしょうか
そうなった時にUnHookしてまたセットすると正常に動き出します
(まあそれも2-30分の寿命ですが)
エラーコードも何も吐かないし何が悪いのかさっぱりです
何かヒントでもありますでしょうか

<DllImport("User32.dll", CharSet:=CharSet.Auto, CallingConvention:=CallingConvention.StdCall)> Public Overloads Shared Function SetWindowsHookEx(ByVal idHook As Integer, ByVal HookProc As CallBack, ByVal hInstance As IntPtr, ByVal wParam As Integer) As Integer
End Function

hMHook = SetWindowsHookEx(WH_MOUSE_LL, MHookProc, GetModuleHandle(Process.GetCurrentProcess().MainModule.ModuleName), 0)

引用返信 編集キー/
■84501 / inTopicNo.2)  Re[1]: SetWindowsHookExが応答しなくなる
□投稿者/ 魔界の仮面弁士 (1341回)-(2017/07/08(Sat) 13:23:36)
No84497 (ねこまっしぐら さん) に返信
> XP32bitの時はちゃんと動いてたのに7-64bitだとフックがだんまりになります
このあたりとか。
https://social.msdn.microsoft.com/Forums/windowsdesktop/en-US/56093d14-c1bc-4d0a-a915-57fef0695191/windows-7-setwindowshookex-callback-proc-stops-getting-called-after-exceeding-max-time-allowed?forum=windowsgeneraldevelopmentissues


> Public Overloads Shared Function SetWindowsHookEx(ByVal idHook As Integer, ByVal HookProc As CallBack, ByVal hInstance As IntPtr, ByVal wParam As Integer) As Integer
SetWindowsHookEx API の戻り値って、フックプロシージャのハンドル(HHOOK)ですよね。
Int32 ではなく、IntPtr で受け取るべきではないでしょうか。

> hMHook = SetWindowsHookEx(WH_MOUSE_LL, MHookProc, GetModuleHandle(Process.GetCurrentProcess().MainModule.ModuleName), 0)
インスタンスハンドルを受け取るなら、Marshal.GetHINSTANCE メソッドが使えませんでしたっけ。

あと、開発環境から利用する場合は、Visual Studio ホスティング プロセスが
無効になっているかどうかも確認を。

それ以外だと、記載されていない CallBack デリゲートが適切かどうか、とか。
引用返信 編集キー/
■84503 / inTopicNo.3)  Re[2]: SetWindowsHookExが応答しなくなる
□投稿者/ ねこまっしぐら (4回)-(2017/07/09(Sun) 21:34:10)
No84501 (魔界の仮面弁士 さん) に返信
いつもお世話になっております

> SetWindowsHookEx API の戻り値って、フックプロシージャのハンドル(HHOOK)ですよね。
> Int32 ではなく、IntPtr で受け取るべきではないでしょうか。

とりあえずIntPtrにしてみたらかなり動くようになりました
FirrFoxがメモリ食い尽くすまで1時間程動いてました
ただ不思議なのはこのライブラリ使った別々のプログラム同時に動かしてても
黙り込んだりしなかったり…

>>    hMHook = SetWindowsHookEx(WH_MOUSE_LL, MHookProc, GetModuleHandle(Process.GetCurrentProcess().MainModule.ModuleName), 0)
> インスタンスハンドルを受け取るなら、Marshal.GetHINSTANCE メソッドが使えませんでしたっけ。

    hMHook = SetWindowsHookEx(WH_MOUSE_LL, MHookProc, Marshal.GetHINSTANCE(Assembly.GetExecutingAssembly().GetModules()(0)), IntPtr.Zero)
ということでしょうか?

> あと、開発環境から利用する場合は、Visual Studio ホスティング プロセスが
> 無効になっているかどうかも確認を。

無効になっています

> それ以外だと、記載されていない CallBack デリゲートが適切かどうか、とか。

こんな感じですが
    MHookProc = AddressOf MyMouseHookProc

    Public Function MyMouseHookProc(ByVal nCode As Int32, ByVal wParam As IntPtr, ByVal lParam As IntPtr) As Int32
        Dim WP As Int32 = wParam.ToInt32

        Select Case WP
            Case WM_MOUSEMOVE
                RaiseEvent MouseMove(Me, e)
                If e.Handled Then Return 1
           :
          (略)
           :
        End Select

        Return CallNextHookEx(hMHook, nCode, wParam, lParam)
    End Function

ともかくもう少し動かし続けてどのくらい動くか確認してみます

引用返信 編集キー/
■84504 / inTopicNo.4)  Re[3]: SetWindowsHookExが応答しなくなる
□投稿者/ 魔界の仮面弁士 (1342回)-(2017/07/10(Mon) 02:10:27)
No84503 (ねこまっしぐら さん) に返信
>>インスタンスハンドルを受け取るなら、Marshal.GetHINSTANCE メソッドが使えませんでしたっけ。
> hMHook = SetWindowsHookEx(WH_MOUSE_LL, MHookProc, Marshal.GetHINSTANCE(Assembly.GetExecutingAssembly().GetModules()(0)), IntPtr.Zero)
> ということでしょうか?
そんな感じです。

>>それ以外だと、記載されていない CallBack デリゲートが適切かどうか、とか。
> Public Function MyMouseHookProc(ByVal nCode As Int32, ByVal wParam As IntPtr, ByVal lParam As IntPtr) As Int32
戻り値の型は Int32 ではなく IntPtr ですね。元が LRESULT なので。
https://msdn.microsoft.com/en-us/library/windows/desktop/ms644988%28v=vs.85%29.aspx
http://www.wdic.org/w/TECH/LRESULT

> ともかくもう少し動かし続けてどのくらい動くか確認してみます
ご武運を!
引用返信 編集キー/
■84516 / inTopicNo.5)  Re[4]: SetWindowsHookExが応答しなくなる
□投稿者/ ねこまっしぐら (5回)-(2017/07/11(Tue) 16:37:41)
No84504 (魔界の仮面弁士 さん) に返信

> 戻り値の型は Int32 ではなく IntPtr ですね。元が LRESULT なので。
> https://msdn.microsoft.com/en-us/library/windows/desktop/ms644988%28v=vs.85%29.aspx
> http://www.wdic.org/w/TECH/LRESULT

これを直してAnyCpuでビルドしたらウソのように安定してます
ホントに直った確証は無いですけどともかくこれだけ安定してれば実用レベルってことにしときます
ありがとうございました
解決済み
引用返信 編集キー/

このトピックをツリーで一括表示


トピック内ページ移動 / << 0 >>

このトピックに書きこむ