SetWindowsHookEx возвращает ноль, если пользователь не имеет доступа к пути C: / Windows / Temp - PullRequest
1 голос
/ 04 июля 2019

У меня есть скрипт powershell, где я написал приведенный ниже код для получения хука. Но setwindowshookex возвращает ноль, если пользователь не имеет доступа к пути C: / Windows / Temp. если я даю доступ, то setwindowshookex возвращает целочисленное значение.

Я пытался передать GetCurrentThreadId () в качестве последнего параметра SetWindowsHookEx (int idHook, HookProc lpfn, IntPtr hMod, uint dwThreadId);

Add-Type @"
    using System;
    using System.Diagnostics;
    using System.Runtime.InteropServices;

    public static class NativeMethods{
        public static bool KeyEvent { get; set; }
        public static bool KeyEventPrevious { get; set; }
        public static System.Collections.Generic.List<bool> Buffer = new System.Collections.Generic.List<bool>();

        public delegate IntPtr LowLevelKeyboardProc(int nCode, IntPtr wParam, IntPtr lParam);

        private const int WH_KEYBOARD_LL = 13;
        private const int WM_KEYDOWN = 0x0100;

        public static HookProc hookProc = HookCallback;
        private static IntPtr hookId = IntPtr.Zero;

        public delegate IntPtr HookProc(int nCode, IntPtr wParam, IntPtr lParam);

        private static IntPtr HookCallback(int nCode, IntPtr wParam, IntPtr lParam) {
           if (nCode >= 0 && wParam == (IntPtr)WM_KEYDOWN) {
                KeyEvent = true;
            }
            else{
                KeyEvent = false;
            }
            if(KeyEvent != KeyEventPrevious){
                Buffer.Add(KeyEvent);
                KeyEventPrevious = KeyEvent;
            }
            return CallNextHookEx(hookId, nCode, wParam, lParam);
        }

        public static IntPtr GetHookId(HookProc hookProc){
            IntPtr moduleHandle = GetModuleHandle(Process.GetCurrentProcess().MainModule.ModuleName);
            return SetWindowsHookEx(WH_KEYBOARD_LL, hookProc, moduleHandle, GetCurrentThreadId());
        }

        [DllImport("user32.dll")]
        private static extern IntPtr CallNextHookEx(IntPtr hhk, int nCode, IntPtr wParam, IntPtr lParam);

        [DllImport("user32.dll")]
        private static extern IntPtr SetWindowsHookEx(int idHook, HookProc lpfn, IntPtr hMod, uint dwThreadId);

        [DllImport("kernel32.dll")]
        private static extern IntPtr GetModuleHandle(string lpModuleName);

        [DllImport("user32.dll")]
        private static extern bool UnhookWindowsHookEx(IntPtr hhk);

        [DllImport("kernel32.dll")]
        private static extern uint GetCurrentThreadId();
        $nativeMethodCode
    }
"@

Hookid необходим для мониторинга событий клавиатуры.

...