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

时间:2011-06-12 02:56:38

标签: windows exception uac

我需要制作一个系统键盘钩子来捕获所有用户输入。为避免此程序被标准用户杀死,正如本community中其他人所建议的那样,我做了“SetKernelObjectSecurity”。

问题是,一旦设置,我会在标准用户帐户中收到“访问被拒绝”异常,程序停止运行。我发现MSDN link说“如果进程在另一个用户的上下文中被提升或运行,则该属性可以抛出System.ComponentModel.Win32Exception,因为它会尝试打开进程”。但它没有提供解决方案。

我的程序是从标准用户帐户安装的,并以run as 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);

有人可以解释原因吗?

0 个答案:

没有答案