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

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

ログ内検索
  • キーワードを複数指定する場合は 半角スペース で区切ってください。
  • 検索条件は、(AND)=[A かつ B] (OR)=[A または B] となっています。
  • [返信]をクリックすると返信ページへ移動します。
キーワード/ 検索条件 /
検索範囲/ 強調表示/ ON (自動リンクOFF)
結果表示件数/ 記事No検索/ ON
大文字と小文字を区別する

No.84497 の関連記事表示

<< 0 >>
■84497  SetWindowsHookExが応答しなくなる
□投稿者/ ねこまっしぐら -(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)
親記事 /過去ログ144より / 関連記事表示
削除チェック/

■84501  Re[1]: SetWindowsHookExが応答しなくなる
□投稿者/ 魔界の仮面弁士 -(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 デリゲートが適切かどうか、とか。
記事No.84497 のレス /過去ログ144より / 関連記事表示
削除チェック/

■84503  Re[2]: SetWindowsHookExが応答しなくなる
□投稿者/ ねこまっしぐら -(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
    
    ともかくもう少し動かし続けてどのくらい動くか確認してみます
記事No.84497 のレス /過去ログ144より / 関連記事表示
削除チェック/

■84504  Re[3]: SetWindowsHookExが応答しなくなる
□投稿者/ 魔界の仮面弁士 -(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

    > ともかくもう少し動かし続けてどのくらい動くか確認してみます
    ご武運を!
記事No.84497 のレス /過去ログ144より / 関連記事表示
削除チェック/

■84516  Re[4]: SetWindowsHookExが応答しなくなる
□投稿者/ ねこまっしぐら -(2017/07/11(Tue) 16:37:41)
記事No.84497 のレス / END /過去ログ144より / 関連記事表示
削除チェック/



<< 0 >>

パスワード/

- Child Tree -