Глобальная горячая клавиша не работает, хотя RegisterHotKey возвращает true - PullRequest
1 голос
/ 27 ноября 2010

Мне нужен ActiveX, который обрабатывает глобальные горячие клавиши: Shift + B

Код ниже должен делать это, когда я вызываю этот ActiveX из IE.

Я вижу, что результат RegisterHotKey равен true, что означает, что горячая клавиша была зарегистрирована в порядке.

Но я не вижу, чтобы какие-либо сообщения приходили в метод ThreadPreprocessMessage. Зачем?

namespace Kosmala.Michal.ActiveXTest{
    public class ActiveXObject : NativeWindow, IDisposable {
        public const int WM_HOTKEY = 0x0312;
        private IntPtr pFoundWindow ;

        public ActiveXObject(){
            System.Windows.MessageBox.Show("constructor<<");
            Process[] processes = Process.GetProcessesByName("iexplore");
            foreach (Process p in processes){
                pFoundWindow = p.MainWindowHandle;
            }
            System.Windows.MessageBox.Show("pFoundWindow:" + pFoundWindow);
            SetupHotKey(pFoundWindow);
            ComponentDispatcher.ThreadPreprocessMessage += ComponentDispatcher_ThreadPreprocessMessage;
            System.Windows.MessageBox.Show("constructor>>");
        }

        void ComponentDispatcher_ThreadPreprocessMessage(ref MSG msg, ref bool handled){
            System.Windows.MessageBox.Show("inside handler");
            if (msg.message == WM_HOTKEY){
                System.Windows.MessageBox.Show("inside handler");
            }
        }

        private void SetupHotKey(IntPtr handle){
            bool res = RegisterHotKey(handle, GetType().GetHashCode(), 0x0004, 0x42); //Shift + b
            System.Windows.MessageBox.Show("SetupHotKey res:"+res);
        }

        public void Dispose(){
            UnregisterHotKey(_host.Handle, GetType().GetHashCode());
        }

        [DllImport("user32.dll")]
        [return: MarshalAs(UnmanagedType.Bool)]
        public static extern bool RegisterHotKey(IntPtr hWnd, int id, int fsModifiers, int vlc);

        [DllImport("user32.dll")]
        [return: MarshalAs(UnmanagedType.Bool)]
        public static extern bool UnregisterHotKey(IntPtr hWnd, int id);
}

Ответы [ 2 ]

1 голос
/ 27 ноября 2010

Вы пытаетесь установить горячую клавишу в окне, которое принадлежит другому процессу.Документация для RegisterHotKey () гласит:

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

Это не 'он даже не может работать с несколькими потоками в одном и том же процессе, поэтому он не может работать с потоками из других процессов.

0 голосов
/ 27 ноября 2010

RegisterHotKey () предназначен только для горячих клавиш приложения, то есть сочетаний клавиш в конкретном окне.Глобальные горячие клавиши регистрируются по-разному - см. Элементы управления горячими клавишами .

Существует также проект в Code Project, Горячие клавиши системы , для этого в .NET.

...