none
Windows Events abfangen RRS feed

  • Frage

  • Ich muss ein bestimmtes Event abfangen, das von Windows gesendet wird, also muss ich ja einige Funktionen überschreiben. Ich habe nun folgenden Code:
        [DllImport("User32.dll")]
        protected static extern int SetClipboardViewer(int hWndNewViewer);
    
        [DllImport("User32.dll", CharSet = CharSet.Auto)]
        public static extern bool ChangeClipboardChain(IntPtr hWndRemove, IntPtr hWndNewNext);
    
        [DllImport("user32.dll", CharSet = CharSet.Auto)]
        public static extern int SendMessage(IntPtr hwnd, int wMsg, IntPtr wParam, IntPtr lParam);
    Und die überschreibungen:
        protected override void WndProc(ref System.Windows.Forms.Message m)
        {
    ...
    So da ich die Ereignisse für die Zwischenablage haben will, brauche ich das Handle:
        IntPtr nextClipboardViewer;
    
        //Konstruktor
        nextClipboardViewer = (IntPtr)SetClipboardViewer((int)this.Handle);
    
    In WindowsForms kein Problem, ich muss das aber in einer DLL machen. Wie kann ich es das da realisieren, das  ich das Handle bekomme, sodass es funktioniert?


    Koopakiller - http://koopakiller.ko.ohost.de/

    Samstag, 17. März 2012 17:32
    Moderator

Antworten

  • Hallo Koopakiller,

    mal abgesehen von den Fensterklassen verfügen WPF Controls über kein Handle mehr. Und auch bei der Fensterklasse muss man eine Helperklasse (System.Windows.Interop.WindowInteropHelper) bemühen um an das Handle zu kommen.

    IntPtr windowHandle = new WindowInteropHelper(Application.Current.MainWindow).Handle;

    Wenn du ein Handle für ein Controls benötigst, könntest Versuchen mittels des WindowsFormsHost ein WindowForms Control in deine Applikation einzubauen. Ich habe es selbst zwar noch nicht getestet, dürfte aber funktionieren...

    Viele Grüße
    Holger M. Rößler


    Kaum macht man es richtig, schon funktioniert es


    Sonntag, 18. März 2012 21:08
  • Hallo

    Eine DLL hat zwar - wie die Kollegen angemerkt haben - ein ModuleHandle.
    Wenn Du eine Windows-Messageschleife  "subclassen" bzw "Hooken" willst brauchst Du aber definitiv ein Window-Handle und einen WndProc Callback.
    Das Window-Handle bekommst Du, wie Holger es gezeigt hat, mit dem WindowInteropHelper.
    Wenn der Subclassing-Code in eine managed DLL ausgelagert ist, musst Du eben das Handle des Windows als IntPtr übergeben (alternativ kannst Du auch das Window selbst übergeben und auf der DLL-Seite das Handle als IntPtr holen).

    Was WPF (im Gegensatz zu WinForms) nicht bietet ist ein override für WndProc.
    Das ist aber dennoch nicht so kompliziert wie man denkt, Du brauchst nur eine statische Methode mit der passenden Signatur.

    Kleines Beispiel hier:
    http://blogs.msdn.com/b/nickkramer/archive/2006/03/18/554235.aspx

    HTH
    Christoph

    Sonntag, 1. April 2012 09:27

Alle Antworten