2010-11-26 5 views
1

ich eine activeX brauchen die globalen Hotkey Griffe: Shift- + BGlobale Hotkey funktioniert nicht, obwohl RegisterHotKey true zurück

Der folgende Code soll, dies tun, wenn ich dieses ActiveX von IE nennen.

Ich sehe das Ergebnis von RegisterHotKey ist wahr, was bedeutet, dass der Hotkey ok registriert wurde.

Aber ich sehe nicht, dass Nachrichten an die ThreadPreprocessMessage-Methode kommen. Warum?

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); 
} 

Antwort

1

Sie versuchen, einen Hotkey in einem Fenster zu installieren, das zu einem anderen Prozess gehört. Die Dokumentation für RegisterHotKey() sagt:

Diese Funktion ist nicht einen heißen Schlüssel mit einem Fenster erstellt von einem anderen Thread zuordnen kann.

Es nicht einmal mit mehreren Threads im gleichen Prozess funktioniert, so kann es mit Fäden aus anderen Prozessen unmöglich funktionieren.

+0

Ist das, weil ich ActiveX verwende? Gibt es eine Lösung? – michaels123

0

RegisterHotKey() ist nur für Anwendungs-Hotkeys, das sind Tastenkombinationen in einem bestimmten Fenster. Globale Hotkeys sind unterschiedlich registriert - siehe Hot Key Controls.

Es gibt auch ein Projekt auf Code-Projekt, System Hot Keys, um das in .NET zu tun.