Das XP-Startmenü selbst auf dem Bildschirm anzeigen
Da gerade die Frage im Forum gestellt wurde wie das Startmenü selbst an einer anderen Stelle als der normalen angezeigt werden könne, hier der Versuch einer Lösung. Diese funktioniert allerdings nur mit dem neuen unter XP eingeführten Startmenü.
Die Prozedur dafür sieht so aus:
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43:
| procedure ShowStartMenu(uPosition: TPoint; uPosRelativeTo: Hwnd; uMoveOnTopOfPos: Boolean); var StartMenuWinRect: TRect; DropShadow: BOOL; StartMenuHandle: HWND; begin if uPosRelativeTo <> 0 then ClientToScreen(uPosRelativeTo, uPosition); StartMenuHandle := FindWindow('DV2ControlHost', nil); if uMoveOnTopOfPos then begin GetWindowRect(StartMenuHandle, StartMenuWinRect); uPosition.Y := uPosition.Y - StartMenuWinRect.Bottom + StartMenuWinRect.Top; end; if CheckWin32Version(5, 1) then begin SystemParametersInfo(SPI_GETDROPSHADOW, 0, @DropShadow, 0); if DropShadow then SystemParametersInfo(SPI_SETDROPSHADOW, 0, Pointer(False), 0); end; SetWindowPos(StartMenuHandle, 0, uPosition.X, uPosition.Y, 0, 0, SWP_NOSIZE or SWP_SHOWWINDOW); if CheckWin32Version(5, 1) and DropShadow then SystemParametersInfo(SPI_SETDROPSHADOW, 0, Pointer(True), 0); end; |
Aufruf, hier mit den Koordinaten bezogen auf das Formular:
Delphi-Quelltext
1:
| ShowStartMenu(Point(Button1.Left, Button1.Top), Form1.Handle, CheckBox1.Checked); |
Oder um es links oben an der Formularecke anzuzeigen z.B. kann man auch Bildschirmkoordinaten bezogen auf den ganzen Bildschirm übergeben:
Delphi-Quelltext
1:
| ShowStartMenu(Point(Form1.Left, Form1.Top), 0, CheckBox1.Checked); |
Getestet unter:
Windows XP
Windows Vista
Windows 7
Getestete Delphiversionen:
Delphi 7
Delphi 2006
Delphi 2007
Delphi 2009
Bekannte Probleme:
- Unter Windows Vista ist das Menü zum Neu Starten, Herunterfahren, etc. nicht funktionsfähig.
- Unter Windows 7 setzt jedes Ausklappen eines Anwendungsmenüs die Position auf die normale Position
- Bei ViStart (einem Startmenüersatz) funktioniert nur die horizontale Positionierung, vertikal liegt es über der Taskleiste
Screenshot unter Windows Vista (liegt auch im Anhang):
Schönen Gruß,
Sebastian