Entwickler-Ecke

Windows API - Windows Startmenü ersetzten ??


matze - Do 22.05.03 19:06
Titel: Windows Startmenü ersetzten ??
Hallo !!

wie kann ich denn das windows startmenü durch eni eigenes popupmenü ersetzten ?

geht das einfcher als:
-erkennen, wenn auf START geklick wird (keinen plan wie das geht)
-das Startmenü versecken (keinen plan wie das geht)
-ein eigenes PopUp menü an der stelle aufmachen


Pascal - Fr 23.05.03 13:35

Eine einfachere Möglichkeit kenne ich nicht.
Aber wo ist das Problem es genauso zu machen wie du gesagt hast?
-Ein Formular ohne Titelleiste ohne Seitenränder auf Größe des Startbuttons, dass immer im Vordergrund ist auf den Startknopf setzen (Wie das geht weißt du)
-im ONclick Ereigniss ein PopUp Menu Aufmachen


Delete - Sa 24.05.03 09:21

Die einfachere Möglichkeit wäre, das eigene Programm als neue Shell zu laden. Es würde dann anstelle des Startmenüs angezeigt werden. Zumindest unter Win 9x klappt das - durch einen Eintrag in der "system.ini" (IMHO).


BungeeBug - Sa 24.05.03 09:43

Hi,
der Pferdefuss an der "System.ini-Idee" ist das dann auch der Rest der Shell weg is. Damit mein ich die Programmleiste unten im Bild, das SysTray , die Uhr , das Menü wenn man rechts auf irgendwas klickt ... alles ... das müsste dann deine neue Shell alles selbst können!

MfG BungeeBug


matze - Sa 24.05.03 10:51

also per neue shell ist mir das zu aufwändig !!!

aber kann man denn nicht irgenbdwie abfragen, ob das startmenü angeklickt wird, und das dann wegmachen und an der stelle ein eigenes popup aufpoppen lassen ??

ich wiess nur nicht, wie ich dne startklick abfrage, das startmenü verschwinden lasse und die koordinaten für mein poup bekomme. also unterm strich weis ich da gar nix.


Pascal - Sa 24.05.03 12:14

Also, wenn dir das mit dem Shell zu aufwändig ist, dann gibt es ja noch die Möglichkeit meine Lösung in Betracht zu ziehen.
Du kannst damit
-Erkennen wenn auf start geklickt wird(ist ja einfach das onclick-Ereignis)
-verhindern das auf start geklickt wird(ist ja das Formular drauf)
-Und einfach ein PopUp aufmachen

oder ist dir das zu unelegant?
Sonst sehe ich keinen Nachteil, und einfach ist es auch.


matze - Sa 24.05.03 13:46

ja dann erzähl mir mal, wie ich das onClick ereignis vom Windows Start Button in der Taskleiste bekomme !!!

und wie wäre es mal, wenn du "deine methode" mal genauer eräutern würdest ?


Pascal - Sa 24.05.03 15:27

Ich dachte das hätte ich bereits:
Pascal hat folgendes geschrieben:
-Ein Formular ohne Titelleiste ohne Seitenränder auf Größe des Startbuttons, dass immer im Vordergrund ist auf den Startknopf setzen


Mit onclick meine ich das Onclick-Ereignis des Formulars(Auf den Startbutton kann man dann ja nicht mehr drücken)

also insgesamt einfach

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
procedure TForm1.FormCreate(Sender: TObject);
begin
  borderstyle:=bsnone;
  height:=24;
  width:=60;//kommt wahrscheinlich auf die Auflösung an
  left:=0;
  top:=screen.height-height-1;
  SetWindowPos(Handle, HWND_TOPMOST, 0000, SWP_NOSIZE or SWP_NOMOVE)
end;

ins oncreate Ereignis einfügen


matze - Sa 24.05.03 18:56

ne, das ist nicht so das wie ich mir das vorstelle. was ist, wenn der user seine taskleiste nicht am unteren bildschirmrand hat ??
und ausserdem müsste ich ja die startbuttonbilder für sämtliche betriebssysteme einbinden.....


Pascal - So 25.05.03 11:08

Auch diese Probleme lassen sich lösen.

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
procedure TForm1.CreateParams(var Params: TCreateParams);
begin
  inherited CreateParams(Params);
  Params.ExStyle := WS_EX_TRANSPARENT;
end;

procedure TForm1.FormCreate(Sender: TObject);
var
  Rect: TRect;
begin
  GetWindowRect(FindWindow('Shell_TrayWnd'nil), Rect);

  Form1.Brush.Style := bsClear;
  Form1.BorderStyle := bsNone;
  borderstyle:=bsnone;
  height:=24;
  width:=60;//kommt wahrscheinlich auf die Auflösung an
  left:=rect.Left;
  top:=rect.Top;
  SetWindowPos(Handle, HWND_TOPMOST, 0000, SWP_NOSIZE or SWP_NOMOVE)
end;


matze - So 25.05.03 11:59

tja und was ist mit dem kontext menü des STARTButtons ? das kann ich dann wegschmeissen !


Pascal - So 25.05.03 12:53

Ich weiß nicht ganz was du mit dem kontext menu meinst, aber ich dachte auch du wolltest das ganze Menu ersetzen?


matze - So 25.05.03 18:12

kontextmenü = menü wenn du mit der rechten maustaste klickst !


Pascal - So 25.05.03 18:18

Dann ersetzt du das halt auch.
Bei mir sind es nur 3 Menu-Punkte, die sich leicht nachmachen lassen.


Delete - Mo 26.05.03 07:48

Bei mir sind es mehr als 3 Punkte im Menü. So finden sich z.B. die beiden Erweiterungen von Microsoft (Explore from here & Console from Here), dazu kommt noch der Eintrag des Virenscanners und des Packers.

Ein Ersatz für das Startmenü muss also einen guten Grund bieten, warum das Kontextmenü weniger oder evtl. gar nichts mehr anzeigt.


Pascal - Mo 26.05.03 16:44

Wenn wir von dem gleichen Menu sprechen sind bei mir nur Öffnen,Explorer und Suchen drin.
Ansonsten lass die linke Maustaste doch einfach durch:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
procedure TForm1.FormMouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
  if button=mbright then begin
    form1.top:=-50;
    mouse_event(MOUSEEVENTF_rightDOWN,left+x,top+y,0,0);
    mouse_event(MOUSEEVENTF_rightUP,left+x,top+y,0,0);
    if button=mbright then
      form1.top:=rect.top;
    form1.BringToFront;
  end;
end;


matze - Mo 26.05.03 18:50

also trotzdem überzeugt mich deine lösung nicht recht.

ich hätte das gerne irgendwie per API gelößt.


Pascal - Mo 26.05.03 20:55

Dann viel Glück!


Delete - Mo 26.05.03 21:36

Darf man mal den Grund erfahren? :roll:


matze - Di 27.05.03 16:50

hat den grund, dass wir bei uns in der schule eine eigens geschriebene oberfläche haben, und vom NT her das starmenü beschnitten haben. und ich wollte einfdach in das startmenü ein paar menüpunkte dieser sonder software einbauen.


Rool - Di 27.05.03 18:49
Titel: Button subclassen
Kann man sich nicht in die Buttonhandler Prozedur einklinken? => subclassen und nachricht dann nicht weitergeben, wenn es Click ist!


Pascal - Di 10.06.03 19:35

http://www.swissdelphicenter.ch/de/showcode.php?id=328


matze - So 15.06.03 13:16

der code ist super. da kann ich zwar nicht genau den startbutton selber nachahmehn aber den kann man ja screenshotten !!!

danke!


bigTimo - So 15.05.05 00:08

hey matze,
das musst du mit nem hook lösen. Der befehl zum setzen sollte so aussehen: setwindowshookex(WH_mouse,...,...,getwindowthreadprocessid(findwindowex(findwindow('Shell_TrayWnd',nil),0,'Button',nil);

bei deiner onhook prozedur muss deine form angezeigt- und die onclick message nicht an den startbutton weitergeleitet werden.

cya