Wie eine Gruppe von Radio-Buttons ein Programm aufhängen können

Auto-Radiobuttons (BS_AUTORADIO) sind als Standard in fast jedem Dialog zu finden. Das diese netten kleinen Buttons ein Programm dazubringen können sich aufzuhängen, ohne das unbedingt eigener Code im Spiel ist, kann man sich kaum vorstellen.
Aber es kann passieren.

Ein Regular in der Gruppe nntp://microsoft.public.de.vc berichtete dieses Problem mehrfach in der Gruppe. Letzten Endes trugen aber alle Ideen und Vorschläge zu keiner Lösung bei.

In einem Thread wurde dann ein Beispielprogramm veröffentlicht, bei dem mit einem simplen Klick auf einen Radiobutton das Programm in einer Endlosschleife gerät und sich aufhängt.

Die Ursache ist trivial. Eine Gruppe von Auto-Radio Buttons war nicht durch ein Control mit dem Stil WS_GROUP abgeschlossen worden. Solch einen Design Fehler im Dialog hat schon jeder mal gemacht und viele werden die folgende Ausgabe im Debug Fenster kennen: „Warning: skipping non-radio button in group.“

In diesem Fall kam nach der Gruppe Radio Buttons ein Tab-Control, dass den Stil WS_EX_CONTROLPARENT hat. Dieser Stil erlaubt es Dialoge und Controls zu schachteln. Gleichfalls führt dieser Stil dazu, das versucht wird die Gruppe von Radio-Buttons in den untergeordneten Feldern weiter zu führen. Leider waren in den entsprechenden Fenstern auch keine Controls mehr mit dem Stil WS_GROUP und irgendwie hat sich die Windows UI-API dann letzten Endes aufgehängt.

Behoben werden konnte dieser Stil einfach;

  • Entweder man führt ein (evtl. sogar unsichtbares) Static Control ein, direkt nach der Gruppe. Static-Controls werden automatisch mit dem WS_GROUP Stil versehen.
  • Oder man änderte die Z-Order, so dass auf die Radio-Button Gruppe ein anderes Control mit WS_GROUP Eigenschaften folgt.
  • Oder eines der Controls im Unterdialog hat den WS_GROUP Stil, was aber oft genug nicht dem eigentlich gewollten Design entspricht, dass sich die Gruppe in den Unterdialog fortsetzt.

Auch so simplen Warnungen in der Debugausgabe wie „Warning: skipping non-radio button in group.“ sollte man gezielt nachgehen. Manchmal haben heftige Probleme trivialste Ursachen ❗

Anmerkung: Das Beispielprogramm ist zwar noch VC6, aber das Problem liegt im Design der geschachtelten Fenster und der nicht abgeschlossenen Radio-Button Gruppe.

Wie unsere Kirchen und Gemeinden wieder öffentlich wahrgenommen werden!

Seit Jahren leiden viele Kirchen und Gemeinden unter der Ignoranz der Medien. Gott, Glaube und Kirche sind keine Themen öffentlichen Interesses. Dieses „Blatt“ hat sich nun schlagartig gewendet. Hier sind einige Tipps, wie Sie mit Ihrer Gemeinde ganz schnell in die Schlagzeilen geraten. Ihre Gemeinde wird garantiert wieder wahrgenommen, wenn Sie diese Checkliste im Hinterkopf behalten.

  • Räumen Sie gegenüber der Presse ein, dass Sie im Kindergottesdienst die biblische Schöpfungsgeschichte erzählt haben.
  • Bekennen Sie sich freimütig dazu, im Konfirmandenunterricht über das Buch Genesis gesprochen und Vergleiche zwischen Kreationismus und Evolutionstheorie angestellt haben. Schämen Sie sich nicht.
  • Lassen Sie ehrlich raus, dass Sie immer noch das „Vaterunser“ beten und noch nicht auf „Mutterunser“ umgestiegen sind.
  • Schreiben Sie im Gemeindeblatt, dass in ihren Gottesdiensten „Ausländer“ willkommen sind. Man wird Ihnen eine Schlagzeile widmen. Schreiben Sie indes, Sie würden sich um Menschen mit „Migrationshintergrund“ kümmern, wird keine Zeitung von Ihnen Notiz nehmen.
  • Berichten Sie öffentlich, dass Ihre Gemeinde einen „Missionar“ ausgesandt hat. Die Presse wird über Sie herfallen . Bitte nicht „Entwicklungshelfer“ schreiben. Das wird nie eine Meldung.
  • Veröffentlichen Sie auf Ihrer Internet-Seite ein Seminar zum Thema „Mit Moslems über den christlichen Glauben reden“. Weil Sie nicht im Vatikan wohnen und auch nicht über eine Schweizer Garde verfügen, sollten Sie am besten gleich untertauchen.
  • Bestehen Sie darauf, dass der neue Küster Ihrer Gemeinde keiner anderen Religion angehören darf als der christlichen. Sie bekommen eine Schlagzeile. Suchen Sie sich einen guten Anwalt und achten Sie auf Menschen, die Koffer vor ihrem Gemeindezentrum stehen lassen.
  • Erwähnen Sie beiläufig, dass Sie am Ende einer Sportübertragung in ihrem Gemeindezentrum nach dem Sieg der deutschen Mannschaft die Nationalhymne gesungen haben. Schließen Sie abends besser die Fensterläden.
  • Berichten Sie ganz entspannt, dass Sie an Ihrem Gemeindefest eine Mohrenkopfwurfmaschine eingesetzt haben. Bleiben Sie danach lieber ein paar Tage in Deckung.
  • Räumen Sie gegenüber der Presse reumütig ein, dass die Jungs beim Pfadfinderlager in Uniformen aufgetreten sind und dass sich die Betreuer am Ende des Lagers mit herzlichen Umarmungen von den Kindern verabschiedet haben. Morgen werden Ihnen die Reporter auflauern.

So kommen Sie mit Ihrer Gemeinde garantiert in die Zeitung. So einfach ist heute kirchliche Öffentlichkeitsarbeit. Seien Sie bewusst politisch unkorrekt, dann kommen Sie endlich bald ins Fernsehen.

– Jürgen Mette „Stiftung Marburger Medien“

Gefunden auf der Homepage von Arno Backhaus!

Installation von VC6 unter Vista

Es ist ein Anachronismus und ich weiß gar nicht warum ich das hier schreibe. 😉 Aber es gibt doch immer wieder Leute die Visual C++ 6.0 bzw. Visual Studio 6.0 auf Vista installieren wollen.

❗ Grundsätzlich rate ich jedem ab, für Neueintwicklungen VC6 weiterhin zu verwenden.
Dieser Compiler und diese IDE sind überaltert und VC2005 ist ein würdiger und wirklich guter Nachfolger. Was die Änderungen bzgl. Wizards etc. betrifft ist es reine Gewöhnungssache.

Nun aber gib es genug Legacy Code der evtl. einen Bugfix braucht. OK Also wie installiert man dann VC6 auf Vista? Bzw. Geht es überhaupt?
Ja! Es geht.

Wichtig ist, nur, dass man UAC für die Dauer der Installation am Besten komplett abstellt. Es genügt IMHO nicht nur das Setup als Admin zu starten. Das erkennt Vista sowie entsprechend und fordert dazu auf. Also bei mir spielte sich die Installation der Visual Studio 6.0 Enterprise Version in etwa so ab:

  • UAC abschalten (am einfachsten über die System-Steuerung) und den Rechner neu starten.
  • Nun unbedingt einen Account verwenden der lokaler Admin ist (Aber das war jedem klar, oder?)
  • VC6 Installation starten. Die nette  Meldung über bekannte Kompatibilitätsprobleme nehmen wir dankbar zur Kenntnis.
  • Jetzt wird evtl. die VM für Java aktualisiert und neu gestartet (was sonst).
  • Zwischendrin erfolgt noch mal eine Warnung über bekannte Kompatibilitätsprobleme die wir wieder gerne quittieren.
  • Nun dürfen wir wie gewohnt installieren. Man kann sich die Data Access Components übrigends sparen. Meistens sind sowieso schon neuere Versionen auf dem Rechner. Gleiches würde ich mit den SDK Tools machen. Diese alten Tools machen manchmal auch Ärger beim registrieren.
  • Irgendwann kommt manchmal noch eine Frage nach den JIT-Debugger  settings, am Besten auch die nicht verändern.
    Und wie gewohnt erfolgt ein Neustart der Maschine am Ende der Installation.
  • Danach VC6 SP6 installieren und Rechner neu starten (was sonst).
    Für SP5 muss man etwas hexen, aber es geht mit Tricks auch.
  • Danach UAC wieder einschalten, und es erfolgt der nächste Neustart 😉


Anmerkungen

  • Der Standard Pfad zum Anlegen der Projekt sollte natürlich nicht verwendet werden. Der liegt dämlicherweise ja unter C:\Program Files, aber ich gehe auch hier davon aus, dass dies logisch ist…
  • Beim ersten Start des Compilers und einiger Tools kommen wieder Meldungen über Kompatibilitätsprobleme (vcspawn.exe, rc.exe), diese schalten wir für immer aus.
  • Man sollte VC6 übrigends auch nicht nach VC2005 installieren. Andernfalls muss man VC2005 einer Reparaturinstallation unterziehen. Einige der Registrierungen für den Explorer werden sonst überschrieben und arbeiten nicht mehr korrekt. Aber das ist ja bei allen Installationen von mehreren VS Versionen schon so gewesen. Immer nacheinander installieren beginnend mit der ältesten Version!

Danach arbeitet VC6 ohne Murren. Wenn man möchte kann man für VC6 (devenv.exe) sogar manuell ein Vista Manifest geben, indem man die entsprechende devenv.exe.manifest Datei erzeugt. Nach Geschmack setzt man requireAdministrator oder asInvoker. Für bestimmte Fälle beim Debuggen bietet sich hier requireAdministrator an.

VS Tipps & Tricks: Kontextmenü für Refactor Befehle in VA-X ab Build 1557

Die Refactoring Befehle in VA-X sind ja schon länger bekannt und sind wirklich ein prima Feature (Build 1534 seit 09.2006).

Nur war es manchmal etwas trickreich an diese Befehle zu kommen. Meistens habe ich die Maus verwendet und über dem Symbol platziert und gewartet, bis das entsprechende Dropdown Symbol aus VA-X erschien. Intuitiv und schnell war das nicht.

Seit dem Build 1557 (052007) finden sich die Refactoring Befehle direkt als erster Menüpunkt im normalen Kontextmenü und sind damit auch über die Tastatur direkt mit der Kontextmenütaste (oder Umschalt+F10) zu erreichen. Ein Grund mehr sich diese Funktionen wirklich mal anzusehen. Sie sind wirklich einen Tipp wert!
Meine Favoriten im Refactoring Menü sind immer wieder Find References und Rename.

Und für alle die meinen ich habe was vergessen oder übersehen: 😉

  • Es gab zwar seit dem Build 1540 einen entsprechenden Befehl den man einem Hotkey zuordnen konnte, aber allzu viele Hotkeys passen in meinen Kopf auch nicht rein.
  • Ja und man kam an diese Befehle auch über Umschalt+Kontextmenütaste erhalten. Nur ist das komplette VA-X Menü leider etwas unaufgeräumt und groß.

TFS: Alle Jobs des SQL Agents für den TFS laufen nicht

Nach der Installation des TFS war im Event Log alle 10 Minuten der folgende Fehler zu lesen:

Ereignistyp:       Warnung
Ereignisquelle:    SQLSERVERAGENT
Ereigniskategorie: Job Engine
Ereigniskennung:   208
Datum:             12.09.2007
Zeit:              12:00:00
Benutzer:          Nicht zutreffend
Computer:          SVR-02
Beschreibung:
SQL Server Scheduled Job ‚TfsWorkItemTracking Process Identities Job‘ (0x152D401A0604DF4D984F5835301DA43F) – Status: Fehler – Invoked on: 2007-09-12 12:00:00 – Message: Auftragsfehler  Es kann nicht bestimmt werden, ob der Besitzer (‚Domäne\TFSSETUP‘) von Auftrag ‚TfsWorkItemTracking Process Identities Job‘ Serverzugriff aufweist. (Ursache: Die Informationen über Windows NT-Gruppe oder -Benutzer ‚Domäne\TFSSETUP‘ konnten nicht abgerufen werden, Fehlercode 0x5. [SQLSTATE 42000] (Fehler 15404)  Die Anweisung wurde beendet. [SQLSTATE 01000] (Fehler 3621)).

Der selbe Fehler wurde auch für alle anderen TFS Jobs angezeigt, die im SQL-Agent eingetragen wurden.
Ganz verstehen kann ich den Fehler bis heute noch nicht. Nicht wenige kämpfen mit diesem Problem, wenn man im Internet nach dem Fehler sucht. Direkte Lösungen dazu habe ich nicht gefunden.
Warum nicht korrekt geprüft werden kann, ob die entsprechenden Accounts in der Domäne sind oder nicht ist mir ein Rästel. Der Fehlercode 5 heißt: Zugriff verweigert.

Die Jobs wurden im SQL Server unter dem Benutzer Domäne\TFSSETUP eingetragen. Der entsprechende Benutzer TFSSETUP ist korrekt Mitglied der Domäne und auch Administrator auf der lokalen Maschine auf der sowohl TFS als auch MS-SQL Server 2005 läuft. Warum dieser Account genutzt wurde und nicht TFSSERVICE ist mir ein Rätsel.
OK, aber selbst wenn ich TFSSERVICE als Besitzer wähle funktionieren die Jobs nicht.

Nachdem ich die Jobs auf NT-AUTORITÄT\SYSTEM gesetzt habe ging es dann.
Verstehe wer will.

PS: Wer meint, dass es an dem Recht „Anmelden als Dienst“ liegt, der rät falsch. Der Account TFSSERVICE hat dieses Recht und damit hatte ich auch keinen Erfolg. 

PPS: Meine Installation ist gemischt und funktioniert aktuell ohne Probleme:
Windows 2003 R2 Deutsch
SQL Server 2005 Deutsch
TFS in Englisch
Nur als Anmerkung, da ich einem der letzten Kommentare noch die Absicht hatte, die Installation auf Englisch Pur umzustellen.

VS-Tipps & Tricks: Der Property Manager, der unbekannte Helfer.

Es gibt oft genug die Problematik, dass man eine bestimmte Environment Variable für ein Projekt setzen will, oder auch dass man für eine Gruppe von Projekten ein bestimmtes Include-Verzeichnis hinzufügen will oder bestimmte andere Projekteinstellungen benötigt.

Der bisherige Weg war meistens Handarbeit wenn es um die Projekteinstellungen ging. Bei Environment Variablen hatte man oft genug wenig Chancen.

Ein Weg ist es, einen Batch File zu schreiben, der die Environment Variablen setzt und dann die IDE mit DEVENV /useenv startet. In diesem Fall werden nur die entsprechenden Environment Variablen für LIB/INCLUDES etc. verwendet. Zusätzlich natürlich auch die eigenen spezifizierten.
Das hat aber den Nachteil, dass man nicht vergessen darf die IDE zu verlassen und neu zu starten hat, bevor man ein neues „normales“ Projekt bearbeiten will.
Summa summarum: Geht, ist aber kein guter Weg.

Es gibt eine weitaus effektivere Möglichkeit Projekteinstellungen einfach zu manipulieren und auch einfach für andere Projekte zu übernehmen: Der Property Manager!

Mit dem Property Manager kann man Projekteinstellungen erzeugen und zusammenfassen. Diese Projekteinstellungen lassen sich in einer XML Datei abspeichern (vsprops-Dateien) und auf andere Projekte auf einfache Art anwenden indem man nur die entsprechende Datei in das Projekt in den Projekteinstellungen einfügt.

Das nette ist, dass der Property Manager es auch erlaubt Environment Variablen zu setzen, die dann in den Optionen und auch den Custom-Build-Steps auf einfache Weise über $(MyUserMacro) nutzen lassen.

Und so geht man vor:

  • Über View -> Other Windows holt man sich den Property Manager auf den Bildschirm. Man kann nun sofort sehen welche aktuellen Properties gesetzt sind. (Zum Beispiel sieht man sofort woher zum Beispiel bei konvertierten Projekten das define _VC80_UPGRADE kommt)
  • Man findet zwei Schalter Add New Project Property Sheet um ein neuen Satz Properties anzulegen und Add Existing Property Sheet um ein bereits existierendes Property Sheet anzuwenden (dazu später).
  • Nun kann man einfach wie man es gewohnt ist, die gewünschten Eigenschaften in diesem Sheet einstellen, die man benötigt. Rechter Mausklick oder Doppelklick genügt und man erhält Zugriff auf alle Eigenschaften der Projekte. Ob es nun den Compiler oder Linker betrifft ist egal.
  • Wichtig ist gleich der zweite Eintrag User Macros. Hier kann man nun nach Lust und Laune Environment Variablen und andere defines setzen. Besonders interessant ist hier auch die Möglichkeit Werte anzuhängen an eine bestehende Environemt Variable. Nett für INCLUDE und LIB!

Zuletzt sei erwähnt, dass sich eine solche vsprops Datei auch einfach in ein bestehendes Projekt eingefügt werden kann. Das geht zum einen über den Property Manager mit dem schon erwähnten Schalter Add Existing Property Sheet , oder aber auch direkt über die Projekteinstellungen. Dazu einfach die Projekteigenschaften öffnen und den Abschnitt General auswählen. Dort findet man den Eintrag Inherited Projekt Property Sheets in dem man direkt die entsprechenden vsprops Dateien angeben kann.

❗ Man sollte aber auch daran denken, diese speziellen vsprops Dateien dem eigenen Source Control System hinzuzufügen und auch eine entsprechende Dokumentation dazu anzulegen.
Gut ist es auch ein zentrales Verzeichnis für diese Projekteinstellungen anzulegen um eine einfache Wiederverwendung zu ermöglichen.

Auf einmal Zertifikatsfehler im IE…

Ich komme nach Hause und schmeiße meine Kiste an.
Ich logge mich ein und bekomme als erstes von NOD32 gesagt, dass meine Signaturdatenbank veraltet ist. Komisch, ein Blick in die Konsole ergibt: Die Signaturdatenbank ist von heute.

Dann schmiert ein Programm in der Autostart Gruppe sofort ab, dass mit die täglichen Losungen anzeigt.

OK. Ich starte den IE und bekomme sowohl auf der Google-Seite als auch auf der Ebay Seite sofort Zertifikatsfehler angezeigt. Jetzt wird es aber zu bunt!
Was ist los? Windows Update geht auch nicht…

Ich bin am verzweifeln. Ich mache mich schon darauf gefasst den ganzen Rechner neu aufsetzen zu müssen, da fällt mein Blick auf die Datumsanzeige… 13.09.2164.

So ein Schrott. Meine Tochter hat anscheinend aus Versehen das Datum des Systems verändert! Alles andere war eine Folge dieses falschen System-Datums. Uffff…

Sicherheitsupdate für Microsoft Visual Studio 2005 Service Pack 1 (KB937061) wird immer wieder installiert

Vielleicht geht es einigen von Euch genauso und bekommt von Windows Update das „Sicherheitsupdate für Microsoft Visual Studio 2005 Service Pack 1 (KB937061)“ immer wieder installiert.

Scheinbar trifft es alle diejenigen, die sich Crystal Reports nicht angetan haben, wie z.B. mich. Alle meine 4 Rechner (Vista+XP x86) sind davon betroffen. Dies entnahm ich den Infos eines Microsoft MSFT’s aus diesem Thread. Zitat:

Eric Brodish [MSFT]
If you have VS 2005 SP1 present but the Crystal Reports feature is not present, MS07-052 is re-offered. Customers are protected and are not at risk to this vulnerability We will be updating the detection on Microsoft Update, customers that have already installed this update need to take no action.  We are working to resolve this issue and it should be fixed shortly Thank you Eric

Gleiches scheinen andere auch herausgefunden haben in den MS-Foren

Wie stellt man es ab?

  • Einfach über den IE die Microsoft Update Seite aufrufen.
  • Benutzerdefinierte Suche starten
  • Die Updates anzeigen lassen
  • Den Haken entfernen und zusätzlich den Haken bei „Dieses Update nichtmehr anzeigen“ setzen.

Beschreibung dieses Security Updates:
http://support.microsoft.com/kb/937061

Die Cx2y Falle…

In einem Programm habe ich diese unscheinbare Schleife für eine spezielle Analyse im Debug-Mode eingebaut.

for (POSITION pos= m_aBind.GetHeadPosition(); pos; )

 S_BIND& b= m_aBind.GetNext(pos);
 TRACE(__FUNCTION__ “  %-32s %2d\n“,
  CT2A(b.sName.GetString()),
  b.GetStatus());
}

Sieht auf den ersten Blick OK aus.
Auf den zweiten Blick wundert einen evtl. die Nutzung von CT2A. Warum nehme ich nicht einfach den Zeiger von GetString wie er ist? Es ist ja ein PCTSTR! Begründung:

  1. Das Projekt ist ein Unicode Projekt. 
  2. CT2A verwende ich hier, weil die TRACE Funktion in dieser Schreibweise nur MBCS Strings verwendet. D.h. %s erwartet einen Zeiger auf einen MBCS String.
  3. Die _T Schreibweise für die Ausgabemaske ist hier nicht geeignet, weil ich gerne den Funktionsnamen auch mit ausgegeben hätte. Und __FUNCTION__ ist nun mal eine normale String-Konstante, und kein wchar_t-String.
  4. T2A verwende ich nicht, weil dies in einer Schleife tödlich ist, weil der Stack immer weiter anwächst.

OK! Soweit dazu, warum der Code aussieht wie er aussieht.

❗ Nur… es kommt nur Schrott dabei heraus!
Die Ausgabe zeigt brav, den Text, den ich haben möchte, nur die Zahlenwerte stimmen in keiner Weise mit den Rückgabewerten von GetStatus überein! Warum? ❓

Was ist passiert? Der Debugger gibt schnell Auskunft:
CT2W erzeugt ein Objekt vom Typ CW2AEX!!! Dieses Objekt ist aber größer als ein PCSTR Zeiger. Dieses Objekt umfasst bei meinen Projekteinstellungen 4 Bytes für einen Zeiger plus einen char-Array der Größe 128. TRACE hätte aber gerne einen 4-Byte Zeiger auf dem Stack und danach für die Ausgabe einen Integer.
Ausgegeben, werden also die 4 ersten Bytes des Puffers von CW2AEX und nicht die gewünschten numerischen Werte für GetStatus!

Das ist übrigens die selbe Falle in die man tritt, wenn man CString direkt ohne CString::GetString in printf/TRACE und Konsorten verwendet. Nur hat man hier das Glück, dass ein CString exakt 4 Bytes groß ist und genau aus einem Zeiger auf einen PTSTR besteht.

Wie macht man es richtig?
Genau… man führt den entsprechenden cast ein. Der cast benutzt nun den cast-Operator der Klasse CW2AEX, und der liefert uns den Zeiger den wir wollten.

for (POSITION pos= m_aBind.GetHeadPosition(); pos; )
{
 S_BIND& b= m_aBind.GetNext(pos);
 TRACE(__FUNCTION__ “ %-32s %2d\n“,
  static_cast<PCSTR>(CT2A(b.sName.GetString())),
  b.GetStatus());
}

Amerkungen:

  • Ich brauche wahrscheinlich nicht zu erwähnen, dass ähnliche Probleme mit CA2W, CA2T etc. auch auftauchen können.
  • An den meisten Stellen an denen, wir diese Konvertierungen, wie z.B. CT2A verwenden wird auch direkt ein PCTSTR erwartet, oder eben ein Zeiger auf den entsprechend konvertieren String. Dadurch wird implizit der Konvertierungs-Operator der Klasse aufgerufen und damit funktioniert ales wie es soll.
  • Auch wenn das Projekt ein MBCS Projekt gewesen wäre, hätte es die selben Probleme verursacht. Denn in diesem Fall wird aus CT2A eine Objekt der Klasse CA2AEX. Im Gegensatz dazu würde T2A einfach zu ener Noop.

VS-Tipps & Tricks: Schnelle Navigation über Strg+Tab

Wenn man mit dem, aus anderen MDI-Applikationen bekannten, Tasten Strg+Tab in andere Dokumente wechselt, dann wird auch ein Navigationsfenster angezeigt. Am Anfang wunderte mich, was das für ein Geflackere war, wenn ich wie gewohnt Strg+Tab und Umschalt+Strg+Tab verwendete. Bis ich entdeckte, dass man das geöffnete Navigationsfenster noch weitaus besser nutzen kann als nur als Navigationshilfe, wo man mit dem nächsten Strg+Tab landet.

Sofort nach Drücken der Tasten Strg+Tab, kann man bei gedrückter Strg-Taste in dem Navigationsfenster über die Cursor-Tasten jede beliebige offene Datei auswählen, ohne x-mal Strg+Tab zu drücken. Besonders nett ist, dass man auch die Pfeil-Rechts und Pfeil-Links Tasten nutzen kann.

Besonders interessant ist hier, dass man auch die Toolfenster, wie z.B. den Solution-Explorer, den Ressource-View, oder im Debugger den Call-Stack sofort erreichen kann (auch wenn es dazu direkte Hotkeys gibt).