2013-07-27 8 views
13

私はプロジェクトでGma.UserActivityMonitorライブラリを使用しようとしていますが、私は自分自身で克服できないエラーに直面しました。 HookManager.Callbacks.csファイルでGma.UserActivityMonitor&SetWindowsHookExエラー126

静的メソッドがありますが、次のコード(多かれ少なかれ)とEnsureSubscribedToGlobalMouseEventsと呼ば:

var asm = Assembly.GetExecutingAssembly().GetModules()[0]; 
var mar = Marshal.GetHINSTANCE(asm); 
s_MouseHookHandle = SetWindowsHookEx(
    WH_MOUSE_LL, 
    s_MouseDelegate, 
    mar, 
    0); 
//If SetWindowsHookEx fails. 
if (s_MouseHookHandle == 0) 
{ 
    //Returns the error code returned by the last unmanaged function called using platform invoke that has the DllImportAttribute.SetLastError flag set. 
    int errorCode = Marshal.GetLastWin32Error(); 
    //do cleanup 

    //Initializes and throws a new instance of the Win32Exception class with the specified error. 
    throw new Win32Exception(errorCode); 
} 

SetWindowsHookEx常に0を返し、上記のコードは、メッセージThe specified module could not be foundとコールと例外をスローし続けますMarshal.GetLastWin32Errorにコード126を返します。私は正常にGma.UserActivityMonitorのオリジナルのプロジェクトで提供されたデモを実行することができますが、私のプロジェクトはここで説明するのが少し複雑すぎるので、私はその違いを私と詳しく説明することはできません。私は、誰かが盲目的に問題を推測できることを望んでいるだけです。 がプロジェクトのデバッグ時にのみチェックされると、他の人が問題に近い問題が発生していると言われています(SetWindowsHookExエラーが返されます)。だから、私はそのボックスをチェックしなかったが、私は同じ問題を抱えている。デバッグモードだけでなく、エクスプローラ(Visual Studioは関係ない)でリリースファイルをダブルクリックするときも同じだ。

詳細情報を表示するには、asmの変数が{Gma.UserActivityMonitor.dll}になり、例外がスローされた私のプロジェクトで同じことを指し示すデモプロジェクト(正常に動作します)で!

+0

これは、関連するプロセスのビット数に関連している可能性があります。 – Yahia

+0

詳細を説明したり、適切なリソースを教えてください。 – Mehran

+0

フックは、通常、対象プロセスの一部となるコードを必要とします。これはさまざまな方法で達成できますが、基本的にプロセス、フックされたプロセスおよびOSに関するビット数の違いは、問題および/またはerratciの動作につながる可能性があります。 – Yahia

答えて

27

この種のコードは.NET 4以降では動作しません。 126 = "指定されたモジュールが見つかりませんでした"。これは、 "mar"変数に迷惑メールが含まれていることを示しています。

.NET 4は、CLRの変更がかなり大きいため、管理されていないモジュール内にジッタのあるコードが存在することはもうありません。 Marshal.GetHINSTANCE()はもう動作しません。コードは、その後、(IntPtr)-1をテストして失敗を検出し、災害を宣言する必要が戻り値をチェックすることを忘れて、怠惰になる。 Codeprojectで見つけたコードではかなり一般的ですが、寄稿者によって修正できないバグやスローピーがたくさんあります。 SOモデルではありません:)

SetWindowsHookEx()は、低レベルのフックでは少し厄介です。それは有効なモジュールハンドルを必要とし、チェックしますが、実際には使用しません。これは、Win7 SP1のどこかでWindowsで修正されています。確かに役に立つ修正を意図していましたが、実際問題が悪化しました。今はあなたのdevマシンでは動作しますが、あなたのマシンでは動作しない可能性があります。

Anyhooでは、修正は簡単です。有効なモジュールハンドルを呼び出すだけで済みます。あなたの管理アプリで常に存在しているモジュールから1を得ることができ、あなたはそれを得るためにpinvoke LoadLibraryする必要があります:あなたのプログラムは、とにかく終了するまで

var mar = LoadLibrary("user32.dll"); 
s_MouseHookHandle = SetWindowsHookEx(
    WH_MOUSE_LL, 
    s_MouseDelegate, 
    mar, 
    0); 

にFreeLibraryを(コールする必要はありません)、そのモジュールがロードされたまま。

+0

Hansさん、ありがとうございました。私は問題を見つけることができたと付け加えたい。あなたのものは私が使用する解決策になりますが、あなたが望むならば私の新しい発見に関するあなたの考えを尋ねたいと思っています。問題は、自分のOSがWindows 7x64で、私のプロジェクトの 'Platform target'がx86に設定されていたことです。 'x64'や' Any CPU'のような他の選択肢は私のマシン上で動作しますが、あなたのソリューションは 'Platform target'に関係なく動作しますので、私の解決策ではC++で書かれたWin32プロジェクトがあるので、 WindowsXP、Vista、Windows 8などの他のOSであっても、あなたのソリューションは確実だと思いますか? – Mehran

+0

私は、Windowsのどのバージョンでも動作させることが目標だったと明示的に指摘しました。 –

+0

申し訳ありませんが、私はそれを逃した。どうもありがとうございます。 – Mehran

関連する問題