Einzelnen Beitrag anzeigen

Benutzerbild von Codehunter
Codehunter

Registriert seit: 3. Jun 2003
Ort: Thüringen
2.272 Beiträge
 
Delphi 10.4 Sydney
 
#1

Mal wieder das lustige Thema MouseWheel

  Alt 30. Nov 2011, 09:54
Hallo!

Unter Windows ist es üblich, dass WM_MOUSEWHEEL nur dorthin gesendet wird, wo auch der aktuelle Eingabefocus liegt. Unter Umständen scrollt also ein Control bei gedrehtem Wheelrad selbst dann, wenn sich der Mauszeiger außerhalb des BoundsRect des betreffenden Controls befindet.

Einige Programme wie z.B. der Opera Browser verhalten sich anders. Sie scheinen WM_MOUSEWHEEL abzufangen und gezielt an das Control zu schicken, über dem sich der Mauszeiger befindet, unabhängig davon, ob das betreffende Control gerade den Eingabefokus hat oder nicht. Das Resultat ist eine viel komfortablere Bedienung (wie ich finde).

Jetzt versuche ich das in meiner Delphianwendung nachzubauen und komme irgendwie nicht richtig voran. Ich fange WM_MOUSEWHEEL wie folgt ab:
Delphi-Quellcode:
procedure TwndMain.WMMouseWheel(var Msg: TWMMouseWheel);
var
  P: TPoint;
  H: HWND;
begin
  P.X:= Msg.Pos.X;
  P.Y:= Msg.Pos.Y;
  H:= WindowFromPoint(P);
  if H > 0 then begin
    if H <> Windows.GetFocus then Windows.SetFocus(H);
    SendMessage(H, WM_MOUSEWHEEL, TWMVScroll(msg).ScrollCode, TWMVScroll(msg).Pos);
  end;
end;
Funktioniert aber nicht. WM_MOUSEWHEEL geht weiterhin nur an das Control mit dem Fokus, selbst wenn der Mauszeiger nicht darüber ist. Das Control über dem sich der Mauszeiger befindet erhält keine WM_MOUSEWHEEL Nachricht.

Ich hoffe, ihr könnt mir da ein bisschen helfen

Grüße
Cody
  Mit Zitat antworten Zitat