2010-11-26 8 views
1

мне нужен ACTIVEX, который обрабатывает глобальные горячие клавиши: Сдвиг + BГлобальная горячая клавиша не работает, даже если RegisterHotKey возвращает истину

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

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

Но я не вижу, чтобы какие-либо сообщения приходили к методу 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); 
} 

ответ

1

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

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

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

+0

Это потому, что я использую ActiveX? Есть ли решение? – michaels123 2010-11-27 01:00:51

0

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

Существует также проект Code Project, System Hot Keys, для этого в .NET.

Смежные вопросы