WM_MOUSEHOVER notification?!

Ravebaby

Erfahrenes Mitglied
Es gibt ja diese Standardevents, die im Visual Studio.NET ausgewählt und in der ChildView abgefangen werden können (wie OnMButtonDown())
Nun möchte ich jedoch das Event WM_MOUSEHOVER abfangen.
Dies gibt es allerdings nicht zum Auswählen unter "Messages".
Aber bei MSDN ist es definiert. Wie fange ich nun solch ein Event ab?!
 
WM_MOUSEHOVER ist eine nachträglich reingestrickte Nachricht.
Du musst für dein Fenster zuerst TrackMouseEvent aufrufen, erst dann bekommst du ein WM_MOUSEHOVER zugesandt.
 
OK und dann muss ich das ganze mit WindowProc verbasteln. Aber wie?
Code:
LRESULT CChildView::WindowProc(UINT message, WPARAM wParam, LPARAM lParam)
{
	TRACKMOUSEEVENT track;
	bool tmp = TrackMouseEvent(&track);

	if(message == WM_MOUSEHOVER) {
		TRACE("over");
	}

	return CWnd::WindowProc(message, wParam, lParam);
}

von dem WindowProc bekomm ich wohl WM_MOUSEHOVER, aber nur, wenn ich vorher TrackMouseEvent() aufgerufen hab...
Was bekommt man mit welcher Funktion u was benötigt welche Funktion?
 
also, ich hab nun folgendes getan:
Code:
BEGIN_MESSAGE_MAP(CMouseAction, BASECLASS)
     ON_MESSAGE(WM_MOUSEHOVER, OnMouseHover)
END_MESSAGE_MAP()

und...

Code:
TRACKMOUSEEVENT tme;
tme.cbSize = sizeof(tme);
tme.hwndTrack = m_hWnd;
tme.dwFlags = TME_LEAVE|TME_HOVER;
tme.dwHoverTime = 1;
m_bTracking = _TrackMouseEvent(&tme);

und...

Code:
LRESULT CChildView::OnMouseHover(WPARAM wparam, LPARAM lparam)
{
   TRACE("OnMouseHover\n");
   return 0;
}

aber es passiert nichts, wenn ich mit der Maus über dem Fenster bleib... :(
 
Das Ding grenzt an Selbstverarschung:

Ich habs mal ausprobiert (in OnInitDialog), und bekomme sofort ein WM_MOUSELEAVE. Sobald ein TrackEvent gesendet wurde, muss man die Funktion erneut aufrufen.
Ich habe es in OnInitDialog nicht hingekriegt, dass er auf Hover reagiert. Dazu steht folgender lustiger kleiner Satz zu TME_HOVER:

This flag is ignored if the mouse pointer is not over the specified window or area.

Das Fenster muss also zum Zeitpunkt des Aufrufes bereits sichtbar sein UND der Mauszeiger soll auch noch direkt drüber sein. Da wäre ein WM_MOUSEMOVE wohl der beste Aufrufpunkt. Dann klappt es auch (habs ausprobiert).
 
Ach so n shit ist das... Danke für den Hinweis!
Das Problem ist halt nur, dass eine bestimmte Aktion nur ausgeführt werden soll, wenn die Maus eine bestimmte Zeitspanne drüber ist. Deshalb wollt ich die Mousehover Funktion nutzen. Gibt es da ne Alternative? Oder muss ich da selbst ne Verzögerung implementieren?
 
Du kannst ja einfach in WM_MOUSEMOVE, wenn das TrackMouseEvent noch nicht aufgerufen wurde, das aufrufen (also mit einem bool Flag). Dann beginnt der Timer und wenn die Maus lang genug drüber war, kommt WM_MOUSEHOVER.
 
Klappen tut's schon, nur nicht so wie man (oder ich) es erwartet habe.
Also in WM_INITDIALOG geht es gar nicht, da ist der Mauszeiger nicht über dem HWND.

Aber wenn du auf WM_MOUSEMOVE hörst, dann ist die Maus ja drüber. Wenn du dann TrackMouseEvent aufrufst, und dann länger drüber bleibst, bekommst du auch dein WM_MOUSEHOVER. Das klappt dann schon soweit.

In meiner Fantasiewelt hätte das TrackMouseEvent nicht abgebrochen, wenn die Maus gerade nicht über dem Zielfenster ist. Ausserdem müsste man es nicht andauern erneut aufrufen.
 
Zuletzt bearbeitet:
Zurück