我需要制作一个系统键盘钩子来捕获所有用户输入。为避免此程序被标准用户杀死,正如本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);
有人可以解释原因吗?