Как реализовать глобальные горячие клавиши в C #? - PullRequest
1 голос
/ 10 декабря 2010

Мне нужно написать приложение, которое глобально перехватывает Alt + Shift + S.

Я создал библиотеку DLL, которая устанавливает глобальные хуки:

namespace Hotkeydll
{
    public class MyHotKey
    {
        public static void setHooks()
        {
            KeyboardHookProcedure = new HookProc(KeyboardHookProc);
            hKeyboardHook = SetWindowsHookEx(WH_KEYBOARD_LL, KeyboardHookProcedure, Marshal.GetHINSTANCE(Assembly.GetExecutingAssembly().GetModules()[0]), 0);
        }

        private int KeyboardHookProc(int nCode, Int32 wParam, IntPtr lParam)
        {
            //write something into file
        }


   }
}

Затем я создалПрограмма, которая загружает эту DLL и устанавливает хук:

using Hotkeydll;
namespace IWFHotkeyStarter
{
    class Program
    {
        static void Main(string[] args)
        {
            MyHotKey.setHooks();
        }
    }
}

Теперь проблема в том, что горячая клавиша не работает.

Похоже, что DLL не загружена в память постоянно.Я вижу, что могу удалить файл dll из файловой системы.

Поэтому, пожалуйста, сообщите, что я делаю неправильно?

Должен ли я использовать другой подход?

Спасибо.

Ответы [ 2 ]

1 голос
/ 10 декабря 2010

Ваш метод Main () устанавливает ловушки, затем немедленно завершает работу и завершает программу.Кроме того, вам нужен цикл сообщений, чтобы заставить перехватывать вызов.Для этого требуется приложение Windows Forms или WPF.Использование реальной горячей клавиши вместо хука теперь также становится опцией.Посмотрите в этой теме , например, C # находится ниже на странице.

0 голосов
/ 10 декабря 2010

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

Используйте RegisterHotkey всякий раз, когда это возможно.

...