Как выполнить код при нажатии сочетания клавиш?

Когда пользователь нажимает на любую кнопку, она регистрируется в textBox1 в виде KeyValue и кнопка отображается в виде цифр, это обязательное условие потому что программа использует Keyboard Hooks и принимает кнопку только в виде Int.

Я пробовал это - https://stackoverflow.com/questions/53679937/c-sharp-listening-to-keyboard-combination

Самый первый ответ

но мне нужно для диапазона клавиш (A-Z, D0-D9, F1-F12 и.т.д)

Hooks.cs

 public class Hook : IDisposable
{
    #region Declare WinAPI functions
    [DllImport("kernel32.dll")]
    private static extern IntPtr LoadLibrary(string lpFileName);

    [DllImport("user32.dll")]
    private static extern IntPtr SetWindowsHookEx(int idHook, KeyboardHookProc callback, IntPtr hInstance, uint threadId);
    [DllImport("user32.dll")]
    private static extern IntPtr CallNextHookEx(IntPtr idHook, int nCode, int wParam, IntPtr lParam);
    [DllImport("user32.dll")]
    private static extern bool UnhookWindowsHookEx(IntPtr hInstance);
    #endregion
    #region Constants
    private const int WH_KEYBOARD_LL = 13;
    private const int WH_KEYDOWN = 0x0100;
    #endregion

    // код клавиши на которую ставим хук
    public int _key;
    public event KeyPressEventHandler KeyPressed;

    private delegate IntPtr KeyboardHookProc(int code, IntPtr wParam, IntPtr lParam);
    private KeyboardHookProc _proc;
    private IntPtr _hHook = IntPtr.Zero;

    public Hook(int keyCode)
    {
        _key = keyCode;
        _proc = HookProc;
    }

    public void SetHook()
    {
        var hInstance = LoadLibrary("User32");
        _hHook = SetWindowsHookEx(WH_KEYBOARD_LL, _proc, hInstance, 0);
    }

    public void Dispose()
    {
        UnHook();
    }

    public void UnHook()
    {
        UnhookWindowsHookEx(_hHook);
    }

    private IntPtr HookProc(int code, IntPtr wParam, IntPtr lParam)
    {
        if ((code >= 0 && wParam == (IntPtr)WH_KEYDOWN) && Marshal.ReadInt32(lParam) == _key)
        {

            // бросаем событие
            if (KeyPressed != null)
            {
                KeyPressed(this, new KeyPressEventArgs(Convert.ToChar(code)));
            }
        }

        // пробрасываем хук дальше
        return CallNextHookEx(_hHook, code, (int)wParam, lParam);
    }
}}

Form1.cs textbox1.KeyUp метод

 public void textBox1_KeyUp(object sender, KeyEventArgs e)
    {

        #region Cистема биндов
        if (Keys.A <= e.KeyCode && e.KeyCode <= Keys.Z)
        {//Character keys
            string forlabel1 = e.KeyData.ToString();
            string _output = e.KeyValue.ToString();
            textBox1.Text = _output; //Key convert from char to int c#
            label1.Text = forlabel1;
        }
        if (Keys.F1 <= e.KeyCode && e.KeyCode <= Keys.F12)
        { //func keys (F)
            //textBox1.Text = e.KeyCode.ToString();
            string forlabel1 = e.KeyData.ToString();
            string _output = e.KeyValue.ToString();
            textBox1.Text = _output;
            label1.Text = forlabel1;
        }
        if (Keys.D0 <= e.KeyCode && e.KeyCode <= Keys.D9)
        { //number keys
            //textBox1.Text = e.KeyCode.ToString().Replace("D", null);
            string forlabel1 = e.KeyData.ToString().Replace("D", "Цифра ");
            string _output = e.KeyValue.ToString();
            textBox1.Text = _output;
            label1.Text = forlabel1;
        }
       
        if (textBox1.TextLength >= 1)
        {
            button2.Enabled = true;
        }

        #endregion
    }

Метод который по нажатию кнопки регистрирует клавишу (получает из textBox1 код клавиши в виде string и переводит в Int

private void button2_Click(object sender, EventArgs e)
    {
        textBox1.Enabled = false;

        string keystring = textBox1.Text;
        int keyspecial = Int32.Parse(keystring);


        keybd_event(0x90, 0x45, 0x1, (UIntPtr)0);
        _hook = new Hook(keyspecial);
        _hook.KeyPressed += new KeyPressEventHandler(_hook_KeyPressedBind);
        _hook.SetHook();

    }

string _output = e.KeyValue.ToString(); записывает в переменную код нажатой кнопки в виде числа чтобы записать число в textBox, перевёл в string потому что нельзя int выводить в textBox. В button2_Click из textbox получается переменная keystring, можно было-бы использовать старую переменную, но программа не разрешает, пробовал изменить private на public проблема с переменной осталась, keystring мы переводим в Int, и записываем в аргументы конструктора Hook (из класса Hook.cs) полученную и переведённую в int новую переменную (бывшую keystring) keyspecial.

Таким образом одна кнопка у нас запишется без проблем, но вот сочетание клавиш, их коды просто не поместятся в один аргумент конструктора, ведь были же нажаты всего 2 клавиши. Была мысль вписать сумму кодов нажатой комбинации, но тогда программа ожидает нажатие совсем другой клавиши


Ответы (0 шт):