Übersicht über Mauseingaben

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

Eine Anwendung empfängt Mauseingaben in Form von Nachrichten, die an deren Fenster gesendet oder gepostet 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 Mauscursor enthält einen Punkt aus nur einem Pixel, der als Hotspot bezeichnet wird – einen Punkt, den das System nachverfolgt und als Position des Cursors erkennt. Wenn ein Mausereignis eintritt, empfängt das Fenster, das den Hotspot enthält, normalerweise die sich aus dem Ereignis ergebende Mausnachricht. Das Fenster muss nicht aktiv sein oder den Tastaturfokus haben, um eine Mausnachricht empfangen zu können.

Das System verwaltet eine Variable, die die Mausgeschwindigkeit steuert– d. h. den Abstand, über den der Cursor verschoben wird, wenn der Benutzer die Maus bewegt. Sie können die Funktion SystemParametersInfo mit dem Flag SPI_GETMOUSE oder SPI_SETMOUSE-Flag zum Abrufen oder Festlegen der Mausgeschwindigkeit verwenden. Weitere Informationen zu Mauscursorn finden Sie unter Cursor.

Mausaufzeichnung

Beim Eintreten eines Mausereignisses postet das System normalerweise eine Mausnachricht an das Fenster, das den Cursor-Hotspot enthält. Eine Anwendung kann dieses Verhalten ändern, indem sie mithilfe der Funktion SetCapture Mausnachrichten an ein bestimmtes Fenster weiterleitet. Das Fenster empfängt so lange alle Mausnachrichten, bis die Anwendung die Funktion ReleaseCapture aufruft oder ein anderes Aufzeichnungsfenster angibt oder aber bis der Benutzer auf ein Fenster klickt, das von einem anderen Thread erstellt wurde.

Bei einer Änderung der Mausaufzeichnung sendet das System eine WM_CAPTURECHANGED-Nachricht an das Fenster, in dem die Mausaufzeichnung verloren geht. Der Parameter lParam der Nachricht gibt ein Handle für das Fenster an, das die Mausaufzeichnung erhält.

Die Mauseingabe kann nur im Vordergrundfenster aufgezeichnet werden. Wenn ein Hintergrundfenster die Mauseingabe aufzuzeichnen versucht, empfängt es Nachrichten nur für Mausereignisse, die eintreten, wenn sich der Cursor-Hotspot innerhalb des sichtbaren Teils des Fensters befindet.

Das Aufzeichnen von Mauseingaben ist nützlich, wenn ein Fenster alle Mauseingaben auch dann empfangen muss, wenn sich der Cursor außerhalb des Fensters bewegt. Beispielsweise verfolgt eine Anwendung in der Regel die Cursorposition nach einem Mausereignis „Taste unten“ nach und folgt dem Cursor, bis ein Mausereignis „Taste oben“ eintritt. Wenn eine Anwendung keine Mauseingabe aufgezeichnet hat und der Benutzer die Maustaste außerhalb des Fensters loslässt, empfängt das Fenster die Nachricht „Taste oben“ nicht.

Ein Thread kann mithilfe der Funktion GetCapture ermitteln, ob eines seiner Fenster die Maus aufgezeichnet hat. Wenn eines der Fenster des Threads die Maus aufgezeichnet hat, ruft GetCapture ein Handle in das Fenster ab.

Maus-ClickLock

Die Barrierefreiheitsfunktion „Maus-ClickLock“ ermöglicht es einem Benutzer, die primäre Maustaste nach einem einzigen Klick zu sperren. Für eine Anwendung scheint die Taste weiterhin gedrückt zu sein. Zum Entsperren der Taste kann eine Anwendung eine beliebige Mausnachricht senden, oder der Benutzer kann eine beliebige Maustaste klicken. Mithilfe dieser Funktion können Benutzer komplexe Mauskombinationen einfacher ausführen. Beispielsweise können Personen mit bestimmten physischen Einschränkungen einfacher Text hervorheben, Objekte ziehen oder Menüs öffnen. Weitere Informationen finden Sie unter 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, hat nicht jeder Benutzer zwangsläufig eine Maus. Eine Anwendung kann ermitteln, ob das System eine Maus enthält, indem sie den Wert SM_MOUSEPRESENT an die Funktion GetSystemMetrics übergibt.

Windows unterstützt eine Maus mit bis zu drei Tasten. Auf einer Maus mit drei Tasten werden die Tasten als die „linke“, „mittlere“ und „rechte“ Taste bezeichnet. Nachrichten und benannte Konstanten im Zusammenhang mit den Maustasten verwenden die Buchstaben „L“, „M“ und „R“ zum Identifizieren der Tasten. Die Taste auf einer Ein-Tasten-Maus gilt als die linke Taste. Obwohl Windows eine Maus mit mehreren Tasten unterstützt, wird bei den meisten Anwendungen hauptsächlich die linke Taste verwendet, und die anderen Tasten werden – wenn überhaupt – nur minimal verwendet.

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) Schaltfläche und sendet normale Nachrichten der mittleren Taste an Ihre Anwendung. Wenn es 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, wurden entwickelt, um einen einfacheren Zugriff auf einen Internetbrowser, E-Mail und Mediendienste zu ermöglichen. Beim Klicken auf eine X-Schaltfläche wird eine WM_APPCOMMAND-Nachricht an Ihre Anwendung gesendet. Weitere Informationen finden Sie in der Beschreibung in der Nachricht WM_APPCOMMAND.

Eine Anwendung kann die Anzahl der Tasten auf der Maus ermitteln, indem sie den Wert SM_CMOUSEBUTTONS an die Funktion GetSystemMetrics übergibt. Zum Konfigurieren der Maus für einen Linkshänder kann die Anwendung die Bedeutung der linken und rechten Maustaste mithilfe der Funktion SwapMouseButton umkehren. Die Übergabe des Werts SPI_SETMOUSEBUTTONSWAP an die Funktion SystemParametersInfo ist eine weitere Möglichkeit zum Umkehren der Tastenbedeutung. Beachten Sie jedoch, dass die Maus eine freigegebene Ressource ist, sodass sich die Umkehr der Tastenbedeutung auf alle Anwendungen auswirkt.

XBUTTONs

Windows unterstützt eine Maus mit fünf Tasten. Zusätzlich zur linken, mittleren und rechten Taste gibt es die Tasten XBUTTON1 und XBUTTON2, die Ihnen bei der Nutzung Ihres Browsers eine Rückwärts- und Vorwärtsnavigation ermöglichen.

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

Die folgenden Nachrichten unterstützen XBUTTON1 und XBUTTON2:

Die folgenden APIs wurden zur Unterstützung dieser Tasten geändert:

Es ist unwahrscheinlich, dass ein untergeordnetes Fenster in einer Komponentenanwendung Befehle für die Tasten XBUTTON1 und XBUTTON2 direkt implementieren kann. Deshalb sendet DefWindowProc sendet eine WM_APPCOMMAND-Nachricht an ein Fenster, wenn eine X-Taste geklickt wird. DefWindowProc sendet die Nachricht WM_APPCOMMAND auch an das übergeordnete Fenster. Dies ist vergleichbar mit der Art und Weise, wie Kontextmenüs mit einem Rechtsklick aufgerufen werden – DefWindowProc sendet eine WM_CONTEXTMENU-Nachricht an das Menü und auch an dessen übergeordnetes Element. Wenn DefWindowProc eine WM_APPCOMMAND-Nachricht für ein Fenster der obersten Ebene empfängt, ruft sie außerdem ein Shell-Hook mit „HSHELL_APPCOMMAND“-Code auf.

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 Browsen und andere Funktionen.

Mausnachrichten

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

Ein Fenster empfängt eine Mausnachricht, wenn ein Mausereignis eintritt, während sich der Cursor innerhalb der Fensterrahmen befindet oder wenn das Fenster die Maus aufgezeichnet hat. Mausnachrichten werden in zwei Gruppen unterteilt: Nachrichten im Clientbereich und Nachrichten im Nichtclientbereich. Normalerweise verarbeitet eine Anwendung Nachrichten im Clientbereich und ignoriert Nachrichten im Nichtclientbereich.

Dieser Abschnitt enthält die folgenden Themen:

Mausnachrichten im Clientbereich

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

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

 

Darüber hinaus kann eine Anwendung die Funktion TrackMouseEvent aufrufen, damit das System zwei weitere Nachrichten sendet. Das System postet die Nachricht WM_MOUSEHOVER, wenn der Cursor während eines bestimmten Zeitraums über den Clientbereich bewegt wird. Es postet die Nachricht WM_MOUSELEAVE, wenn der Cursor den Clientbereich verlässt.

Nachrichtenparameter

Der Parameter lParam einer Mausnachricht im Clientbereich gibt die Position des Cursor-Hotspots an. Das niederwertige Wort gibt die x-Koordinate des Hotspots an, und das höherwertige Wort 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 ParameterwParam enthält Flags, die den Status der anderen Maustasten sowie der STRG- und UMSCHALTTASTE zum Zeitpunkt des Mausereignisses anzeigen. Sie können diese Flags überprüfen, wenn die Verarbeitung von Mausnachrichten vom Status einer anderen Maustaste oder aber der STRG- oder UMSCHALTTASTE abhängig ist. Der Parameter wParam kann eine Kombination der 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 UMSCHALTTASTE ist gedrückt.
MK_XBUTTON1 Die erste X-Taste ist ausgefallen.
MK_XBUTTON2 Die zweite X-Taste ist ausgefallen.

 

Doppelklicknachrichten

Das System generiert eine Doppelklicknachricht, wenn der Benutzer zweimal in schneller Folge eine Maustaste klickt. Wenn der Benutzer eine Taste klickt, richtet das System ein Rechteck ein, das um den Cursor-Hotspot zentriert ist. Außerdem markiert es den Zeitpunkt, zu dem der Klick erfolgt ist. Wenn der Benutzer dieselbe Taste ein zweites Mal klickt, ermittelt das System, ob sich der Hotspot noch innerhalb des Rechtecks befindet, und berechnet die seit dem ersten Klick verstrichene Zeit. Wenn sich der Hotspot noch innerhalb des Rechtecks befindet und die verstrichene Zeit den Timeoutwert für Doppelklicks nicht überschreitet, generiert das System eine Doppelklicknachricht.

Eine Anwendung kann Timeoutwerte für Doppelklicks mithilfe der Funktionen GetDoubleClickTime und . SetDoubleClickTime abrufen bzw. festlegen. Alternativ kann die Anwendung den Timeoutwert für Doppelklicks mithilfe des Flags SPI_SETDOUBLECLICKTIME bei der Funktion SystemParametersInfo festlegen. Sie kann auch die Größe des Rechtecks festlegen, das das System zum Erkennen von Doppelklicks verwendet, indem die Flags SPI_SETDOUBLECLKWIDTH und SPI_SETDOUBLECLKHEIGHT an SystemParametersInfo übergeben werden. Beachten Sie jedoch, dass sich das Festlegen des Timeoutwerts für Doppelklicks und des Rechtecks auf alle Anwendungen auswirkt.

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

Eine Doppelklicknachricht ist immer die dritte Nachricht in einer Reihe von vier Nachrichten. Die ersten beiden Nachrichten sind die Nachrichten „Taste unten“ und „Taste oben“, die durch den ersten Klick generiert wurden. Der zweite Klick generiert die Doppelklicknachricht, gefolgt von einer weiteren Nachricht „Taste oben“. Wenn Sie beispielsweise die linke Maustaste doppelklicken, wird die folgende Nachrichtensequenz generiert:

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

Weil ein Fenster immer eine Nachricht „Taste unten“ empfängt, bevor es eine Doppelklicknachricht empfängt, verwendet eine Anwendung normalerweise eine Doppelklicknachricht zum Erweitern einer Aufgabe, die während einer Nachricht „Taste unten“ begonnen wurde. Wenn ein Benutzer beispielsweise auf eine Farbe in der Farbpalette von Microsoft Paint klickt, zeigt Paint die ausgewählte Farbe neben der Palette an. Wenn er auf eine Farbe doppelklickt, zeigt Paint die Farbe an und öffnet das Dialogfeld Farben bearbeiten.

Mausnachrichten im Nichtclientbereich

Ein Fenster empfängt eine Mausnachricht im Nichtclientbereich, wenn ein Mausereignis in einem beliebigen Teil eines Fensters – mit Ausnahme des Clientbereichs – eintritt. Der Nichtclientbereich eines Fensters besteht aus Rahmen, Menüleiste, Titelleiste, Bildlaufleiste, Fenstermenü, Schaltfläche „Minimieren“ und Schaltfläche „Maximieren“.

Das System generiert Nachrichten im Nichtclientbereich hauptsächlich zur eigenen Verwendung. Beispielsweise verwendet das System Nachrichten im Nichtclientbereich, um den Cursor in einen Pfeil mit zwei Spitzen zu ändern, wenn der Cursor-Hotspot in den Rahmen eines Fensters wechselt. Ein Fenster muss Mausnachrichten für den Nichtclientbereich an die Funktion DefWindowProc übergeben, um die integrierte Mausschnittstelle nutzen zu können.

Es gibt eine entsprechende Mausnachricht im Nichtclientbereich für jede Mausnachricht im Clientbereich. Die Namen dieser Nachrichten sind ähnlich – mit der Ausnahme, dass die benannten Konstanten für die Nachrichten im Nichtclientbereich die Buchstaben „NC“ enthalten. Wenn Sie beispielsweise den Cursor im Nichtclientbereich verschieben, wird eine WM_NCMOUSEMOVE-Nachricht generiert, und wenn Sie die linke Maustaste drücken, während sich der Cursor im Nichtclientbereich befindet, wird eine WM_NCLBUTTONDOWN-Nachricht generiert.

Der Parameter lParam einer Mausnachricht im Nichtclientbereich ist eine Struktur mit den x- und y-Koordinaten des Cursor-Hotspots. Im Gegensatz zu Koordinaten von Mausnachrichten im Clientbereich werden die Koordinaten in Bildschirmkoordinaten statt in Clientkoordinaten angegeben. Im Bildschirmkoordinatensystem sind alle Punkte auf dem Bildschirm relativ zu den Koordinaten (0,0) der oberen linken Ecke.

Der Parameter wParam enthält einen Treffertestwert – einen Wert, der angibt, wo im Nichtclientbereich das Mausereignis eingetreten ist. Im folgenden Abschnitt wird der Zweck von Treffertestwerten erläutert.

Die Nachricht „WM_NCHITTEST“

Immer wenn ein Mausereignis eintritt, sendet das System eine WM_NCHITTEST-Nachricht entweder an das Fenster, das den Cursor-Hotspot enthält, oder an das Fenster, das die Maus aufgezeichnet hat. Das System ermittelt anhand dieser Nachricht, ob eine Mausnachricht im Clientbereich oder im Nichtclientbereich gesendet werden soll. Eine Anwendung, die Nachrichten zu Mausbewegung und Maustasten empfangen muss, muss die Nachricht WM_NCHITTEST an die Funktion DefWindowProc übergeben.

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

Wert Position 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 Schaltfläche Schließen 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 zurzeit von einem anderen Fenster in demselben Thread verdeckt wird.
HTVSCROLL In der vertikalen Bildlaufleiste.
HTZOOM In einer Schaltfläche Maximieren.

 

Wenn sich der Cursor im Clientbereich eines Fensters befindet, gibt DefWindowProc den Treffertestwert HTCLIENT an die Fensterprozedur zurück. Wenn die Fensterprozedur diesen Code an das System zurückgibt, konvertiert es die Bildschirmkoordinaten des Cursor-Hotspots in Clientkoordinaten und postet dann die entsprechende Mausnachricht im Clientbereich.

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

Maus-Sonar

Die Barrierefreiheitsfunktion „Maus-Sonar“ zeigt kurz mehrere konzentrische Kreise um den Zeiger herum an, wenn der Benutzer die STRG-TASTE drückt und loslässt. Diese Funktion hilft einem Benutzer, den Mauszeiger auf einem Bildschirm zu finden, der überladen ist oder bei dem die Auflösung auf „hoch“ festgelegt wurde, auf einem Monitor mit schlechter Qualität oder für Benutzer mit Sehschwäche. Weitere Informationen finden Sie in SystemParametersInfo unter den folgenden Flags:

SPI_GETMOUSESONAR

SPI_SETMOUSESONAR

Maus verschwindet

Die Barrierefreiheitsfunktion „Maus verschwindet“ blendet den Zeiger bei der Benutzereingabe aus. Der Mauszeiger wird erneut angezeigt, wenn der Benutzer die Maus bewegt. Mit dieser Funktion wird verhindert, dass der Zeiger den gerade eingegebenen Text verdeckt, z. B. in einer E-Mail oder einem anderen Dokument. Weitere Informationen finden Sie in SystemParametersInfo unter den folgenden Flags:

SPI_GETMOUSEVANISH

SPI_SETMOUSEVANISH

Das Mausrad

Das Mausrad kombiniert die Features eines Rads und einer Maustaste. Das Rad hat getrennte Kerben mit gleichem Abstand. Wenn Sie es drehen, wird eine Radnachricht an Ihre Anwendung gesendet, während jede Kerbe gefunden wird. Die Radtaste kann auch als normale mittlere (dritte) Windows-Taste fungieren. Durch Drücken und Loslassen des Mausrads werden die Standardnachrichten WM_MBUTTONUP und WM_MBUTTONDOWN gesendet. Durch Doppelklicken auf die dritte Taste wird die Standardnachricht WM_MBUTTONDBLCLK gesendet.

Das Mausrad wird durch die Nachricht WM_MOUSEWHEEL unterstützt.

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

Ermitteln der Anzahl von Bildlaufzeilen

Anwendungen sollten mithilfe der Funktion SystemParametersInfo die Anzahl der Zeilen abrufen, die ein Dokument für jeden Bildlaufvorgang gescrollt wird (Radkerbe). Zum Abrufen der Anzahl von Zeilen führt eine Anwendung den folgenden Aufruf aus:

SystemParametersInfo(SPI_GETWHEELSCROLLLINES, 0, pulScrollLines, 0)

Die Variable „pulScrollLines“ zeigt auf einen ganzzahligen Wert ohne Vorzeichen, der die vorgeschlagene Anzahl von Zeilen zum Scrollen empfängt, wenn das Mausrad ohne Zusatztasten gedreht wird:

  • Wenn diese Zahl „0“ ist, sollte kein Scrollen erfolgen.
  • Wenn diese Zahl WHEEL_PAGESCROLL ist, sollte ein Drehen des Mausrads als einmaliges Klicken in den Bereich „Seite nach unten“ oder „Seite nach oben“ der Bildlaufleiste interpretiert werden.
  • Wenn die Anzahl der zu scrollenden Zeilen größer als die Anzahl der anzuzeigenden Zeilen ist, sollte der Scrollvorgang auch als Vorgang „Seite nach unten“ oder „Seite nach oben“ interpretiert werden.

Der Standardwert für die Anzahl der Bildlaufzeilen ist „3“. Wenn ein Benutzer die Anzahl der Bildlaufzeilen ändert, sendet das Betriebssystem mithilfe des Blatts „Mauseigenschaften“ in der Systemsteuerung eine WM_SETTINGCHANGE-Nachricht an alle Fenster der obersten Ebene mit der Angabe SPI_SETWHEELSCROLLLINES. Wenn eine Anwendung die Nachricht WM_SETTINGCHANGE empfängt, kann sie die neue Anzahl von Bildlaufzeilen abrufen, indem sie Folgendes aufruft:

SystemParametersInfo(SPI_GETWHEELSCROLLLINES, 0, pulScrollLines, 0)

Steuerelemente zum Scrollen

In der folgenden Tabelle sind die Steuerelemente mit Scrollfunktionen aufgeführt (einschließlich der vom Benutzer festgelegten Bildlaufzeilen).

Control Scrollen
Bearbeitungssteuerelement Vertikal und horizontal.
Listenfeldsteuerelement Vertikal und horizontal.
Kombinationsfeld Wenn es nicht erweitert wurde, ruft jedes Scrollen das nächste oder vorherige Element ab. Wenn es erweitert wurde, leitet jedes Scrollen die Nachricht an das Listenfeld weiter, das entsprechend gescrollt wird.
CMD (Befehlszeile) Vertikal.
Strukturansicht Vertikal und horizontal.
Listenansicht Vertikal und horizontal.
Scrollvorgänge nach oben/unten Jeweils ein Element.
Scrolls auf der TrackBar Jeweils ein Element.
Microsoft Rich Edit 1.0 Vertikal. Beachten Sie, dass der Exchange-Client eigene Versionen der Listenansicht- und Strukturansicht-Steuerelemente hat, die keine Radunterstützung bieten.
Microsoft Rich Edit 2.0 Vertikal.

 

Erkennen einer Maus mit einem Rad

Wenn Sie ermitteln möchten, ob eine Maus mit einem Rad verbunden ist, rufen Sie GetSystemMetrics mit SM_MOUSEWHEELPRESENT auf. Der Rückgabewert 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 der obersten Ebene oder auf das untergeordnete Fenster eines inaktiven Fensters der obersten Ebene klickt, sendet das System die Nachricht WM_MOUSEACTIVATE (unter anderem) an das Fenster der obersten Ebene oder das untergeordnete Fenster. Das System sendet diese Nachricht nach dem Posten der Nachricht WM_NCHITTEST an das Fenster, aber noch vor dem Posten der Nachricht „Taste unten“. Wenn WM_MOUSEACTIVATE an die Funktion DefWindowProc übergeben wird, aktiviert das System das Fenster der obersten Ebene und postet dann die Nachricht „Taste unten“ 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 als Ergebnis eines Mausklicks zum aktiven Fenster wird und ob das geklickte Fenster die nachfolgende Nachricht „Taste unten“ empfängt. Hierzu gibt es nach der Verarbeitung von WM_MOUSEACTIVATE einen der folgenden Werte zurück.

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

Siehe auch

Nutzen der High-Definition-Mausbewegung