如何解决由Process.get_MainModule()引发的“访问被拒绝”异常?

| 我需要制作一个系统键盘挂钩来捕获所有用户输入。为了避免该程序被标准用户杀死,正如该社区的其他人所建议的那样,我做了“ SetKernelObjectSecurity”。 问题是,一旦设置了此权限,我就会在标准用户帐户中遇到“拒绝访问”异常,并且程序停止运行。我找到了一个MSDN链接,上面写着“如果进程被提升或在另一个用户的上下文中运行,则该属性可能引发System.ComponentModel.Win32Exception,因为它将尝试打开该进程”。但是它没有提供解决方案。 我的程序是从标准用户帐户安装的,并以admin身份运行。安装后,它会在标准用户登录后自动启动。实际上,当我尝试使用它时,我也从管理员帐户中收到了相同的错误,这完全使我感到困惑。非常感谢您的帮助。 编辑: 我想我发现了此异常的原因:这是挂钩的注册方式。这是我的初始代码,它引发了currentProcess.MainModule调用:
    private IntPtr RegisterHook(KeyboardHookProc hook) 
    { 
        IntPtr handle = IntPtr.Zero; 
        using (Process currentProcess = Process.GetCurrentProcess())     
        using (ProcessModule currentModule = currentProcess.MainModule) 
        { 
             IntPtr module = GetModuleHandle(currentModule.ModuleName);
            handle = SetWindowsHookEx(WH_KEYBOARD_LL, hook, module, 0); 
        } 
        return handle; 
    }
当我用以下两行替换此函数时,异常似乎消失了:
        IntPtr hInstance = LoadLibrary(\"user32\");
        _hookHandle = SetWindowsHookEx(WH_KEYBOARD_LL, _hookProc, hInstance, 0);
有人可以解释为什么吗?     
已邀请:

要回复问题请先登录注册