hallo zusammen!
ich muss innerhalb der webbrowser-komponente auf mousemove-ereignisse reagieren. da dieses ereignis leider nicht standardmäßig implementiert wurde, versuche ich es nun künstlich hinzuzufügen, indem ich eine neue klasse erstelle und von webbrowser ableite.
public class XWebBrowser : WebBrowser
{
new public event MouseEventHandler MouseMove;
public XWebBrowser()
{
}
protected override void WndProc(ref Message m)
{
base.WndProc(ref m);
if (m.Msg == 0x200) // mousemove event
{
this.OnMouseMove();
}
}
private void OnMouseMove()
{
if (MouseMove != null)
{
MouseMove(this, MouseEventArgs.Empty);
}
}
}
später in der designerdefinition erstelle ich eine neue instanz von meiner erweiterten klasse:
this.webBrowser1 = new XWebBrowser();
und danach wollte ich gerne die behandlung dieses ereignisses festlegen:
this.webBrowser1.MouseMove += new System.Windows.Forms.MouseEventHandler(webBrowser1_MouseMove);
nun kommen aber immer zwei fehlermeldungen innerhalb meiner neuen klasse. und zwar an der stelle, wo der aufruf einer ereignisbehandlungsroutine angestoßen werden soll:
...
MouseMove(this, MouseEventArgs.Empty);
...
folgende beiden fehlermeldungen verhindern die kompilierung:
Fehler 1: Der Delegat "System.Windows.Forms.MouseEventHandler" enthält einige ungültige Argumente.
Fehler 2: 2-Argument: kann nicht von "System.EventArgs" in "System.Windows.Forms.MouseEventArgs" konvertiert werden.
seltsamerweise gebe ich aber korrekte parametertypen an und dennoch meint der compiler, sie seien inkorrekt. "mousemove()" erwartet laut programmierhilfe exakt 2 parameter: object und mouseeventargs.
weiß jemand, wo das problem liegt?
vielen dank!
beste grüße
PAX
"Wenn man irgendwann mal von allen akzeptiert wird, dann weiß man, dass man irgendwas falsch gemacht hat." Zitat: Herr Weidner
Hallo PAX523,
seltsamerweise gebe ich aber korrekte parametertypen an
nö, tust du nicht. Der Compiler hat Recht. MouseEventArgs.Empty liefert nämlich was? Schau dir in den Doku den Typ der Eigenschaft an: EventArgs, nicht MouseEventArgs. Über MouseEventArgs.Empty sprichst du nämlich letztendlich nichts anders an als die geerbte Empty-Property der Klasse EventArgs.
herbivore
8o oh, hoppla. richtig! 😁
vielen dank! mit typenumwandlung klappts nun auch:
...
MouseMove(this, (MouseEventArgs)EventArgs.Empty);
...
nun kommt die nächste fehlermeldung. aber diesmal zur laufzeit:
NotSupportedException: Das Ereignis MouseMove ist für dieses ActiveX-Steuerelement ungültig.
zur zeile:
this.webBrowser1.MouseMove += new System.Windows.Forms.MouseEventHandler(webBrowser1_MouseMove);
ich dachte, es reicht, wenn ich das ereignis auf public setze? zugreifen kann ich trotzdem nicht (offensichtlich). wo ist diesmal das problem?
vielen dank, herbivore! wie oft hast du mir hier im forum schon bereits geholfen? 😁
so langsam sollten wir mal ein bier trinken gehen! 👍
beste grüße
UPDATE: ich habe einmal testweise öffentliche eigenschaften der klasse hinzugefügt und auf diese kann ich aber auch nicht zugreifen?
"Wenn man irgendwann mal von allen akzeptiert wird, dann weiß man, dass man irgendwas falsch gemacht hat." Zitat: Herr Weidner
Hallo PAX523,
NotSupportedException: Das Ereignis MouseMove ist für dieses ActiveX-Steuerelement ungültig.
ja, das ist ja auch so. 🙂
Schreib dir am besten dein eigenes MyMouseMove-Event ([FAQ] Eigenen Event definieren) und benutze dann das.
herbivore
ich hatte vergessen, bei der deklaration von "webBrowser1" ebebfalls den typ "WebBrowser" in "XWebBrowser" zu ändern (diese umstellung habe ich nämlich erst kürzlich vorgenommen; vorher wars halt vom typ WebBrowser). nun wird auch die überschriebene methode, WndProc, bei diversen botschaften ausgeführt. ich habe auch mal den wert der "Message" kontrolliert. es werden immer Messages erzeugt, wenn man zum beispiel in der WebBrowser-komponente klickt (rechts/links) oder sie gerade den fokus erhält oder ihn verliert. allerdings passiert absolut nichts beim bewegen mit der maus über die komponente. somit hat "m.Msg" auch niemals den wert 0x200.
versteh ich nicht! 🙁
UPDATE1: und nun? stell dir vor, du hast einen software-auftrag. und der kunde wünscht, dass wenn du innerhalb der webbrowserkomponente mit dem mauszeiger über links fährst, ihr verweis in diesem moment in einem statuslabel angezeigt wird (wie bei jedem browser auch üblich). und er zahlt dir 60.000 € mehr, wenn du das auch tatsächlich realisierst (ansonsten sucht er sich einen anderen)?
was tust du dann? bei 60.000 € ist nichts mehr zu schwer. 😉
UPDATE2: habe auf selbige art und weise mal versucht, ein eigenes mousemove-event für einen stink normalem button zu erstellen. resultat war, dass es dort funktionierte. nur bei der webbrowser-komponente klappt es nicht.
"Wenn man irgendwann mal von allen akzeptiert wird, dann weiß man, dass man irgendwas falsch gemacht hat." Zitat: Herr Weidner
Hallo!
Ich weiß der Beitrag ist uralt, aber hat zu diesem Event schon jemand ne Idee?
Sitz gerade vor dem selben Problem 🤔
Hallo mobobo,
ich würde es mal mit global mouse hooks probieren, siehe z.B. Processing Global Mouse and Keyboard Hooks in C#.
Wenns damit geht, poste bitte eine Lösung.
herbivore