Benutzer mit den meisten Antworten
Windows Events abfangen

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/
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
- Bearbeitet Holger M. Rößler Sonntag, 18. März 2012 21:11 Add Code
- Als Antwort vorgeschlagen Robert BreitenhoferModerator Donnerstag, 22. März 2012 13:00
- Als Antwort markiert Robert BreitenhoferModerator Freitag, 23. März 2012 16:22
- Tag als Antwort aufgehoben Robert BreitenhoferModerator Montag, 26. März 2012 07:00
- Als Antwort markiert Tom Lambert (Koopakiller)Moderator Sonntag, 1. April 2012 13:03
-
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- Bearbeitet Chris-von-der-Wiese Sonntag, 1. April 2012 09:29
- Als Antwort markiert Tom Lambert (Koopakiller)Moderator Sonntag, 1. April 2012 13:03
- Bearbeitet Robert BreitenhoferModerator Montag, 2. April 2012 09:10 Formatierung
Alle 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
- Bearbeitet Holger M. Rößler Sonntag, 18. März 2012 21:11 Add Code
- Als Antwort vorgeschlagen Robert BreitenhoferModerator Donnerstag, 22. März 2012 13:00
- Als Antwort markiert Robert BreitenhoferModerator Freitag, 23. März 2012 16:22
- Tag als Antwort aufgehoben Robert BreitenhoferModerator Montag, 26. März 2012 07:00
- Als Antwort markiert Tom Lambert (Koopakiller)Moderator Sonntag, 1. April 2012 13:03
-
-
Hallo Koopakiller,
Ich gehe davon aus, dass die Antwort Dir weitergeholfen hat.
Solltest Du noch "Rückfragen" dazu haben, so gib uns bitte Bescheid.Grüße,
Robert
Robert Breitenhofer, MICROSOFT
Bitte haben Sie Verständnis dafür, dass im Rahmen dieses Forums, welches auf dem Community-Prinzip „Entwickler helfen Entwickler“ beruht, kein technischer Support geleistet werden kann oder sonst welche garantierten Maßnahmen seitens Microsoft zugesichert werden können. -
Entschuldigt das meine Antwort so lange brauchte...
Es läuft noch immer nicht, GetModuleHandle liegert immer 0 zurück.
[DllImport("kernel32.dll")] public static extern IntPtr GetModuleHandle(string lpModuleName); Assembly asm = Assembly.GetExecutingAssembly(); Module[] mod = asm.GetModules(); source = GetModuleHandle(mod[0].FullyQualifiedName);
//source = 0Dieses verhalten wird auch von dieser Seite bestätigt.
Gibt es eine andere alternative? Denn ich habe ja leider kein Fenster...
Koopakiller - http://koopakiller.ko.ohost.de/
-
Hallo Koopakiller,
Versuch es mal mit GetHINSTANCE:
IntPtr hModule = UnsafeNativeMethods.GetModuleHandle(dllPath);
if (hModule == IntPtr.Zero) {
hModule = Marshal.GetHINSTANCE(Assembly.GetExecutingAssembly().GetModules()[0]);
...
Noch zum Lesen: WPF and Win32 Interoperation
Grüße,
Robert
Robert Breitenhofer, MICROSOFT
Bitte haben Sie Verständnis dafür, dass im Rahmen dieses Forums, welches auf dem Community-Prinzip „Entwickler helfen Entwickler“ beruht, kein technischer Support geleistet werden kann oder sonst welche garantierten Maßnahmen seitens Microsoft zugesichert werden können. -
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- Bearbeitet Chris-von-der-Wiese Sonntag, 1. April 2012 09:29
- Als Antwort markiert Tom Lambert (Koopakiller)Moderator Sonntag, 1. April 2012 13:03
- Bearbeitet Robert BreitenhoferModerator Montag, 2. April 2012 09:10 Formatierung