Programmstart-Cursor Blues
Ein SuRun-Tester hatte bemerkt, dass nach dem Anzeigen der SuRun-Dialoge der „Programmstart-Mauszeiger“ nicht verschwand. Es sah so aus, als wenn im Hintergrund noch etwas startet und zwar für mehr als 5 Sekunden.
Nach etwas Suchen hatte ich die Ursache. Wenn Windows einen GUI-Prozess startet, zeigt es den Programmstart-Zeiger an, bis der Prozess läuft.
Man kann das unterbinden, wenn man bei CreateProcess in dwFlags der STARTUPINFO die Flag STARTF_FORCEOFFFEEDBACK setzt. Tja, und wenn SuRun.exe von Explorer gestartet wurde, der das Flag nicht setzt? Dann pappt die Sanduhr am Pfeil!
Das ein Prozess läuft, erkennt Windows übrigens daran, dass er Nachrichten für ein Fenster abfragt (PeekMessage/GetMessage)[, also daran, dass er gerade nicht läuft…(David Solomon: (in etwa) „When Task Manager says, a Process is running, it is not running“)].
Was aber, wenn der Prozess gar kein Fenster erstellt, weil er das nur macht, wenn er mit dem Benutzer kommunizieren muss, wie SuRun? Einfach den Mauszeiger setzen geht nicht. Windumms setzt ganz auf den Pfeil mit Sanduhr, egal, was man macht.
Ein Fenster erstellen und GetMessage rufen muss man! Also habe ich eine Mini-Routine geschrieben, die ein unsichtbares Fenster erstellt, eine Nachricht dahin schickt, diese Nachricht abholt, verwirft und das Fenster dann freigibt:
static void HideAppStartCursor() { HWND w=CreateWindow(_TEXT("Static"),0,0,0,0,0,0,0,0,0,0); PostMessage(w,WM_QUIT,0,0); MSG msg; GetMessage(&msg,0,0,0); DestroyWindow(w); }
Nun glaubt Windows, SuRun würde laufen und entfernt ganz schnell die Sanduhr vom Pfeil.
Eine schnöde Windumms-Funktion für „Alles ok ich bin am laufen“ hätte es doch auch getan…
Am 12. März 2009 um 22:08 Uhr
Schon abenteuerlich, was man manchmal für Würgarounds einbauen muss.