如何解决由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);
有人可以解释为什么吗?
没有找到相关结果
已邀请:
0 个回复