Forum

Пожалуйста or Регистрация для создания сообщений и тем.

Глобальные горячие клавиши (windows form)

Всем привет
Ребят может удалось кому-то реализовать глобальные горячие клавиши (это  когда программа реагирует на нажатие клавиш даже если она свернута).
Если можно скиньте пример приложения чтоб мне было легче разобраться, спасибо.

Приветствую.
А гуглить пробовали? Полно информации на тему с множеством вариантов реализаций.
Например, я таким пользовался

Adler
На самом деле я тоже  находил (на стаковерфлоу) но разобраться не смог, не мог-бы ты мне помочь  вот с вашим примером.
Создал я класс в своем приложении по вашей ссылке.
Мне надо допустим при нажатии (Alt+L) что-то выполнялось. Как мне это реализовать?

Цитата: Saintmedium от 10.05.2022, 18:53

Мне надо допустим при нажатии (Alt+L) что-то выполнялось. Как мне это реализовать?

Это низкоуровневый класс, ссылку на который я дал, вызывает событие при нажатие любой одной кнопки. Что бы работало сочетание, то нужно переделать функцию обработки события, где будет фиксировать предварительно нажатие первой кнопки, а потом второй и сопоставлять с нужным сочетанием.
На вскидку у меня такого готового решения нет, но находил такие на том же stackoverflow, где основной вопрос ставился именно как обработать сочетание клавиш.

P.S. Там же в комментариях есть ссылка на stackoverflow где это обсуждается и есть пример...

Решил перелопатив кучу тем. Может кому пригодиться, для визуализации киньте на форму 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) Метод интересная штука, надо побольше примеров найти его использования.

Я как раз сделал у себя предварительную версию этой функциональности(в будущем возможно будет доработана) в пэт-проекте 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, на формах чуть проще подписка.

Я всё ещё процессе активного обучения, поэтому там, с некой долей вероятности могут находится какие-то ошибки или не освобожденные ресурсы, проблемы с незнанием паттернов проектирования, и прочий оставшийся ненужный хлам.

P.S
Если будут вопросы, луче в Discord мне наберите кому хочется. А то что-то так лениво печатать...

Извините забыл поздороваться🤦‍♂️. Искренне приветствую 👋

admin отреагировал на эту запись.
admin