Мне нужно сделать системную клавиатуру для захвата всех пользовательских вводов.Чтобы эта программа не была убита обычным пользователем, как предлагали другие в этом сообществе , я сделал "SetKernelObjectSecurity".
Проблема в том, что, как только это установлено, я получаю исключение «Доступ запрещен» в стандартной учетной записи пользователя, и программа останавливается.Я нашел ссылку MSDN , в которой говорится, что «это свойство может вызвать исключение System.ComponentModel.Win32Exception, если процесс повышен или работает в контексте другого пользователя, так как он пытается открыть процесс».Но это не предлагало решения.
Моя программа устанавливается из стандартной учетной записи пользователя с опцией запуска от имени администратора.После установки он запускается автоматически при входе в систему обычного пользователя. На самом деле, когда я это пробовал, я также получил ту же ошибку из своей учетной записи администратора, что полностью смутило меня.Ваша помощь очень приветствуется.
РЕДАКТИРОВАТЬ: Я думаю, я нашел причину этого исключения: именно в том, как регистрируется ловушка.Это был мой исходный код, который выдает при вызове 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);
Кто-нибудь может объяснить, почему?