Как обойти исключение «Отказано в доступе», выданное Process.get_MainModule ()? - PullRequest
0 голосов
/ 12 июня 2011

Мне нужно сделать системную клавиатуру для захвата всех пользовательских вводов.Чтобы эта программа не была убита обычным пользователем, как предлагали другие в этом сообществе , я сделал "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);

Кто-нибудь может объяснить, почему?

...