Глобальные горячие клавиши (windows form)
Цитата: Удаленный пользователь от 10.05.2022, 18:20Всем привет
Ребят может удалось кому-то реализовать глобальные горячие клавиши (это когда программа реагирует на нажатие клавиш даже если она свернута).
Если можно скиньте пример приложения чтоб мне было легче разобраться, спасибо.
Всем привет
Ребят может удалось кому-то реализовать глобальные горячие клавиши (это когда программа реагирует на нажатие клавиш даже если она свернута).
Если можно скиньте пример приложения чтоб мне было легче разобраться, спасибо.
Цитата: Удаленный пользователь от 10.05.2022, 18:39Приветствую.
А гуглить пробовали? Полно информации на тему с множеством вариантов реализаций.
Например, я таким пользовался
Приветствую.
А гуглить пробовали? Полно информации на тему с множеством вариантов реализаций.
Например, я таким пользовался
Цитата: Удаленный пользователь от 10.05.2022, 18:53Adler
На самом деле я тоже находил (на стаковерфлоу) но разобраться не смог, не мог-бы ты мне помочь вот с вашим примером.
Создал я класс в своем приложении по вашей ссылке.
Мне надо допустим при нажатии (Alt+L) что-то выполнялось. Как мне это реализовать?
Adler
На самом деле я тоже находил (на стаковерфлоу) но разобраться не смог, не мог-бы ты мне помочь вот с вашим примером.
Создал я класс в своем приложении по вашей ссылке.
Мне надо допустим при нажатии (Alt+L) что-то выполнялось. Как мне это реализовать?
Цитата: Удаленный пользователь от 10.05.2022, 20:03Цитата: Saintmedium от 10.05.2022, 18:53Мне надо допустим при нажатии (Alt+L) что-то выполнялось. Как мне это реализовать?
Это низкоуровневый класс, ссылку на который я дал, вызывает событие при нажатие любой одной кнопки. Что бы работало сочетание, то нужно переделать функцию обработки события, где будет фиксировать предварительно нажатие первой кнопки, а потом второй и сопоставлять с нужным сочетанием.
На вскидку у меня такого готового решения нет, но находил такие на том же stackoverflow, где основной вопрос ставился именно как обработать сочетание клавиш.P.S. Там же в комментариях есть ссылка на stackoverflow где это обсуждается и есть пример...
Цитата: Saintmedium от 10.05.2022, 18:53Мне надо допустим при нажатии (Alt+L) что-то выполнялось. Как мне это реализовать?
Это низкоуровневый класс, ссылку на который я дал, вызывает событие при нажатие любой одной кнопки. Что бы работало сочетание, то нужно переделать функцию обработки события, где будет фиксировать предварительно нажатие первой кнопки, а потом второй и сопоставлять с нужным сочетанием.
На вскидку у меня такого готового решения нет, но находил такие на том же stackoverflow, где основной вопрос ставился именно как обработать сочетание клавиш.
P.S. Там же в комментариях есть ссылка на stackoverflow где это обсуждается и есть пример...
Цитата: Удаленный пользователь от 10.05.2022, 23:47Решил перелопатив кучу тем. Может кому пригодиться, для визуализации киньте на форму label элемент и потыкайте Альт+L или Альт+K
[spoiler title=""]using System; using System.Runtime.InteropServices; using System.Windows.Forms; namespace Hotkeys { public partial class Form1 : Form { [DllImport("user32.dll")] static extern bool RegisterHotKey(IntPtr hWnd, int id, uint KEY, Keys key); public const int KEY_ALT = 0x1; int x = 0; protected override void WndProc(ref Message m) { if (m.WParam.ToInt32() == 1000) { x++; label1.Text = x.ToString(); } if (m.WParam.ToInt32() == 1001) { x--; label1.Text = x.ToString(); } base.WndProc(ref m); } public Form1() { InitializeComponent(); RegisterHotKey(Handle, 1000, KEY_ALT, Keys.L); RegisterHotKey(Handle, 1001, KEY_ALT, Keys.K); } } }[/spoiler]
WndProc(Message) Метод интересная штука, надо побольше примеров найти его использования.
Решил перелопатив кучу тем. Может кому пригодиться, для визуализации киньте на форму label элемент и потыкайте Альт+L или Альт+K
using System;
using System.Runtime.InteropServices;
using System.Windows.Forms;
namespace Hotkeys
{
public partial class Form1 : Form
{
[DllImport("user32.dll")]
static extern bool RegisterHotKey(IntPtr hWnd, int id, uint KEY, Keys key);
public const int KEY_ALT = 0x1;
int x = 0;
protected override void WndProc(ref Message m)
{
if (m.WParam.ToInt32() == 1000)
{
x++;
label1.Text = x.ToString();
}
if (m.WParam.ToInt32() == 1001)
{
x--;
label1.Text = x.ToString();
}
base.WndProc(ref m);
}
public Form1()
{
InitializeComponent();
RegisterHotKey(Handle, 1000, KEY_ALT, Keys.L);
RegisterHotKey(Handle, 1001, KEY_ALT, Keys.K);
}
}
}
WndProc(Message) Метод
интересная штука, надо побольше примеров найти его использования.Цитата: Удаленный пользователь от 12.05.2022, 05:56Я как раз сделал у себя предварительную версию этой функциональности(в будущем возможно будет доработана) в пэт-проекте WPF. Я ссылки просто оставлю с указанием строк, а то вычленять сейчас у меня нет настроения.
[spoiler title="Не многомного лирики"]Сначала я пытался на основе библиотеки низкоуровневых хуков https://github.com/rvknth043/Global-Low-Level-Key-Board-And-Mouse-Hook . Проблема тут в том, что низкоуровневый хук мыши хоть исправно и работает, делает почти невозможной отладку в студии. Я отложил эту библиотеку вместе с клавиатурным хуком. Думал что нашёл панацею, в виде RawInput, а конкретно в виде библиотеки RawinputSharp https://github.com/mfakane/rawinput-sharp/. Она обрабатывает ввод асинхронно, и даже с разных устройств, например в виде двух подключенных клавиатур. Я начал основе этой библиотеки реализовывать функционал. Реализовал класс обработчик клавиатурного ввода. Класс который хранит Task-и, т.е. в этом классе можно зарегистрировать комбинацию для вызова функций. А потом, я понял, =) что профукал один ключевой момент. Я вообще-то хотел реализовать функциональность, как у и системного инструмента Snipping tool(ножницы в win10), т.е. при нажатии комбинации клавиш Win + Shif + S в окно ввода не печатается буква S. А у меня разумеется печаталось. И это возможно перехватить только хуком клавиатурного ввода, что бы обработать до того, как его успеет обработать активное окно. Соответственно так и родился гибрид. RawInput + хук(Который я переписал под свои нужды,на основе первой библиотеки). Я подписываюсь на хук в момент ожидания последний клавиши в комбинации. Затем если пришла нужная клавиша не передаю её в активное окно, и отписываюсь.
Вероятно стоило бы рассмотреть возможность использования хука клавиатуры для общей обработки клавиатурного ввода. А мышь соответственно оставить RawInput. Что есть, то есть.
[/spoiler]Теперь просто ссылки в удобном мне порядке:
1. Подписка окна WPF на обработку событий событий окна. Мой Git проект (строка 139-175)(219-229 это как выглядит подписка на обратный вызов функции(Должно переехать в адекватное место))
2. Базовый класс по обработки нажатия клавиши RawInput Мой Git проект
3. Enum клавиш Мой Git проект
4. Класс хука клавиатуры Мой Git проект
5. Класс обработчик обратного вызова функций Мой Git проектВот так примерно выглядит концепция обработки, в контексте окна WPF, на формах чуть проще подписка.
Я всё ещё процессе активного обучения, поэтому там, с некой долей вероятности могут находится какие-то ошибки или не освобожденные ресурсы, проблемы с незнанием паттернов проектирования, и прочий оставшийся ненужный хлам.
[spoiler title="P.S"]Если будут вопросы, луче в Discord мне наберите кому хочется. А то что-то так лениво печатать... [/spoiler]
Я как раз сделал у себя предварительную версию этой функциональности(в будущем возможно будет доработана) в пэт-проекте WPF. Я ссылки просто оставлю с указанием строк, а то вычленять сейчас у меня нет настроения.
Сначала я пытался на основе библиотеки низкоуровневых хуков https://github.com/rvknth043/Global-Low-Level-Key-Board-And-Mouse-Hook . Проблема тут в том, что низкоуровневый хук мыши хоть исправно и работает, делает почти невозможной отладку в студии. Я отложил эту библиотеку вместе с клавиатурным хуком. Думал что нашёл панацею, в виде RawInput, а конкретно в виде библиотеки RawinputSharp https://github.com/mfakane/rawinput-sharp/. Она обрабатывает ввод асинхронно, и даже с разных устройств, например в виде двух подключенных клавиатур. Я начал основе этой библиотеки реализовывать функционал. Реализовал класс обработчик клавиатурного ввода. Класс который хранит Task-и, т.е. в этом классе можно зарегистрировать комбинацию для вызова функций. А потом, я понял, =) что профукал один ключевой момент. Я вообще-то хотел реализовать функциональность, как у и системного инструмента Snipping tool(ножницы в win10), т.е. при нажатии комбинации клавиш Win + Shif + S в окно ввода не печатается буква S. А у меня разумеется печаталось. И это возможно перехватить только хуком клавиатурного ввода, что бы обработать до того, как его успеет обработать активное окно. Соответственно так и родился гибрид. RawInput + хук(Который я переписал под свои нужды,на основе первой библиотеки). Я подписываюсь на хук в момент ожидания последний клавиши в комбинации. Затем если пришла нужная клавиша не передаю её в активное окно, и отписываюсь.
Вероятно стоило бы рассмотреть возможность использования хука клавиатуры для общей обработки клавиатурного ввода. А мышь соответственно оставить RawInput. Что есть, то есть.
Теперь просто ссылки в удобном мне порядке:
1. Подписка окна WPF на обработку событий событий окна. Мой Git проект (строка 139-175)(219-229 это как выглядит подписка на обратный вызов функции(Должно переехать в адекватное место))
2. Базовый класс по обработки нажатия клавиши RawInput Мой Git проект
3. Enum клавиш Мой Git проект
4. Класс хука клавиатуры Мой Git проект
5. Класс обработчик обратного вызова функций Мой Git проект
Вот так примерно выглядит концепция обработки, в контексте окна WPF, на формах чуть проще подписка.
Я всё ещё процессе активного обучения, поэтому там, с некой долей вероятности могут находится какие-то ошибки или не освобожденные ресурсы, проблемы с незнанием паттернов проектирования, и прочий оставшийся ненужный хлам.
Цитата: Удаленный пользователь от 12.05.2022, 06:43Извините забыл поздороваться🤦♂️. Искренне приветствую 👋
Извините забыл поздороваться🤦♂️. Искренне приветствую 👋