Горячие клавиши с удерживаемыми клавишами перед регистрацией - PullRequest
0 голосов
/ 18 апреля 2020

этот код регистрирует много горячих клавиш
, когда пользователь нажимает их ... эта программа связывает это, а затем повторно отправляет эту горячую клавишу для программ, которые хотят связать

(если есть другой способ, скажите мне, как)

давайте возьмем такой сценарий:
удерживайте пользователя клавишу 'shift' и нажмите '1' , когда он откроет блокнот
привязка моей программы что:
- незарегистрированная горячая клавиша
- отправить 'shift' + '1' для блокнота
- зарегистрируйте горячие клавиши
пользователь все еще удерживает клавишу «Shift» и нажимает «1»
здесь windows не отправляет мне эти клавиши, потому что клавиша «Shift» была удержана до регистрации (моя программа не регистрируется, а затем повторно регистрирует горячие клавиши)
, но если пользователь не удерживает клавишу 'shift' , нажмите 'shift' + '1' .... отлично работает
так как я могу решить эту проблему

        [System.Runtime.InteropServices.DllImport("user32.dll")]
        private static extern bool RegisterHotKey(IntPtr hWnd, int id, int fsModifiers, int vk);

        [System.Runtime.InteropServices.DllImport("user32.dll")]
        private static extern bool UnregisterHotKey(IntPtr hWnd, int id);

        private void Reg()            //Reg all Hotkeys
        {
            int id = 0;
            foreach (var item1 in Program.Allsh1)//contain 'alt' 'ctrl' 'shift'
                foreach (var item2 in Program.Allsh2)//contain ather keys (F1 -> F9) and (1 ->8) for example
                    RegisterHotKey(this.Handle, id++, item1.Value, item2.Value);
        }

        private void UnReg()            //unReg all Hotkeys
        {
            int i = Program.Allsh1.Count * Program.Allsh2.Count - 1;
            while (i>=0)
            {
                UnregisterHotKey(this.Handle, i--);
            }
        }

        protected override void WndProc(ref Message m)//hotkey bind pressed      //windows callback
        {
            if (m.Msg != 0x0312)
                goto Exit;

            int id = m.WParam.ToInt32();
            int sh1N = ((int)m.LParam & 0xFFFF);//return 1 for 'alt' ,2 for 'ctrl' or 4 for 'shift' otherwise -1 
            int sh2N = (((int)m.LParam >> 16) & 0xFFFF);

            string sh1 = KeyConvert.ToName(sh1N);//return 'alt' or 'ctrl' or 'shift' otherwise null
            string sh2 = KeyConvert.ToName(sh2N);//return key definition in hex for known keys otherwise null

            if (sh1 == null || sh2 == null)
            {
                Debug.WriteLine(string.Format("error at figure key : {0} + {1}", sh1N.ToString(), sh2.ToString()));
                goto Exit;
            }

            string tmp;
            if (sh1N == 1)//alt
                tmp = "%";
            else if (sh1N == 2)//ctrl
                tmp = "^";
            else if (sh1N == 4)//shift
                tmp = "+";
            else goto Exit;

            tmp = tmp + "({" + sh2 + "})";

            UnReg();//unregister hot key
            SendKeys.SendWait(tmp);//send same keys again for ( windows or active program)
            Reg();//re register for hotkeys

            Exit:
            base.WndProc(ref m);
        }

Я пытаюсь это сделать:

        UnReg();//unregister hot key
        SendKeys.SendWait(tmp);//send same keys again for ( windows or active program)
        Reg();//re register for hotkeys
        SendKeys.SendWait('shift up');
        SendKeys.SendWait('shift down');

но windows не знал, что 'сдвиг вверх' и вниз
есть еще или способ к этому?

...