2010-12-21 2 views
3

Wie überprüft man, ob sich die Maus über einem bestimmten HWND befindet? Ich habe versucht, die WM_MOUSELEAVE und WM_MOUSEMOVE Nachrichten zu verfolgen, aber wenn Sie auf eine Schaltfläche klicken und die Maus aus der Schaltfläche ziehen, erhält es die WM_MOUSELEAVE nicht, bis die Maus freigegeben wird, was zu spät ist, weil:Wie überprüft man, ob sich eine Maus über einem Steuerelement befindet


1. die Maus ursprünglich gedrückt über die Schaltfläche
2. die Maus ist über die Schaltfläche wird
3. die Maus über die Taste losgelassen wurde

:

wenn Sie auf eine Schaltfläche klicken, wird die WM_COMMAND-Nachricht nur, wenn gesendet

Ich muss diese Funktionalität replizieren.

Antwort

3

Um diese Funktion zu duplizieren, rufen Sie einfach SetCapture(), so dass Mausnachrichten an Ihr Fenster gesendet werden, selbst wenn die Maus es verlässt. Sie können die aktuelle Mausposition während der Bewegung lesen und feststellen, ob sie sich immer noch über Ihrem Fenster/Knopf befindet (ich bin immer noch nicht 100% sicher, was Sie tun). Und wenn die Maustaste losgelassen wird, können Sie ReleaseCapture() aufrufen, um wiederherzustellen, wo Mausnachrichten gesendet werden.

EDIT: Oh, und Sie können die Windows-API-Funktion WindowFromPoint() verwenden, um festzustellen, welches Fenster die Maus über ist.

+0

setCapture ist keine gültige Lösung, da mehrere Schaltflächen gleichzeitig bekannt sein müssen. Ich bin mir ziemlich sicher, dass SetCapture nicht das ist, was der WndProc der Button-Klasse tut, was ich emulieren muss. –

+0

Nun, es ist gültig, auch wenn es in Ihrem Fall aufgrund einer Einschränkung, die Sie nicht erwähnt haben, nicht funktioniert. Oh, und ich kann Ihnen garantieren, dass das Windows Button Control SetCapture() verwendet. Ich habe diese Funktionalität mehrmals dupliziert. –

+0

@ Jonathan, danke, und bitte sehen Sie meine Frage an Hans Passant. –

2

Dies ist in Windows integriert, es heißt "Mauserfassung", SetCapture (hWnd). Es stellt sicher, dass Sie Mausnachrichten erhalten, obwohl sich die Maus außerhalb des Fensters bewegt hat. Sie rufen es in der WM_LBUTTONDOWN-Benachrichtigung auf.

+0

Es ist mir egal, wenn ich Mausnachrichten außerhalb des Fensters bekomme. –

+0

Wenn Sie sich nicht für die Schaltfläche-up-Nachricht interessieren, dann rufen Sie SetCapture() nicht auf. Was seltsam ist, ist es wichtig, dass der Knopf nicht mehr gedrückt wird. Dies wird in der Regel problemlos von Klassenbibliotheken erledigt. Sogar die native Windows BUTTON-Klasse tut dies. –

+0

@Hans so BUTTON verwendet SetCapture? Wie funktionieren mehrere Tasten gleichzeitig? –