2009-10-22 8 views
0

Soupir, j'ai du code de codeproject (http://www.codeproject.com/KB/cs/globalhook.aspx) pour accrocher les événements globaux du clavier et de la souris. Tout à coup, maintenant, quand j'ai installé la version bêta 2 de Visual Studio 2010 et .NET Framework 4.0 i breaks à ce code:Echec de SetWindowsHookEx sur bêta2 x64

  hKeyboardHook = SetWindowsHookEx(
       WH_KEYBOARD_LL, 
       KeyboardHookProcedure, 
       Marshal.GetHINSTANCE(
       Assembly.GetExecutingAssembly().GetModules()[0]), 
       0); 

Oh, et je suis en cours d'exécution sur une machine X64. Quelqu'un sait-il comment contourner cela? Pas une solution facile, je sais ..

+0

Pause = crash ou crochet NULL ou ...? – popester

+0

Vous obtenez une erreur de compilation sur ce code ci-dessus? Qu'Est-ce que c'est? –

+0

n'est pas une erreur en soi, hKeyboardHook est défini sur 0 et Marshal.GetLastWin32Error(); est également mis à 0. Un autre utilisateur obtient un "code d'erreur # 87 (-2147467259) est passé à Win32Exception, et il échoue avec une erreur" paramètre incorrect "là." Mais pas moi curieusement: / – Homde

Répondre

0

Juste fait cela pour mon projet récemment. Cela fonctionne comme un charme) Je suis presque sûr qu'il s'agit de 2ème et 3ème arguments.

1 enveloppement KeyboardHookProcedure() comme ceci:

//declate delegate type: 
public delegate int HookProc(int nCode, int wParam, IntPtr lParam); 

//use a class member of this type and inject your callback into 
m_hookproc = new HookProc(HookCallbackProcedure); 

2 pour le 3ème argument:

IntPtr hInstance = GetModuleHandle(Process.GetCurrentProcess().MainModule.ModuleName); 

3 être prudent avec Marshal.GetLastWin32Error(), vous devez utiliser strictement après la méthode vérifier les erreurs. (see this fxcop rule)

l'image entière ressemble alors à ceci:

IntPtr hInstance = GetModuleHandle(Process.GetCurrentProcess().MainModule.ModuleName); 
IntPtr handle = SetWindowsHookEx( WH_KEYBOARD_LL, m_hookproc, hInstance, 0); 
if (handle == IntPtr.Zero) 
{ 
    int error = Marshal.GetLastWin32Error(); 
    //log the error or whatever 
} 

si c'est tout)

0

Laissez le paramètre Instance 0. Semble XP nécessite, mais ne marche pas win7.

hKeyboardHook = SetWindowsHookEx(
       WH_KEYBOARD_LL, 
       KeyboardHookProcedure, 
       0, 
       0);