Entwickler-Ecke

Basistechnologien - WndProc Methode definieren


Delete - Do 22.06.17 20:27
Titel: WndProc Methode definieren
- Nachträglich durch die Entwickler-Ecke gelöscht -


Ralf Jansen - Do 22.06.17 20:48

Hmmm ... Window ist ja im Prinzip die kernelseitige Entsprechung eines Controls oder anders gesagt ein Control ist eine Kapselung für ein Window. Und es ist ja die WindowProc an die du willst also geht es um WindowMessages die an Windows (ich spreche nicht vom OS ;) ) geschickt werden. Du sagt jetzt gerade also das du gerne WindowMessages empfangen möchtest ohne ein Window zu sein. Ist wie Fussballspielen wollen mit Ball aber bitte ohne Spieler ;)

Direkt an der WindowsAPI gibt es das Konzept von sogenannten Message-Only Windows. Aber es sind dann auch richtige Windows die halt nur nicht angezeigt werden. Den Weg kannst du natürlich mal ausprobieren ich denke aber nicht das das irgendwo hinführt (neugierig auf Ergebnisse wäre ich aber). Letztlich ist es das einfachste einfach in deiner Klasse ein nicht sichtbares Control als Nachrichtenempfänger zu erzeugen. Ich habe auch gerade so ein Déjà-vu das ich das in Delphi (so um die Jahrtausendwende) auch so gemacht habe bzw. so machen musste ;)


Delete - Do 22.06.17 21:46

- Nachträglich durch die Entwickler-Ecke gelöscht -


Delete - Fr 23.06.17 13:53

- Nachträglich durch die Entwickler-Ecke gelöscht -


Th69 - Fr 23.06.17 14:57

Leite deine Klasse mal von NativeWindow [https://msdn.microsoft.com/de-de/library/system.windows.forms.nativewindow(v=vs.110).aspx] ab.
Als Beispiel habe ich mal eine Datei aus meinem CD-Ripper angehängt (wobei ich diese Datei auch nur übernommen habe ;-)).

Bei einem Control wird es so sein, daß dieses auch ein Parent-Window benötigt, um überhaupt Nachrichten empfangen zu können.


Delete - Fr 23.06.17 20:27

- Nachträglich durch die Entwickler-Ecke gelöscht -


Ralf Jansen - Fr 23.06.17 23:10

Das Parenting fehlt und an WM_DEVICECHANGE steht
Zitat:
Windows sends all top-level windows a set of default WM_DEVICECHANGE messages when new devices or media ...


Wir brauchen also nicht irgendein Control. Wenn ich dem native Window das Handle der Main Form eine Anwendung unterjubel kommt da auch WM_DEVICECHANGE an.


C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
public class MainClass
{
    private WndClass _wndClass;
    
    public MainClass(IWin32Window window)
    {
        _wndClass = new WndClass();
        _wndClass.AssignHandle(window.Handle);
    }
}


Im Beispiel der MSDN Doku zu AssignHandle [https://msdn.microsoft.com/de-de/library/system.windows.forms.nativewindow.assignhandle(v=vs.110).aspx] wird gezeigt wie man das etwas schöner koppelt.


Delete - Sa 24.06.17 01:39

- Nachträglich durch die Entwickler-Ecke gelöscht -


Th69 - Sa 24.06.17 08:50

Hattest du denn auch den Konstruktor-Code (CreateHandle(...) aus meinem Code übernommen? Dadurch brauchst du dann wohl auch kein externes Window-Handle zu übergeben:

C#-Quelltext
1:
2:
3:
4:
CreateParams Params = new CreateParams();
Params.ExStyle = WS_EX_TOOLWINDOW;
Params.Style = WS_POPUP;
CreateHandle(Params);

Ob diese beiden Styles generell funktionieren, müßte man jedoch evaluieren (kommt wahrscheinlich darauf an, welche Messages man empfangen will).


Delete - Sa 24.06.17 09:26

- Nachträglich durch die Entwickler-Ecke gelöscht -