SetWindowsHookEx retorna 0 ao compilar para a estrutura .NET 4.0 em máquinas de 32 bits

Estou tentando definir um gancho de teclado de baixo nível do Windows para pegar três teclas pressionadas, mesmo se o aplicativo não estiver em foco. Para fazer isso, estou chamando SetWindowsHookEx como

// Create an instance of HookProc.
KeyboardHookProcedure = new HookProc(KeyboardHookProc);
//install hook
hKeyboardHook = SetWindowsHookEx(
    WH_KEYBOARD_LL,
    KeyboardHookProcedure,
    Marshal.GetHINSTANCE(
        Assembly.GetExecutingAssembly().GetModules()[0]),
    0);
//If SetWindowsHookEx fails.
if (hKeyboardHook == 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
    Stop(false, true, false);
    //Initializes and throws a new instance of the Win32Exception class with the specified error. 
    throw new Win32Exception(errorCode);
}

Isso costumava funcionar em máquinas de 32 bits e 64 bits usando o .NET Framework 3.5, mas após a atualização para o .NET Framework 4.0 parou de funcionar em máquinas de 32 bits.

Alguém sabe como resolver isso para que eu possa usar o Framework 4.0 e fazer esse trabalho em máquinas de 32 bits e 64 bits?

questionAnswers(4)

yourAnswerToTheQuestion