Как выполнить код при нажатии сочетания клавиш?
Когда пользователь нажимает на любую кнопку, она регистрируется в 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 клавиши. Была мысль вписать сумму кодов нажатой комбинации, но тогда программа ожидает нажатие совсем другой клавиши