Отключить определенные c ключи при обнаружении указанного c процесса C# - PullRequest
0 голосов
/ 09 мая 2020

Я пытаюсь отключить определенные c ключи, когда обнаружен определенный c процесс, но по какой-то причине он не установил ловушку правильно, поэтому он не работает.

Код должен работать :

  1. Определить, был ли обнаружен notepad.exe (функция уже закодирована, но я не писал ее здесь).
  2. Теперь из потока проверки он запустит поток обработчика, который реализует низкоуровневый обработчик клавиатуры, чтобы предотвратить использование пользователем определенных c ключей в целевом процессе.

вот код, который я использую:

     [StructLayout(LayoutKind.Sequential)]
        private struct KBDLLHOOKSTRUCT
        {
            public Keys key;
            public int scanCode;
            public int flags;
            public int time;
            public IntPtr extra;
        }

        //System level functions to be used for hook and unhook keyboard input
        private delegate IntPtr LowLevelKeyboardProc(int nCode, IntPtr wParam, IntPtr lParam);
        [DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)]
        private static extern IntPtr SetWindowsHookEx(int id, LowLevelKeyboardProc callback, IntPtr hMod, uint dwThreadId);
        [DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)]
        private static extern bool UnhookWindowsHookEx(IntPtr hook);
        [DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)]
        private static extern IntPtr CallNextHookEx(IntPtr hook, int nCode, IntPtr wp, IntPtr lp);
        [DllImport("kernel32.dll", CharSet = CharSet.Auto, SetLastError = true)]
        private static extern IntPtr GetModuleHandle(string name);
        [DllImport("user32.dll", CharSet = CharSet.Auto)]
        private static extern short GetAsyncKeyState(Keys key);


        //Declaring Global objects
        private static IntPtr ptrHook;
        private static LowLevelKeyboardProc objKeyboardProcess;

        private const int WH_KEYBOARD_LL = 13;
        private const int VK_CONTROL = 0x11;
 public void Control()
        {
            MessageBox.Show("Control thread has been started");
            ProcessModule objCurrentModule = Process.GetProcessesByName("notepad")[0].MainModule;
            objKeyboardProcess = new LowLevelKeyboardProc(captureKey);
            SetWindowsHookEx(13, objKeyboardProcess, GetModuleHandle(objCurrentModule.ModuleName), 0);

        }

        public static IntPtr captureKey(int nCode, IntPtr wp, IntPtr lp)
        {
            if (nCode >= 0)
            {
                KBDLLHOOKSTRUCT objKeyInfo = (KBDLLHOOKSTRUCT)Marshal.PtrToStructure(lp, typeof(KBDLLHOOKSTRUCT));
                    MessageBox.Show("ncode >=0 !");





   if (objKeyInfo.key == Keys.G || objKeyInfo.key == Keys.H  || objKeyInfo.key == Keys.S) // Disabling Windows keys
                    {
                        MessageBox.Show("One of the specific keys has been detected!");
                        return (IntPtr)1;
                    }
                }
                return CallNextHookEx(ptrHook, nCode, wp, lp);
            }

            public static void Dispose()
            {
                UnhookWindowsHookEx(ptrHook);
            }
            public static void Hide()
            {

                ProcessModule objCurrentModule = Process.GetCurrentProcess().MainModule;
                objKeyboardProcess = new LowLevelKeyboardProc(captureKey);
                ptrHook = SetWindowsHookEx(13, objKeyboardProcess, GetModuleHandle(objCurrentModule.ModuleName), 0);


            }
     public Form1()
        {
            InitializeComponent();
                    Thread cont = new Thread(Control);
        cont.start();
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...