1

グローバルホットキーを処理するactiveXが必要です: Shift+B

以下のコードは、IE からこの ActiveX を呼び出すときにこれを行うことになっています。

is trueの結果が表示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);
}
4

2 に答える 2

1

別のプロセスに属するウィンドウにホットキーをインストールしようとしています。RegisterHotKey()のドキュメントには次のように書かれています。

この関数は、別のスレッドによって作成されたウィンドウにホット キーを関連付けることはできません。

同じプロセス内の複数のスレッドでも機能しないため、他のプロセスのスレッドでは機能しない可能性があります。

于 2010-11-26T23:29:10.160 に答える
0

RegisterHotKey()は、特定のウィンドウのショートカットキーであるアプリケーションホットキー専用です。グローバルホットキーは異なる方法で登録されます-ホットキーコントロールを参照してください。

.NETでそれを行うためのCodeProject 、SystemHotKeysに関するプロジェクトもあります。

于 2010-11-27T03:47:07.577 に答える