Windows ConfidentialDas Phänomen des verschwindenden Cursors

Raymond Chen

Sie haben vielleicht schon einmal bemerkt, dass der Cursor kurz blinkt, wenn Sie die Druck-Taste drücken, um ein Bildschirmfoto zu erstellen. Ob Sie es glauben oder nicht – dies hat denselben Grund wie die Tatsache, dass der ausgeblendete Windows XP-Bildschirm beim Herunterfahren keine transparenten Fenster enthält.

Diese transparenten Fenster, die auch als geschichtete Fenster bezeichnet werden, sind normalerweise nicht in der BitBlt-Funktion enthalten, wenn Pixel auf dem Bildschirm gelesen werden. Um sie zu erhalten, müssen Sie das CAPTUREBLT-Kennzeichen übergeben. Wenn Sie dies tun, stellen Sie vielleicht auch fest, dass der Mauszeiger blinkt. Warum ist das so?

Irgendwann einmal war der Mauszeiger das einzige grafische Objekt, das „über“ den übrigen Objekten auf Ihrem Bildschirm schwebte. Ursprünglich unterstütze das System nur monochrome Mauszeiger. Diese Cursor wurden entweder in der Software oder, wenn Sie zufällig eine tolle Videokarte hatten, in der Hardware unterstützt.

Wenn Sie einen von einer Videokarte unterstützten Cursor verwenden, überreicht das Graphics Device Interface (GDI) der Videokarte eine Bitmap und eine Maske und sagt: „Also dies ist der Mauszeiger. Er soll auf dem Bildschirm an den von mir angegebenen Koordinaten überlagern.“ Wenn der Benutzer die Maus bewegt, sendet das GDI aktualisierte Koordinaten an die Videokarte, und die Videokarte übernimmt die harte Arbeit und verschiebt die Pixel auf dem Bildschirm.

Wenn Sie andererseits einen von Software unterstützten Cursor verwenden, ist das GDI dafür verantwortlich, die Pixel unter dem Cursor zu speichern, bevor er in den Framepuffer gezogen wird. Das Verfahren funktioniert folgendermaßen: Wenn der Benutzer die Maus bewegt, stellt das GDI manuell die ursprünglichen Pixel wieder her, speichert alle Pixel unter der neuen Position des Cursors und zieht den Cursor dann an diese neue Position.

Wenn ein Hardwarecursor verwendet wird, sind die Pixel des Mauszeigers nicht im Framepuffer vorhanden, da die Hardware für das Durchführen der Überlagerung verantwortlich ist. Folglich kann die BitBlt-Funktion Pixel aus dem Framepuffer kopieren, ohne Angst haben zu müssen, dass versehentlich Pixel des Mauszeigers erfasst werden, da diese Pixel im Framepuffer nicht vorhanden sind.

Wenn umgekehrt ein Softwarecursor verwendet wird, muss das GDI den Mauszeiger vom Bildschirm entfernen, bevor eine BitBlt-Funktion für den Bildschirm ausgeführt wird, wenn der Bereich, der kopiert wird, den Mauszeiger überlagert.

Wenn animierte Cursor verwendet werden, bringen es Hardwarecursor nicht so richtig, da sich Hardwarecursor nicht animieren lassen. Daher werden animierte Cursor von Software implementiert.

Na gut. Was hat das alles mit CAPTUREBLT zu tun? Geduld, Geduld – darauf komme ich gleich zu sprechen.

In Windows 2000 wurde die Kompositionsmethode, die für Softwarecursor verwendet wurde, verallgemeinert, sodass sie von Anwendungen ebenfalls genutzt werden konnte. Diese Pseudocursor wurden letztendlich als geschichtete Fenster bezeichnet. Genau wie Softwarecursor werden geschichtete Fenster nicht angezeigt, wenn eine BitBlt-Funktion für den Bildschirm ausgeführt wird, da sie im üblichen Sinn nicht vorhanden sind. Die Pixel des Cursors und der geschichteten Fenster werden im letzten Augenblick auf dem Bildschirm zusammengesetzt.

Aber wie können Sie die Pixel eines geschichteten Fensters über BitBlt erfassen? Genau an dieser Stelle kommt das neue CAPTUREBLT-Kennzeichen ins Spiel. Es erfasst die Pixel, nachdem das Kompositionsmodul zu Wort gekommen ist. Da der Code, der den abgeblendeten Windows XP-Bildschirm beim Herunterfahren generiert, das CAPTUREBLT-Kennzeichen nicht übergibt, werden geschichtete Fenster nicht angezeigt.

Aber das ist noch immer keine ausreichende Erklärung dafür, warum der Cursor flimmert, oder? Tatschlich lässt es sich damit erklären. Der Mauszeiger ist lediglich ein weiteres Kompositionsobjekt und würde deshalb vom CAPTUREBLT-Kennzeichen erfasst. Damit dies nicht während einer Bildschirmaufzeichnung geschieht, muss das Kompositionsmodul den Cursor ausblenden, die CAPTUREBLT-Funktion ausführen und dann den Cursor erneut anzeigen.

Da das Windows 2000-Kompositionsmodul Anwendungen zur Verfügung gestellt wurde, haben Cursor ihren besonderen Status verloren. Damit sind wir zum Ausgangspunkt zurückgekehrt. Die Situation ist nun wieder dieselbe wie in der guten alten Zeit, als Sie nur einen Framepuffer und einen Softwarecursor hatten.

Raymond Chen befasst sich auf seiner Website The Old New Thing und in seinem gleichnamigen Buch (Addison-Wesley, 2007) mit der Geschichte von Windows, der Win32-Programmierung und der Fehlinterpretation von Zeitungsschlagzeilen.