Autor Beitrag
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19272
Erhaltene Danke: 1740

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Fr 23.01.09 02:26 
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:
ausblenden volle Höhe Delphi-Quelltext
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:
// Zeigt das Startmenü an der angegebenen Position auf dem Bildschirm an.
// von: jaenicke - delphi-forum.de
// Parameter:
// uPosition        die Position, an der die Anzeige erfolgen soll
// uPosRelativeTo   wenn <> 0, dann bezieht sich uPosition auf das als Handle angegebene Fenster
// uMoveOnTopOfPos  wenn True, dann wird das Startmenü oberhalb von uPosition angezeigt
procedure ShowStartMenu(uPosition: TPoint; uPosRelativeTo: Hwnd;
  uMoveOnTopOfPos: Boolean);
var
  StartMenuWinRect: TRect;
  DropShadow: BOOL;
  StartMenuHandle: HWND;
begin
  // Wenn die Position als Clientposition gegeben ist, in eine globale umwandeln
  if uPosRelativeTo <> 0 then
    ClientToScreen(uPosRelativeTo, uPosition);
  // das unsichtbare Startmenüfenster suchen
  StartMenuHandle := FindWindow('DV2ControlHost'nil);
  if uMoveOnTopOfPos then
  begin
    // Wenn angegeben wurde, dass das Menü oberhalb der angegebenen Position
    // angezeigt werden soll, diese um dessen Höhe nach oben verschieben.
    GetWindowRect(StartMenuHandle, StartMenuWinRect);
    uPosition.Y := uPosition.Y - StartMenuWinRect.Bottom + StartMenuWinRect.Top;
  end;
  // Workaround: DropShadow Problem
  // Unter Windows XP hinterlässt die Anzeige des Startmenü an anderer Stelle
  // den Schatten unterhalb des Menüs, wenn diese aktiviert sind.
  // Deshalb diese ab XP vorher aus- und danach wieder anschalten, falls sie
  // aktiviert sind.
  if CheckWin32Version(51then
  begin
    SystemParametersInfo(SPI_GETDROPSHADOW, 0, @DropShadow, 0);
    if DropShadow then
      SystemParametersInfo(SPI_SETDROPSHADOW, 0, Pointer(False), 0);
  end;
  // Startmenü positionieren und anzeigen, Größe unverändert lassen
  SetWindowPos(StartMenuHandle, 0, uPosition.X, uPosition.Y, 00,
    SWP_NOSIZE or SWP_SHOWWINDOW);
  // DropShadows ggf. wieder aktivieren
  if CheckWin32Version(51and DropShadow then
    SystemParametersInfo(SPI_SETDROPSHADOW, 0, Pointer(True), 0);
end;
Aufruf, hier mit den Koordinaten bezogen auf das Formular:
ausblenden 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:
ausblenden 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):
user defined image

Schönen Gruß,
Sebastian


ShowStartMenu_Vista.png  (25.63 KB) Download (Rev 0)
 (708x, 708x gesamt)
Beschreibung:  


Zuletzt bearbeitet von jaenicke am So 08.02.09 14:11, insgesamt 5-mal bearbeitet