none
Windows Events mit WPF abfangen? RRS feed

  • Allgemeine Diskussion

  • Ich muss (leider) auf sehr viele Windows-Events achten, unter anderem WM_KEYDOWN und WM_DESTROY. Ich wollte dazu eine eigene Klasse dafür schreiben:
            class WinEvent
            {
                public WinEvent(IntPtr Handle)
                {
                    _Handle = Handle;
                    HwndSource source = HwndSource.FromHwnd(Handle);
                    source.AddHook(new HwndSourceHook(WndProc));
                }
    ...
    
                private static IntPtr WndProc(IntPtr hwnd, int msg, IntPtr wParam, IntPtr lParam, ref bool handled)
                {
                    switch(msg)
                    {
                        case (int)WinMsg.WM_DESTROY:
                            if (WM_DESTROY != null)
                                WM_DESTROY(this, new EventArgs());
                            break;
                        case (int)WinMsg.WM_KEYDOWN:
                            if (WM_KEYDOWN != null)
                                WM_KEYDOWN(this, new LParamEventArgs(lParam));
                            break;
                    }
    
                    return IntPtr.Zero;
                }
                public event EventHandler<EventArgs> WM_DESTROY;
                public event EventHandler<LParamEventArgs> WM_KEYDOWN;
            }
    Testweise habe ich mir eine Anwendung erstellt, die auf das WM_KEYDOWN Ereignis hören soll:
            WinEvent wEvent;
            public MainWindow()
            {
                InitializeComponent();
            }
    
            private void OnLoaded(object sender, RoutedEventArgs e)
            {
                wEvent = new WinEvent(new WindowInteropHelper(Application.Current.MainWindow).Handle);
                wEvent.WM_KEYDOWN += new EventHandler<LParamEventArgs>(wEvent_WM_KEYDOWN);
            }
    
            void wEvent_WM_KEYDOWN(object sender, LParamEventArgs e)
            {
                MessageBox.Show("WM_KEYDOWN");
            }
        }
    Das Event wird jedoch, immer nur dann ausgelöst, wenn mein Fenster den Focus hat. Aber ich muss ja auch die Events von anderen Fenstern empfangen. Was mache ich falsch???
    Freitag, 18. Mai 2012 12:20

Alle Antworten