Text aus eine MessageBox einfach in die Zwischenablage kopieren…

Jeder kennt das, der schon mal an Supportfällen gearbeitet hat.

Der Kunde bekommt eine Fehlermeldung und meistens ist es eine simple MessageBox die dort angezeigt wird. Was wird gemacht? Der Kunde drückt Alt+Druck und schickt einen Screenshot.

Oder man will selber nach dem Text in Google suchen und tippt mühselig die Meldung ab.

Dabei geht es so einfach: Strg+C oder einfach Strg+Einfg drücken und schon wird der Text der Messagebox auf wundersameweise in die Zwischenablage kopiert:

---------------------------
Titel der MessageBox
---------------------------
Text der MessageBox
---------------------------
OK   Abbrechen  
---------------------------

Dies geht auf allen Windows Betriebssystemen!

Besonders interessant ist das auch der Windows Vista Task Dialog diese Funktionalität enthält, wie man z.B. mit dem Notepad unter Vista ausprobieren kann.

[Window Title]
Editor
[Main Instruction]
Möchten Sie die Änderungen an Unbenannt speichern?
[Speichern] [Nicht speichern] [Abbrechen]

Vista SP1 und so manche Ruhezustand/Hibernate Probleme

Irgendwie wunderte ich mich in letzter Zeit, dass mein Outlook 2007 beim Neustart meines PCs meinte, es wäre nicht korrekt beendet worden. Und irgendwann habe ich im Event Log dann den Folgenden Eintrag gefunden:

Das System wurde zuvor am 11.05.2008 um 19:26:46 unerwartet heruntergefahren.

Nach ein wenig Analyse kam ich dahinter, dass gemäß Energiesparplaneinstellungen mein Rechner irgendwann in in den Ruhezustand (Hibernate) geht. Allerdings beim Neueinschalten des Rechners nicht wieder den letzten Zustand wieder herstellt.
Die Startmeldung, dass das System nicht ordnungsgemäß herunter gefahren wurde. Diese Meldung habe ich irgendwie immer übersehen, da ich meistens meinen Rechner einschalte und wieder weg gehe und noch anders erledige bis er gebootet hat.

Um solche Probleme wird sehr viel Blödsinn im Netz geschrieben. Zu allerst stehen die Tipps mit einem BIOS Update, und alles mögliche andere Spielereinen mit POWERCFG und anderes. Für mein Problem trafen sie alle nicht zu. Ich hätte einfach damit leben können und mit POWERCFG -h OFF einfach den Ruhezustand ausschalten können. Aber irgendwie lassen mich solche Probleme nicht los und ich will sie lösen.
Einiges Suchen und viele, viele  erfolglose Versuche und Tests brachten mich schließlich zu dieser Lösung, die hier in diesem Thread beschrieben ist:
http://forums.microsoft.com/TechNet/ShowPost.aspx?PostID=2897541&SiteID=17

  1. Run CMD.EXE as administrator
  2. Run the following command: bcdedit -enum all
    Look for „Resume from Hibernate“ in the output from the command above(example below):
    Resume from Hibernate
    ———————
    identifier {3d8d3081-33ac-11dc-9a41-806e6f6e6963}
    device partition=C:
    path \Windows\system32\winresume.exe
    description Windows Vista (TM) Enterprise (recovered)
    inherit {resumeloadersettings}
    filedevice partition=C:
    filepath \hiberfil.sys
    pae Yes
    debugoptionenabled No
  3. Once you have found it, copy the value for identifier (in this example : {3d8d3081-33ac-11dc-9a41-806e6f6e6963})
  4. Run the following command:
    bcdedit /deletevalue {3d8d3081-33ac-11dc-9a41-806e6f6e6963} inherit
  5. Test hibernation.

OK! Das wäre behoben. Alles wieder heile.

Da ich aber jetzt schon etwas hin und her gespielt hatte mit POWERCFG -h ON|OFF etc. fragte ich mich nun, warum in meinem Startmenü, Energiesparen und alles mögliche andere angeboten wird, aber nicht Ruhezustand. Was habe ich nun kaputt repariert?

Komischer Weise lies der Rechner sich sofort in den Ruhezustand per Netzschalter-Tastendruck am PC versetzen, genauso wie eingestellt. Aber im Startmenü erscheint es nicht. Bei meinem Laptop geht es doch auch?

Einiges Lesen und Suchen in der Online-Hilfe brachte dann die Erklärung! Ja es ist wirklich beschrieben:
Nur wenn der Hybriden Standbymodus ausgeschaltet ist, erscheint auch der Ruhezustand im entsprechenden Startmenü.

Systemsteuerung -> System und Wartung -> Energieoptionen -> Energiesparplaneinstellungen bearbeiten -> Erweiterte Energieeinstellungen ändern -> Energiesparen -> Hybriden Standbymodus zulassen -> Einstellung: Aus

Jetzt ist wieder alles so, wie ich es will…

Was tun wenn Groove 2007 nicht mehr startet?

Ich nutze gerne Groove 2007 für einige Daten, die ich zwischen einigen Rechnern (Laptop, Desktop, Firmen-Desktop) austausche.
Leider startete aus irgend einem Grunde mein Groove 2007 auf meinem Desktop-Rechner nicht mehr. Groove crashte sofort, wenn es in irgend einer Form gestartet wurde. Auch das Eventlog zeigte entsprechende Einträge über den Crash, aber eben keine weiteren Informationen.

Also:

  • Reparaturinstallation: erfolglos
  • Deinstallation neue Installation: erfolglos
  • Gesharte Ordner gelöscht: erfolglos
  • Googlen nach ähnlichen Probleme: erfolglos

Schließlich stieß ich auf GrooveClean.exe im Office12 Verzeichnis. Googlen ergab den folgenden Artikel:
http://support.microsoft.com/kb/907854/en-us

Na ok! Dann mal los. GrooveClean brachte keinen Erfolg aber nach GrooveClean -all startete Groove wieder und ich konnte mir (etwas mühsam) meinen Account und die gesharten Ordner wieder einrichten.

Anmerkung:
Es ist wirklich ratsam seine Kontodaten als Datensicherung aus Groove zu exportieren und an einem sicheren Ort zusätzlich zu verwahren!

Hotfix für UseMSPrivateAssemblies.h und VC-2008

Einige nutzen ja meine Lösung für private CRT und MFC Assemblies unter VC-2005, die ich in dem diesem Artikel unter Codeproject veröffentlicht habe
http://www.codeproject.com/KB/cpp/PrivateAssemblyProjects.aspx

Das Interesse und die Nachfrage ist groß dieses Verfahren auch unter VC-2008 zu nutzen.
Da ich aber aktuell wenig Zeit habe den Artikel komplett zu überarbeiten, veröffentliche ich den relevanten Code hier erst mal vorab als „Hotfix“. Dieser Hotfix setzt voraus, dass das aktuelle Feature Pack installiert ist. Der Code ist nicht auf die RTM Version hin zugeschnitten und getestet.

UseMSPrivateAssemblies.h

// Version 2.0 by Martin Richter [WWJD]
// Supports VC-2005 and VC-2008
#pragma once    

#ifndef RC_INVOKED
// Avoid problems with the resource compiler if included    

// This defines bock the creation in the header files
#pragma message("Using private assemblies for the MS runtimes")
#define _STL_NOFORCE_MANIFEST
#define _CRT_NOFORCE_MANIFEST
#define _AFX_NOFORCE_MANIFEST
//#define _ATL_NOFORCE_MANIFEST    

// The next statements block the linker from including object files in the
// CRT and the MFC, that would create manifest pragmas too.
#ifdef __cplusplus
extern "C" {            /* Assume C declarations for C++ */
#endif    

__declspec(selectany)       int _forceCRTManifest;
__declspec(selectany)       int _forceMFCManifest;
// __declspec(selectany)    int _forceAtlDllManifest;    

// The next symbols are used by the several versions of VC 9.0
__declspec(selectany)       int _forceCRTManifestRTM;
__declspec(selectany)       int _forceMFCManifestRTM;
__declspec(selectany)       int _forceMFCManifestCUR;    

#ifdef __cplusplus
}                        /* __cplusplus */
#endif    

// We use crtassem.h with the defines there. It just gives us the
// versions and name parts for the dependencies.
// Note that there is also a MFCassem.h but this include file has the
// manifest pragma's already in it. So we can't use it
//
// Three files are controlling this crtassem.h, MFCassem.h and atlassem.h!
// Happily __LIBRARIES_ASSEMBLY_NAME_PREFIX is used in CRT, MFC and ATL!
// Doing it right would need to use _MFC_ASSEMBLY_VERSION for the MFC
// but in fact _CRT_ASSEMBLY_VERSION and _MFC_ASSEMBLY_VERSION and
// _ATL_ASSEMBLY_VERSION are the same
//  - VC-2005 SP1 8.0.50727.762
//  - VC-2008 RTM 9.0.21022.8
//  - VC-2008 Feature Pack 9.0.30411.0 (used if _BIND_TO_CURRENT_VCLIBS_VERSION
//    and _BIND_TO_CURRENT_MFC_VERSION are defined to 1)    

#include <crtassem.h>

// We don't have a seperate block for the Debug version. We just handle
// this with a extra define here.
#ifdef _DEBUG
#define __LIBRARIES_SUB_VERSION    "Debug"
#else
#define __LIBRARIES_SUB_VERSION    ""
#endif    

// Manifest for the CRT
#pragma comment(linker,"/manifestdependency:\"type='win32' "                        \
    "name='" __LIBRARIES_ASSEMBLY_NAME_PREFIX "." __LIBRARIES_SUB_VERSION "CRT' "   \
    "version='" _CRT_ASSEMBLY_VERSION "' "                                          \
    "processorArchitecture='x86' \"")    

// Manifest for the MFC
#pragma comment(linker,"/manifestdependency:\"type='win32' "                        \
    "name='" __LIBRARIES_ASSEMBLY_NAME_PREFIX "." __LIBRARIES_SUB_VERSION "MFC' "   \
    "version='" _CRT_ASSEMBLY_VERSION "' "                                          \
    "processorArchitecture='x86'\"")    

// #pragma comment(linker,"/manifestdependency:\"type='win32' "                     \
//     "name='" __LIBRARIES_ASSEMBLY_NAME_PREFIX ".MFCLOC' "                        \
//     "version='" _CRT_ASSEMBLY_VERSION "' "                                       \
//     "processorArchitecture='x86'\"")    

// Manifest for the ATL
// #pragma comment(linker,"/manifestdependency:\"type='win32' "                     \
//    "name='" __LIBRARIES_ASSEMBLY_NAME_PREFIX ".ATL' "                            \
//    "version='" _CRT_ASSEMBLY_VERSION "' "                                        \
//    "processorArchitecture='x86' \"")    

#endif // RC_INVOKED

Anmerkungen:

  • Im Endeffekt sind nur 3 Zeilen (26-28) hinzugekommen.
  • Diese Version funktioniert sowohl für VC-2005 als auch VC-2008!
  • Unter Vista wird allgemein das Problem beobachtet, das private Assemblies nur genutzt werden können, wenn diese in einem Unterverzeichnis liegen. Liegen die Assembly Dateien im gleichen Verzeichnis wie die EXE kommt es zu einem Fehler „The application failed to initialize properly (0xc0000034). „ Dieser Sache bin ich (und andere) auf der Spur.
  • Es spielt für diesen Code keine Rolle ob die beiden Defines _BIND_TO_CURRENT_VCLIBS_VERSION und _BIND_TO_CURRENT_MFC_VERSION gesetzt wurden. Werden diese Defines auf 1 gesetzt bevor UseMSPrivateAssemblies inkludiert wird, dann werden die Manifeste so erzeugt, dass die Feature Pack DLLs gezogen werden. Sind diese beiden Defines nicht gesetzt werden Manifeste für die RTM Version erzeugt.
    Ich empfehle dringend diese beiden Defines zu setzen ❗

Das ist erstmal ein Schnellschuss für alle, die die es etwas eiliger haben.

Der Vorteil gegenüber der Lösung, bei der die Manifeste manuell bearbeitet werden, wie es zum Beispiel Jochen Kalmbach in seinem Blog vorgestellt hat ist klar:
Man muss eben nichts manuell machen 🙂
Es macht wieder alles der Compiler und Linker.

Vista Stil bei Tree-Controls und List-Controls

Unter Vista wurden die Tree- und List-Controls noch einmal kräftig aufgemöbelt.
Diesen neuen Look kann man auch in seinen Applikationen nutzen und das mit 2 simplen Codezeilen.

#pragma comment(lib,"uxtheme.lib") 
SetWindowTheme(m_myCtrl.GetSafeHwnd(),L"Explorer",NULL);

Und schon hat man die neue Darstellung des Tree-Controls mit den Dreiecken, die Knotenlinien sind weg.
Beim List-Control hat man nun die hellblaue Färbung mit dem Hover-Effekt.

Vorraussetzung dafür ist, dass auch ein Manifest für die Windows Common Controls Version 6 vorliegt. Dem entsprechend ist SetWindowTheme und die Uxtheme.dll erst ab Windows XP verfügbar. Wer das ganze auch kompatibel mit Windows 2000 haben möchte, der verwendet natürlich das dynamische Laden der Uxtheme.dll und sucht den Einsprungpunkt für SetWindowTheme mit GetProcAddress!

Siehe auch MSDN Doku zu SetWindowTheme

Vista SP1 Backup Dateien freigeben

Wer mal kurz wieder 1GB Speicher zurückhaben möchte nach der Vista SP1 Installation, der kann einfach die erzeugten Backup Dateien entfernen. Natürlich nur wenn man SP1 auch wirklich nicht mehr entfernen will.

Dazu einfach das kleine Programm vsp1cln aufrufen:

%windir%\system32\vsp1cln.exe

Die komplette Dokumentation findet sich hier:
http://technet2.microsoft.com/WindowsVista/en/library/0505991e-49c2-494b-8703-257a14c3d4721033.mspx?mfr=true

Windows Vista SP1 verfügbar auf Windows Update

Das Windows Vista SP1 ist ab sofort als Download verfügbar.

Mehr dazu hier:
http://windowsvistablog.com/blogs/windowsvista/archive/2008/03/18/windows-vista-sp1-released-to-windows-update.aspx

Die lockeren 435MB für das standalone Update gibt es hier zum Download:
http://www.microsoft.com/downloads/details.aspx?displaylang=de&FamilyID=b0c7136d-5ebb-413b-89c9-cb3d06d12674

Wird das SP1 über Windows Update geladen ist es kleiner, er lädt ca. 70MB und dann noch einiges bei Bedarf nach!

Hotfix für GDI Leaks unter Windows XP-SP2/2003 Server in MFC Applikationen

Unter XP SP2 und Windows 2003 Server kann es bei eingeschalteten Themes zu GDI-Leaks kommen. Speziell wird hier auf MFC Anwendungen hingewiesen (siehe dazu meine Anmerkung unten).

Die Beschreibung und der Download-Link für den Hotfix finden sich hier:
MFC applications leak GDI objects on computers that are running Windows Server 2003 or Windows XP

Anmerkung:

Dies ist ein Hotfix für Theme Handler unter Windows 2003 und Windows XP SP2. Er greift nicht in die MFC ein ❗
Man muss also eigentlich davon ausgehen, dass der Bug im Windows Themes Kern steckt und nichts mit der MFC zu tun hat, sondern eher damit zu tun hat wie in der MFC mit Windows Ressourcen umgegangen wird.
Den Effekt bekommt man ziemlich einfach hin, indem man mit dem Wizard eine MFC-MDI Applikation anlegt. Dann einfach Strg+N festhalten und alle Fenster wieder schließen mit Strg+F4, danach findet man einige Hundert GDI Objekte ausgewiesen im Task-Manager, die vorher nicht da waren.
Ich habe einen Test mit dem MDI-Sample aus dem Petzold gemacht und dieses zeigt diesen Effekt nicht. Evtl. liegt es auch einfach nur an dem Umgang mit den Toolbars. Genaueres konnte ich nicht herausbekommen. 

  • Erstaunlich 1.: Dieser Patch ist mit 2 Jahren doch relativ alt (März 2006) und er ist mir erst durch eine Diskussion in einer Produkt-Gruppe über den Weg gelaufen …
  • Erstaunlich 2.: Dieser Patch wird nicht durch den Windows Update Service installiert, obwohl er in meinen Augen da rein gehört ❗
    Ob nun der Update Service nun den primären Fokus auf Sicherheit hat oder nicht. Ich empfinde dieses Verhalten des Theme Handlers als kritisch!

Vista: Wie man den Kontextmenübefehl „Eingabeaufforderung hier öffnen“ auf die Powershell umbiegen kann

Torsten Schröder hat mir einen netten Kommentar in meinem letzten Blog-Artikel Vista: Wie man den Kontextmenübefehl “Eingabeaufforderung hier öffnen” umbiegen kann gegeben. Er meinte (Zitat):
„noch einen Tick besser fänd ich es, wenn man es Richtung Powershell umbiegt!“

Nun das gefällt mir auch und es ist auch nicht schwer. Mit dem folgenden kleinen Hack in der Registry kann man auch diesen erweiterten Kontextmenübefehl auch die Powershell umbiegen.

Einfach in der Registry unter HKEY_CLASSES_ROOT\Directory\shell\cmd\command
den Eintrag: cmd.exe /s /k pushd „%V“
z.B. in „C:\Windows\system32\WindowsPowerShell\v1.0\powershell.exe“ -noexit -command „set-location ‚%V'“ tauschen.

Damit lässt sich nun auch für mich das erweiterte Kontextmenü unter Vista perfekt nutzen:

  • 4NT integriert sich mit eigenen Kontextmenü-Befehlen.
  • und die Powershell ist nun über das erweiterte Kontextmenü des Vista-Explorers durch das Drücken der Umschalt-Taste extrem einfach zu erreichen.

Anmerkung: Wer den Faden verloren hat, alles beginnt mit diesem Tipp:
Zusätzliche Befehle im Explorer-Kontextmenü von Vista  😉

Vista: Wie man den Kontextmenübefehl „Eingabeaufforderung hier öffnen“ umbiegen kann

In meinem Artikel Zusätzliche Befehle im Explorer-Kontextmenü von Vista habe ich ja erwähnt, dass der Menüpunkt Eingabeaufforderung hier öffnen immer CMD.EXE verwendet und nicht den Befehlszeileninterpreter, der durch COMSPEC definiert ist.
Aber mit einem kleinen Hack in der Registry kann man auch diesen Befehl auf den eigenen Befehlszeileninterpreter umbiegen.

Einfach in der Registry unter HKEY_CLASSES_ROOT\Directory\shell\cmd\command
den Eintrag: cmd.exe /s /k pushd „%V“
z.B. in „C:\Program Files\4NT\4NT.EXE“ /s /k pushd „%V“ tauschen.

Anmerkung: Da 4NT normalerweise auch seine eigenen Einträge in den Kontextmenüs des Explorers macht, kann man es natürlich auch als Vorteil ansehen, wenn man bei Bedarf den originalen Befehlszeileninterpreter starten kann. 🙂