Freigeben über


Übersicht Mauseingaben

Die Maus ist ein wichtiges, aber optionales Benutzereingabegerät für Anwendungen. Eine gut geschriebene Anwendung sollte eine Mausschnittstelle enthalten, aber sie sollte nicht ausschließlich von der Maus zum Abrufen von Benutzereingaben abhängen. Die Anwendung sollte auch vollständige Tastaturunterstützung bieten.

Eine Anwendung empfängt Mauseingaben in Form von Nachrichten, die an ihre Fenster gesendet werden.

Dieser Abschnitt enthält die folgenden Themen:

Mauscursor

Wenn der Benutzer die Maus bewegt, verschiebt das System eine Bitmap auf dem Bildschirm, die als Mauscursor bezeichnet wird. Der Mauszeiger enthält einen einpixeligen Punkt, den sogenannten Hotspot, einen Punkt, den das System verfolgt und als die Position des Cursors erkennt. Wenn ein Mausereignis auftritt, empfängt das Fenster, das den Hotspot enthält, normalerweise die Mausnachricht, die sich aus dem Ereignis ergibt. Das Fenster muss nicht aktiv sein oder den Tastaturfokus haben, um eine Mausnachricht zu erhalten.

Das System verwaltet eine Variable, die die Mausgeschwindigkeit steuert, d. h. der Abstand, den der Cursor bewegt, wenn der Benutzer die Maus bewegt. Sie können dieSystemParametersInfo-Funktion mit dem SPI_GETMOUSE oder SPI_SETMOUSE Flag verwenden, um die Mausgeschwindigkeit abzurufen oder festzulegen. Weitere Informationen zu Mauszeigern finden Sie unter "Cursor".

Mausaufzeichnung

Das System sendet in der Regel eine Mausnachricht an das Fenster, das den Cursor-Hotspot enthält, wenn ein Mausereignis auftritt. Eine Anwendung kann dieses Verhalten mithilfe der SetCapture-Funktion ändern, um Mausnachrichten an ein bestimmtes Fenster weiterzuleiten. Das Fenster empfängt alle Mausmeldungen, bis die Anwendung die ReleaseCapture-Funktion aufruft oder ein anderes Aufnahmefenster angibt, oder bis der Benutzer auf ein Fenster klickt, das von einem anderen Thread erstellt wurde.

Wenn sich die Mausaufnahme ändert, sendet das System eine WM_CAPTURECHANGED Nachricht an das Fenster, das die Mausaufnahme verliert. Der lParam-Parameter der Nachricht gibt ein Handle für das Fenster an, das die Mausaufnahme erhält.

Nur das Vordergrundfenster kann Mauseingaben erfassen. Wenn ein Hintergrundfenster versucht, Mauseingaben zu erfassen, empfängt es nur Nachrichten für Mausereignisse, die auftreten, wenn sich der Cursor-Hotspot im sichtbaren Teil des Fensters befindet.

Das Erfassen von Mauseingaben ist nützlich, wenn ein Fenster alle Mauseingaben empfangen muss, auch wenn der Cursor außerhalb des Fensters bewegt wird. Beispielsweise verfolgt eine Anwendung die Cursorposition nach einem Abwärtsereignis der Maustaste nach, und folgt dem Cursor, bis ein Ereignis mit der Maustaste nach oben eintritt. Wenn eine Anwendung keine Mauseingabe erfasst hat und der Benutzer die Maustaste außerhalb des Fensters loslässt, empfängt das Fenster die Schaltflächen-up-Nachricht nicht.

Ein Thread kann die GetCapture-Funktion verwenden, um zu bestimmen, ob eines seiner Fenster die Maus erfasst hat. Wenn eines der Threadfenster die Maus erfasst hat, ruft GetCapture ein Handle für das Fenster ab.

Maus ClickLock

Mit dem Barrierefreiheitsfeature "Mouse ClickLock" kann ein Benutzer die primäre Maustaste nach einem einzelnen Klick sperren. Für eine Anwendung wird die Schaltfläche weiterhin gedrückt. Um die Schaltfläche zu entsperren, kann eine Anwendung eine beliebige Mausnachricht senden, oder der Benutzer kann auf eine beliebige Maustaste klicken. Mit diesem Feature können Benutzer komplexe Mauskombinationen einfacher ausführen. Beispielsweise können Personen mit bestimmten physischen Einschränkungen Text hervorheben, Objekte ziehen oder Menüs einfacher öffnen. Weitere Informationen finden Sie in den folgenden Flags und den Hinweisen in SystemParametersInfo:

  • SPI_GETMOUSECLICKLOCK
  • SPI_SETMOUSECLICKLOCK
  • SPI_GETMOUSECLICKLOCKTIME
  • SPI_SETMOUSECLICKLOCKTIME

Mauskonfiguration

Obwohl die Maus ein wichtiges Eingabegerät für Anwendungen ist, verfügt nicht jeder Benutzer unbedingt über eine Maus. Eine Anwendung kann bestimmen, ob das System eine Maus enthält, indem der SM_MOUSEPRESENT-Wert an die GetSystemMetrics-Funktion übergeben wird.

Windows unterstützt eine Maus mit bis zu drei Tasten. Bei einer Drei-Tasten-Maustaste werden die Schaltflächen als linke, mittlere und rechte Taste festgelegt. Nachrichten und benannte Konstanten im Zusammenhang mit den Maustasten verwenden die Buchstaben L, M und R, um die Schaltflächen zu identifizieren. Die Schaltfläche auf einer Ein-Tasten-Maus wird als linke Taste betrachtet. Obwohl Windows eine Maus mit mehreren Schaltflächen unterstützt, verwenden die meisten Anwendungen die linke Taste in erster Linie und die anderen minimal, wenn überhaupt.

Anwendungen können auch ein Mausrad unterstützen. Das Mausrad kann gedrückt oder gedreht werden. Wenn das Mausrad gedrückt wird, fungiert es als mittlere (dritte) Taste und sendet normale Nachrichten der mittleren Taste an Ihre Anwendung. Wenn sie gedreht wird, wird eine Radnachricht an Ihre Anwendung gesendet. Weitere Informationen finden Sie im Abschnitt Das Mausrad.

Anwendungen können Anwendungsbefehlsschaltflächen unterstützen. Diese Schaltflächen, die als X-Schaltflächen bezeichnet werden, sind so konzipiert, dass der Zugriff auf einen Internetbrowser, elektronische E-Mail- und Mediendienste erleichtert wird. Wenn eine X-Taste gedrückt wird, wird eine WM_APPCOMMAND Nachricht an Ihre Anwendung gesendet. Weitere Informationen finden Sie in der Beschreibung in der WM_APPCOMMAND Nachricht.

Eine Anwendung kann die Anzahl der Schaltflächen auf der Maus bestimmen, indem sie den SM_CMOUSEBUTTONS-Wert an die GetSystemMetrics-Funktion übergeben. Um die Maus für einen linkshändigen Benutzer zu konfigurieren, kann die Anwendung die SwapMouseButton-Funktion verwenden, um die Bedeutung der linken und rechten Maustasten umzukehren. Das Übergeben des SPI_SETMOUSEBUTTONSWAP-Werts an die SystemParametersInfo-Funktion ist eine weitere Möglichkeit, die Bedeutung der Schaltflächen umzukehren. Beachten Sie jedoch, dass die Maus eine freigegebene Ressource ist, sodass sich das Umkehren der Bedeutung der Schaltflächen auf alle Anwendungen auswirkt.

XBUTTONs

Windows unterstützt eine Maus mit fünf Schaltflächen. Neben den linken, mittleren und rechten Schaltflächen gibt es XBUTTON1 und XBUTTON2, die bei Verwendung Ihres Browsers rückwärts und vorwärts navigieren.

Der Fenster-Manager unterstützt XBUTTON1 und XBUTTON2 über die WM_XBUTTON* - und WM_NCXBUTTON* -Nachrichten. Das HIWORD des WPARAM in diesen Nachrichten enthält ein Kennzeichen, das angibt, welche X-Taste gedrückt wurde. Da diese Mausnachrichten auch zwischen den Konstanten WM_MOUSEFIRST und WM_MOUSELAST passen, kann eine Anwendung alle Mausnachrichten mit GetMessage oder PeekMessage filtern.

Folgende Unterstützung XBUTTON1 und XBUTTON2:

Die folgenden APIs wurden geändert, um diese Schaltflächen zu unterstützen:

Es ist unwahrscheinlich, dass ein untergeordnetes Fenster in einer Komponentenanwendung Befehle für XBUTTON1 und XBUTTON2 direkt implementieren kann. Daher sendet DefWindowProc eine WM_APPCOMMAND Nachricht an ein Fenster, wenn auf eine X-Schaltfläche geklickt wird. DefWindowProc sendet die Nachricht WM_APPCOMMAND an das übergeordnete Fenster. Dies ähnelt der Art und Weise, wie Kontextmenüs mit einem Rechtsklick aufgerufen werden –DefWindowProc sendet eine WM_CONTEXTMENU-Nachricht an das Menü und sendet sie auch an das übergeordnete Menü. WennDefWindowProc zusätzlich eine WM_APPCOMMAND-Nachricht für ein Fenster der obersten Ebene empfängt, wird außerdem ein Shell-Hook mit dem Code HSHELL_APPCOMMAND aufgetreten.

Es gibt Unterstützung für Tastaturen mit zusätzlichen Tasten für Browserfunktionen, Medienfunktionen, Anwendungsstart und Energieverwaltung. Weitere Informationen finden Sie unter Tastaturtasten für das Browsen und andere Funktionen.

Mausnachrichten

Die Maus generiert ein Eingabeereignis, wenn der Benutzer die Maus bewegt oder eine Maustaste drückt oder loslässt. Das System konvertiert Mauseingabeereignisse in Nachrichten und sendet sie in die Nachrichtenwarteschlange des entsprechenden Threads. Wenn Mausnachrichten schneller gepostet werden, als ein Thread sie verarbeiten kann, verwirft das System alle, aber die letzte Mausnachricht.

Ein Fenster empfängt eine Mausnachricht, wenn ein Mausereignis auftritt, während sich der Cursor innerhalb der Rahmen des Fensters befindet oder wenn das Fenster die Maus erfasst hat. Mausnachrichten sind in zwei Gruppen unterteilt: Clientbereichsnachrichten und Nichtclientbereichsnachrichten. In der Regel verarbeitet eine Anwendung Clientbereichsmeldungen und ignoriert Nichtclientbereichsnachrichten.

Dieser Abschnitt enthält die folgenden Themen:

Clientbereich Mausnachrichten

Ein Fenster empfängt eine Clientbereichs-Mausnachricht, wenn ein Mausereignis innerhalb des Clientbereichs des Fensters auftritt. Das System sendet die WM_MOUSEMOVE Nachricht an das Fenster, wenn der Benutzer den Cursor innerhalb des Clientbereichs verschiebt. Er sendet eine der folgenden Meldungen, wenn der Benutzer eine Maustaste drückt oder loslässt, während sich der Cursor im Clientbereich befindet.

`Message` Bedeutung
WM_LBUTTONDBLCLK Die linke Maustaste wurde doppelt angeklickt.
WM_LBUTTONDOWN Die linke Maustaste wurde gedrückt.
WM_LBUTTONUP Die linke Maustaste wurde losgelassen.
WM_MBUTTONDBLCLK Die mittlere Maustaste wurde doppelt angeklickt.
WM_MBUTTONDOWN Die mittlere Maustaste wurde gedrückt.
WM_MBUTTONUP Die mittlere Maustaste wurde losgelassen.
WM_RBUTTONDBLCLK Die rechte Maustaste wurde doppelt angeklickt.
WM_RBUTTONDOWN Die rechte Maustaste wurde gedrückt.
WM_RBUTTONUP Die rechte Maustaste wurde losgelassen.
WM_XBUTTONDBLCLK Eine X-Maustaste wurde doppelt angeklickt.
WM_XBUTTONDOWN Eine X-Maustaste wurde gedrückt.
WM_XBUTTONUP Eine X-Maustaste wurde losgelassen.

 

Darüber hinaus kann eine Anwendung die TrackMouseEvent-Funktion aufrufen, damit das System zwei weitere Nachrichten sendet. Sie sendet die WM_MOUSEHOVER Nachricht, wenn der Cursor für einen bestimmten Zeitraum über den Clientbereich bewegt wird. Sie sendet die WM_MOUSELEAVE Nachricht, wenn der Cursor den Clientbereich verlässt.

Meldungsparameter

Der lParam-Parameter einer Clientbereich-Mausnachricht gibt die Position des Cursors an. Das Wort mit niedriger Reihenfolge gibt die X-Koordinate des Hotspots an, und das Wort "Hochreihenfolge" gibt die y-Koordinate an. Die Koordinaten werden in Clientkoordinaten angegeben. Im Clientkoordinatensystem werden alle Punkte auf dem Bildschirm relativ zu den Koordinaten (0,0) der oberen linken Ecke des Clientbereichs angegeben.

Der wParam-Parameter enthält Flags, die den Status der anderen Maustasten sowie die STRG- und UMSCHALT-Tasten zum Zeitpunkt des Mausereignisses angeben. Sie können diese Kennzeichnungen überprüfen, wenn die Verarbeitung von Mausnachrichten vom Status einer anderen Maustaste oder von der STRG- oder UMSCHALTTASTE abhängt. Der wParam-Parameter kann eine Kombination aus den folgenden Werte sein:

Wert Beschreibung
MK_CONTROL Die STRG-TASTE ist gedrückt.
MK_LBUTTON Die linke Maustaste ist gedrückt.
MK_MBUTTON Die mittlere Maustaste ist gedrückt.
MK_RBUTTON Die rechte Maustaste ist gedrückt.
MK_SHIFT Die UMSCHALT-Taste ist gedrückt.
MK_XBUTTON1 Die erste X-Taste ist ausgefallen.
MK_XBUTTON2 Die zweite X-Taste ist ausgefallen.

 

Doppelklicken auf Nachrichten

Das System generiert eine Doppelklicknachricht, wenn der Benutzer zweimal hintereinander auf eine Maustaste klickt. Wenn der Benutzer auf eine Schaltfläche klickt, richtet das System ein Rechteck an, das sich um den Cursor-Hotspot zentriert befindet. Außerdem wird die Uhrzeit markiert, zu der der Klick aufgetreten ist. Wenn der Benutzer ein zweites Mal auf dieselbe Schaltfläche klickt, bestimmt das System, ob sich der Hotspot noch innerhalb des Rechtecks befindet und die seit dem ersten Klick verstrichene Zeit berechnet. Wenn sich der Hotspot noch innerhalb des Rechtecks befindet und die verstrichene Zeit den Timeoutwert mit Doppelklick nicht überschreitet, generiert das System eine Doppelklicknachricht.

Eine Anwendung kann Timeoutwerte mit Doppelklick abrufen und festlegen, indem die GetDoubleClickTime und die SetDoubleClickTime-Funktionen verwendet werden. Alternativ kann die Anwendung den Timeoutwert mit Doppelklick festlegen, indem sie das SPI_SETDOUBLECLICKTIME-Flag mit der SystemParametersInfo-Funktion verwenden. Sie kann auch die Größe des Rechtecks festlegen, das vom System zum Erkennen von Doppelklicks verwendet wird, indem die SPI_SETDOUBLECLKWIDTH und SPI_SETDOUBLECLKHEIGHT Flags an SystemParametersInfo übergeben werden. Beachten Sie jedoch, dass sich das Festlegen des Timeoutwerts mit Doppelklick und Rechteck auf alle Anwendungen auswirkt.

Ein anwendungsdefiniertes Fenster empfängt standardmäßig keine Doppelklicknachrichten. Aufgrund des Systemaufwands beim Generieren von Doppelklicknachrichten werden diese Nachrichten nur für Fenster generiert, die zu Klassen gehören, die den CS_DBLCLKS Klassenstil aufweisen. Ihre Anwendung muss diese Formatvorlage beim Registrieren der Fensterklasse festlegen. Weitere Informationen finden Sie unter Fensterklassen.

Eine Doppelklicknachricht ist immer die dritte Nachricht in einer Vier-Nachrichten-Serie. Die ersten beiden Nachrichten sind die Schaltflächen-Down- und Schaltflächen-up-Nachrichten, die durch den ersten Klick generiert werden. Der zweite Klick generiert die Doppelklicknachricht gefolgt von einer anderen Schaltflächen-up-Nachricht. Ein Doppelklick mit der linken Maustaste erzeugt beispielsweise folgende Meldungssequenz:

  1. WM_LBUTTONDOWN
  2. WM_LBUTTONUP
  3. WM_LBUTTONDBLCLK
  4. WM_LBUTTONUP

Da ein Fenster immer eine Schaltflächen-down-Nachricht empfängt, bevor eine Doppelklicknachricht empfangen wird, verwendet eine Anwendung in der Regel eine Doppelklicknachricht, um eine Aufgabe zu erweitern, die während einer Schaltflächen-Down-Nachricht begonnen wurde. Wenn der Benutzer beispielsweise auf eine Farbe in der Farbpalette von Microsoft Paint klickt, zeigt Paint die ausgewählte Farbe neben der Palette an. Wenn der Benutzer auf eine Farbe doppelklicken, zeigt Paint die Farbe an und öffnet das Dialogfeld "Farben bearbeiten".

Non-Clientbereich Mausnachrichten

Ein Fenster empfängt eine Nichtclientbereichs-Mausnachricht, wenn ein Mausereignis in einem beliebigen Teil eines Fensters mit Ausnahme des Clientbereichs auftritt. Der Nichtclientbereich eines Fensters besteht aus dem Rahmen, der Menüleiste, der Titelleiste, der Bildlaufleiste, dem Fenstermenü, der Schaltfläche "Minimieren" und der Schaltfläche "Maximieren".

Das System generiert Nachrichten im Nichtclientbereich in erster Linie für die eigene Verwendung. Das System verwendet z. B. Nichtclientbereichsmeldungen, um den Cursor in einen Pfeil mit zwei Spitzen zu ändern, wenn sich der Cursor in den Rahmen eines Fensters bewegt. Ein Fenster muss Mausmeldungen im Nichtclientbereich an die DefWindowProc-Funktion übergeben, um die integrierte Mausschnittstelle zu nutzen.

Es gibt eine entsprechende Nichtclientbereichs-Mausnachricht für jede Clientbereichs-Mausnachricht. Die Namen dieser Nachrichten sind ähnlich, mit der Ausnahme, dass die benannten Konstanten für die Nichtclientbereichsnachrichten die Buchstaben NC enthalten. Wenn Sie z. B. den Cursor im Nichtclientbereich bewegen, wird eine WM_NCMOUSEMOVE-Nachricht generiert, und das Drücken der linken Maustaste, während sich der Cursor im Nichtclientbereich befindet, generiert eine WM_NCLBUTTONDOWN-Nachricht.

Der lParam-Parameter einer Nichtclientbereichs-Mausnachricht ist eine Struktur, die die X- und Y-Koordinaten des Cursor-Hotspots enthält. Im Gegensatz zu Koordinaten von Clientbereichs-Mausmeldungen werden die Koordinaten in Bildschirmkoordinaten und nicht in Clientkoordinaten angegeben. Im Bildschirmkoordinatensystem beziehen sich alle Punkte auf dem Bildschirm auf die Koordinaten (0,0) der oberen linken Ecke des Bildschirms.

Der wParam-Parameter enthält einen Treffertestwert, einen Wert, der angibt, wo im Nichtclientbereich das Mausereignis aufgetreten ist. Im folgenden Abschnitt wird der Zweck der Treffertestwerte erläutert.

Die WM_NCHITTEST-Meldung

Jedes Mal, wenn ein Mausereignis auftritt, sendet das System eine WM_NCHITTEST Nachricht an das Fenster, das den Cursor hot spot enthält, oder an das Fenster, das die Maus erfasst hat. Das System verwendet diese Nachricht, um zu bestimmen, ob eine Clientbereich- oder nichtclientbereichs-Mausnachricht gesendet werden soll. Eine Anwendung, die Mausbewegungs- und Maustastenmeldungen empfangen muss, muss die WM_NCHITTEST Nachricht an die DefWindowProc-Funktion übergeben.

Der lParam-Parameter der WM_NCHITTEST Nachricht enthält die Bildschirmkoordinaten des Cursor-Hotspots. Die DefWindowProc-Funktion untersucht die Koordinaten und gibt einen Treffertestwert zurück, der die Position des Hotspots angibt. Der Hit-Test kann einer der folgenden Werte sein:

Wert Ort des Hotspots
HTBORDER Im Rahmen eines Fensters, das keinen Rahmen für die Größenanpassung hat.
HTBOTTOM Im unteren horizontalen Rahmen eines Fensters.
HTBOTTOMLEFT In der unteren linken Ecke eines Fensterrahmens.
HTBOTTOMRIGHT In der unteren rechten Ecke eines Fensterrahmens.
HTCAPTION In einer Titelleiste.
HTCLIENT In einem Clientbereich.
HTCLOSE In einer Schaltfläche Schließen.
HTERROR Auf dem Bildschirmhintergrund oder einer Trennlinie zwischen Fenstern (identisch mit HTNOWHERE mit der Ausnahme, dass die Funktion DefWindowProc einen Systemsignalton erzeugt, um einen Fehler anzuzeigen).
HTGROWBOX In einem Größenfeld (identisch mit HTSIZE).
HTHELP In einer Schaltfläche Hilfe.
HTHSCROLL In einer horizontalen Bildlaufleiste.
HTLEFT Im linken Rahmen eines Fensters.
HTMENU In einem Menü.
HTMAXBUTTON In einer Schaltfläche Maximieren.
HTMINBUTTON In einer Schaltfläche Minimieren.
HTNOWHERE Auf dem Bildschirmhintergrund oder einer Trennlinie zwischen Fenstern.
HTREDUCE In einer Schaltfläche Minimieren.
HTRIGHT Im rechten Rahmen eines Fensters.
HTSIZE In einem Größenfeld (identisch mit HTGROWBOX).
HTSYSMENU In einem System-Menü oder in einer Schließen-Schaltfläche in einem untergeordneten Fenster.
HTTOP Im oberen horizontalen Rahmen eines Fensters.
HTTOPLEFT In der oberen linken Ecke eines Fensterrahmens.
HTTOPRIGHT In der oberen rechten Ecke eines Fensterrahmens.
HTTRANSPARENT In einem Fenster, das derzeit von einem anderen Fenster im selben Thread abgedeckt wird.
HTVSCROLL In der vertikalen Bildlaufleiste.
HTZOOM In einer Schaltfläche Maximieren.

 

Wenn sich der Cursor im Clientbereich eines Fensters befindet, gibt DefWindowProc den HTCLIENTHittestwert an die Fensterprozedur zurück. Wenn die Fensterprozedur diesen Code an das System zurückgibt, konvertiert das System die Bildschirmkoordinaten des Cursors in Clientkoordinaten und sendet dann die entsprechende Clientbereichs-Mausmeldung.

Die DefWindowProc-Funktion gibt einen der anderen Treffertestwerte zurück, wenn sich der Cursor im Nichtclientbereich eines Fensters befindet. Wenn die Fensterprozedur einen dieser Treffertestwerte zurückgibt, sendet das System eine Nichtclientbereichs-Mausnachricht, wobei der Treffertestwert im wParam-Parameter der Nachricht und die Cursorkoordinaten im lParam-Parameter platziert werden.

Maus-Sonar

Das Barrierefreiheitsfeature "Maus-Sonar" zeigt kurz mehrere konzentrische Kreise um den Mauszeiger an, wenn der Benutzer die STRG-TASTE drückt und loslässt. Dieses Feature hilft einem Benutzer, den Mauszeiger auf einem Bildschirm zu finden, der überladen ist oder die Auflösung auf "Hoch", auf einem Monitor mit schlechter Qualität oder für Benutzer mit eingeschränktem Sehvermögen festgelegt ist. Weitere Informationen finden Sie unter den folgenden Flags in SystemParametersInfo:

SPI_GETMOUSESONAR

SPI_SETMOUSESONAR

Maus vanish

Die Barrierefreiheitsfunktion „Mouse Vanish“ verbirgt den Zeiger, während der Benutzer tippt. Der Mauszeiger wird wieder angezeigt, wenn der Benutzer die Maus bewegt. Dieses Feature verhindert, dass der Zeiger den eingegebenen Text, z. B. in einer E-Mail oder einem anderen Dokument, verschleiert. Weitere Informationen finden Sie unter den folgenden Flags in SystemParametersInfo:

SPI_GETMOUSEVANISH

SPI_SETMOUSEVANISH

Das Mausrad

Das Mausrad kombiniert die Features eines Rads und einer Maustaste. Das Rad verfügt über diskrete, gleichmäßig angeordnete Noten. Wenn Sie das Rad drehen, wird eine Radnachricht an Ihre Anwendung gesendet, da jede Klammer gefunden wird. Die Radtaste kann auch als normale Windows-Mitteltaste (Dritte) ausgeführt werden. Durch Drücken und Loslassen des Mausrads werden Standardnachrichten WM_MBUTTONUP und WM_MBUTTONDOWN gesendet. Durch Doppelklicken auf die dritte Schaltfläche wird die Standard-WM_MBUTTONDBLCLK Nachricht gesendet.

Das Mausrad wird durch die WM_MOUSEWHEEL Nachricht unterstützt.

Durch Drehen der Maus wird die WM_MOUSEWHEEL Nachricht an das Fokusfenster gesendet. Die Funktion DefWindowProc gibt die Meldung an das übergeordnete Fenster weiter. Es sollte keine interne Weiterleitung der Meldung erfolgen, da DefWindowProc sie in der übergeordneten Kette so lange weitergibt, bis ein Fenster gefunden ist, in dem sie verarbeitet wird.

Bestimmen der Anzahl der Bildlaufzeilen

Anwendungen sollten die SystemParametersInfo-Funktion verwenden, um die Anzahl der Zeilen abzurufen, die ein Dokument für jeden Bildlaufvorgang scrollt (Radnotch). Um die Anzahl der Zeilen abzurufen, ruft eine Anwendung den folgenden Aufruf ab:

SystemParametersInfo(SPI_GETWHEELSCROLLLINES, 0, pulScrollLines, 0)

Die Variable "pulScrollLines" verweist auf einen ganzzahligen Wert ohne Vorzeichen, der die vorgeschlagene Anzahl von Zeilen empfängt, um zu scrollen, wenn das Mausrad ohne Zusatztasten gedreht wird:

  • Wenn diese Zahl 0 ist, sollte kein Bildlauf erfolgen.
  • Wenn diese Zahl WHEEL_PAGESCROLL ist, sollte ein Radrollen so interpretiert werden, dass er einmal in den Seitenab- oder Seitenaufwärtsbereichen der Bildlaufleiste klickt.
  • Wenn die Anzahl der Zulaufzeilen größer als die Anzahl der anzuzeigenden Zeilen ist, sollte der Bildlaufvorgang auch als Bildlaufvorgang nach unten oder nach oben interpretiert werden.

Der Standardwert für die Anzahl der Bildlaufzeilen lautet 3. Wenn ein Benutzer die Anzahl der Bildlaufzeilen ändert, sendet das Betriebssystem mithilfe des Blatts "Mauseigenschaften" in Systemsteuerung eine WM_SETTINGCHANGE Nachricht an alle Fenster der obersten Ebene, wobei SPI_SETWHEELSCROLLLINES angegeben sind. Wenn eine Anwendung die WM_SETTINGCHANGE Nachricht empfängt, kann sie die neue Anzahl von Bildlaufzeilen abrufen, indem Sie Folgendes aufrufen:

SystemParametersInfo(SPI_GETWHEELSCROLLLINES, 0, pulScrollLines, 0)

Steuerelemente, die scrollen

In der folgenden Tabelle sind die Steuerelemente mit Bildlauffunktionen aufgeführt (einschließlich bildlaufzeilen, die vom Benutzer festgelegt wurden).

Control Scrollen
Bearbeitungssteuerelement Vertikal und horizontal.
List Box-Steuerelement Vertikal und horizontal.
Kombinationsfeld Wenn sie nicht abgelegt wird, ruft jeder Bildlauf das nächste oder vorherige Element ab. Beim Ablegen leitet jeder Bildlauf die Nachricht an das Listenfeld weiter, das entsprechend scrollt.
CMD (Befehlszeile) Vertikal
Strukturansicht Vertikal und horizontal.
Listenansicht Vertikal und horizontal.
Bildlauf nach oben/unten Ein Element nach dem anderen.
Titelleisten-Bildlauf Ein Element nach dem anderen.
Microsoft Rich Edit 1.0 Vertikal Beachten Sie, dass der Exchange-Client über eigene Versionen der Listenansichts- und Strukturansichtssteuerelemente verfügt, die keine Radunterstützung haben.
Microsoft Rich Edit 2.0 Vertikal

 

Erkennen einer Maus mit einem Rad

Um festzustellen, ob eine Maus mit einem Rad verbunden ist, rufen Sie GetSystemMetrics mit SM_MOUSEWHEELPRESENT auf. Ein Rückgabewert von TRUE gibt an, dass die Maus verbunden ist.

Das folgende Beispiel stammt aus der Fensterprozedur für ein mehrzeiliges Bearbeitungssteuerelement:

BOOL ScrollLines(
     PWNDDATA pwndData,   //scrolls the window indicated
     int cLinesToScroll); //number of times

short gcWheelDelta; //wheel delta from roll
PWNDDATA pWndData; //pointer to structure containing info about the window
UINT gucWheelScrollLines=0;//number of lines to scroll on a wheel rotation

gucWheelScrollLines = SystemParametersInfo(SPI_GETWHEELSCROLLLINES, 
                             0, 
                             pulScrollLines, 
                             0);

case WM_MOUSEWHEEL:
    /*
     * Do not handle zoom and datazoom.
     */
    if (wParam & (MK_SHIFT | MK_CONTROL)) {
        goto PassToDefaultWindowProc;
    }

    gcWheelDelta -= (short) HIWORD(wParam);
    if (abs(gcWheelDelta) >= WHEEL_DELTA && gucWheelScrollLines > 0) 
    {
        int cLineScroll;

        /*
         * Limit a roll of one (1) WHEEL_DELTA to
         * scroll one (1) page.
         */
        cLineScroll = (int) min(
                (UINT) pWndData->ichLinesOnScreen - 1,
                gucWheelScrollLines);

        if (cLineScroll == 0) {
            cLineScroll++;
        }

        cLineScroll *= (gcWheelDelta / WHEEL_DELTA);
        assert(cLineScroll != 0);

        gcWheelDelta = gcWheelDelta % WHEEL_DELTA;
        return ScrollLines(pWndData, cLineScroll);
    }

    break;

Aktivieren von Fenstern

Wenn der Benutzer auf ein inaktives Fenster auf oberster Ebene oder auf das untergeordnete Fenster eines inaktiven Fensters der obersten Ebene klickt, sendet das System die WM_MOUSEACTIVATE Nachricht (unter anderem) an das Fenster der obersten Ebene oder des untergeordneten Fensters. Das System sendet diese Nachricht nach dem Veröffentlichen der WM_NCHITTEST Nachricht in das Fenster, aber vor dem Veröffentlichen der Schaltflächen-down-Nachricht. Wenn WM_MOUSEACTIVATE an die Funktion DefWindowProcübergeben wird, aktiviert das System das Fenster der obersten Ebene und sendet anschließend die Button-Down-Nachricht an das Fenster der obersten Ebene oder das untergeordnete Fenster.

Durch die Verarbeitung von WM_MOUSEACTIVATE kann ein Fenster steuern, ob das Fenster der obersten Ebene durch einen Mausklick zum aktiven Fenster wird und ob das angeklickte Fenster die nachfolgende Button-Down-Meldung erhält. Dies geschieht durch Zurückgeben eines der folgenden Werte nach der Verarbeitung WM_MOUSEACTIVATE.

Wert Bedeutung
MA_ACTIVATE Aktiviert das Fenster und verwirft die Mausmeldung nicht.
MA_NOACTIVATE Aktiviert nicht das Fenster und verwirft nicht die Mausmeldung.
MA_ACTIVATEANDEAT Aktiviert das Fenster und verwirft die Mausmeldung.
MA_NOACTIVATEANDEAT Aktiviert nicht das Fenster, verwirft aber die Mausmeldung.

Siehe auch

Nutzen der High-Definition-Mausbewegung