Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi Standard Startmenü durch eigenes ersetzen (https://www.delphipraxis.net/105836-standard-startmenue-durch-eigenes-ersetzen.html)

Diamondback2007 31. Dez 2007 10:27


Standard Startmenü durch eigenes ersetzen
 
Hallo zusammen,

wie ich anhand von einigen programmen gesehen
habe, ist es möglich das normale startmenü durch
ein eigenes zu ersetzen.

kann man dies auch mit delphi realisieren?
ich hab in einer diskussion irgendwas mit
hooks gehört, habe damit aber keine weitgehenden
erfahrungen.
wäre schön wenn mir jemand behilflich sein könnte.

gruß

Diamondback2007 1. Jan 2008 16:10

Re: Standard Startmenü durch eigenes ersetzen
 
*push*
:duck:

peschai 2. Jan 2008 09:29

Re: Standard Startmenü durch eigenes ersetzen
 
Hallo,

Um was geht es dir genauer ?
Änderungen am Startmenü von Windows kannst du doch auf Dateiebene durchführen ?

SirThornberry 2. Jan 2008 10:48

Re: Standard Startmenü durch eigenes ersetzen
 
welche programme kennst du da? ich kenne nur Programme welche die Komplette Shell ersetzen oder eben keine Programme sondern der Fall das durch eine Installationsroutine das Menü richtig ersetzt wird.

Diamondback2007 3. Jan 2008 16:17

Re: Standard Startmenü durch eigenes ersetzen
 
ich kenne zum beispiel Vistart
das ersetzt das XP-Menü durch eines mit der funktionalität
von vista. wie genau das geschieht weiß ich nicht,
aber im prinzip möchte ich genau das erreichen.
beim klick auf den startknopf soll halt irgendetwas beliebiges
angezeigt werden, nur nicht das normale menü ;)

gruß

wicht 3. Jan 2008 16:46

Re: Standard Startmenü durch eigenes ersetzen
 
Naja, ich würde einfach mal vermuten, dass soetwas mit einem Hook machbar ist. Oder die WndProc irgendwie umbiegen. Aber das habe ich noch nie in der Form gemacht, und darum weiß ich auch nicht mehr.. Aber was Hooks angeht findet man schon einiges an Beispielen (falls es damit geht..)

HTH

mimi 3. Jan 2008 17:00

Re: Standard Startmenü durch eigenes ersetzen
 
Ich könnte mir das so vorstellen:
Du versteckst den Button das geht ja mit Delphi.

Legst dort dein eigens Programm hin. was du entstprechend einstellst. und dein Programm kann auch auch dann immer oben sein. Das Fenster ist so groß wie der Button halt für das Startmenu.

Diamondback2007 3. Jan 2008 18:03

Re: Standard Startmenü durch eigenes ersetzen
 
hm...das wäre sogar eine idee :)
also das mit der form drüber! :)

muss ich mal experimentieren...
wie kann man denn den button vrstecken?
hat grade jemand einen link zur hand?

gruß

Diamondback2007 3. Jan 2008 18:08

Re: Standard Startmenü durch eigenes ersetzen
 
okay hab was gefunden http://www.delphi-library.de/topic_D...a00300f2f99d49
allerdings kann sich die taskbar bei fsStayOnTop noch über das programm lagern.

wie kann ich das verhindern?

gruß

Diamondback2007 3. Jan 2008 18:44

Re: Standard Startmenü durch eigenes ersetzen
 
ich hätte un eine möglichkeit gefunden das überlagern der taskbar
zu verhindern, allerdings geht das zu lasten des prozessors...

sendet windows irgendeine message wenn sich die taskbar in den vordergrund setzt?
oder gibt es sowas wie OnOverPaint, also wenn sich ein adneres object
über die eigene form zeichnet?

gruß

Diamondback2007 3. Jan 2008 19:31

Re: Standard Startmenü durch eigenes ersetzen
 
okay ich habe jetzt eine lösung gefunden:

Delphi-Quellcode:
procedure Vordergrund();
begin
  while true do
  begin
    Application.ProcessMessages;
    SetWindowPos(Application.Handle, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOACTIVATE or SWP_NOMOVE or SWP_NOSIZE);
    Sleep(10);
  end;
end;

procedure TForm1.FormCreate(Sender: TObject);
Var tmp : Pointer;
    tmp2: Cardinal;
begin
  CreateThread(nil,0,@Vordergrund,tmp,0,tmp2);
end;
das braucht kaum prozessor! damit hat sich das jetzt fürs erste erledigt!
danke :)

gruß

Larsi 3. Jan 2008 20:05

Re: Standard Startmenü durch eigenes ersetzen
 
gibts hier in der dp nicht sogar n programm was das startmenü komplett ändert??? Frag doch die mal wie sie das gemacht haben :)

Diamondback2007 3. Jan 2008 20:21

Re: Standard Startmenü durch eigenes ersetzen
 
Zitat:

Zitat von Larsi
gibts hier in der dp nicht sogar n programm was das startmenü komplett ändert??? Frag doch die mal wie sie das gemacht haben :)

echt?
kenn ich nicht. ein link wäre nett :)

gruß

Larsi 3. Jan 2008 20:25

Re: Standard Startmenü durch eigenes ersetzen
 
das hast du doch selber programmiert :)
http://www.delphipraxis.net/internal...light=startmen

BullsEye 3. Jan 2008 22:42

Re: Standard Startmenü durch eigenes ersetzen
 
Zitat:

Zitat von Diamondback2007
ich kenne zum beispiel Vistart
das ersetzt das XP-Menü durch eines mit der funktionalität
von vista. wie genau das geschieht weiß ich nicht,
aber im prinzip möchte ich genau das erreichen.
beim klick auf den startknopf soll halt irgendetwas beliebiges
angezeigt werden, nur nicht das normale menü ;)

gruß

Das sieht so aus:

GUCKST DU HIER!

Von Rechtschreibung haben die anscheinend noch nie was gehört?!

Crazy Ivan 3. Jan 2008 23:12

Re: Standard Startmenü durch eigenes ersetzen
 
ja irgendwie ist die deutsche sprache nicht wirklich vorhanden und bei mir kommen dauernd irgendwelche fehler und dann hab ich ein schwarzes startmenü ...

zufriedener bin ich mit dem vista-transformationpack.

Diamondback2007 4. Jan 2008 00:26

Re: Standard Startmenü durch eigenes ersetzen
 
Zitat:

Zitat von Larsi
das hast du doch selber programmiert :)
http://www.delphipraxis.net/internal...light=startmen

ja dann weiß ich ja wies geht ;) nein unser projekt macht genau DAS
leider nicht ;) :(


Zitat:

Zitat von BullsEye
Zitat:

Zitat von Diamondback2007
ich kenne zum beispiel Vistart
das ersetzt das XP-Menü durch eines mit der funktionalität
von vista. wie genau das geschieht weiß ich nicht,
aber im prinzip möchte ich genau das erreichen.
beim klick auf den startknopf soll halt irgendetwas beliebiges
angezeigt werden, nur nicht das normale menü ;)

gruß

Das sieht so aus:

GUCKST DU HIER!

Von Rechtschreibung haben die anscheinend noch nie was gehört?!

ähm warum zeigst du mir das bild? :) oder war das nicht für mich? :P
ich habe zu hause selber vista ;)

[OT] die sprache da im menü sieht aus wie holländisch :roll: :mrgreen: [OT]

Zitat:

Zitat von Crazy Ivan
ja irgendwie ist die deutsche sprache nicht wirklich vorhanden und bei mir kommen dauernd irgendwelche fehler und dann hab ich ein schwarzes startmenü ...

zufriedener bin ich mit dem vista-transformationpack.

ist ja wunderbar :) wenn meins fertig ist müsst ihr euch ja nur so drauf stürzen :)

gruß

wicht 4. Jan 2008 02:11

Re: Standard Startmenü durch eigenes ersetzen
 
Tag,

habe vorhin mal ein bisschen rumgetestet. Eigentlich ist es nicht besonders schwierig (naja, den Hook habe ich nicht selber geschrieben :wink: ) sich da in die WndProc zu hängen. Was ich jetzt hinbekommen habe ist, dass bei einem Klick auf den Startmenü-Button nicht das Startmenü erscheint, sondern einfach ein Ton abgespielt wird. Das kann man jetzt natürlich erweitern, z.B. dass ein eigenes Menü angezeigt wird. Finde ich jedenfalls schöner als mit diesem Stay-On-Top Thread.
Wenn du Interesse hast könnte ich hier Code posten, jetzt bereite ich den aber nicht mehr dafür auf.

Man ließt sich vielleicht, gute Nacht.

Diamondback2007 4. Jan 2008 12:25

Re: Standard Startmenü durch eigenes ersetzen
 
ja das wäre nett :)

gruß

BullsEye 4. Jan 2008 13:31

Re: Standard Startmenü durch eigenes ersetzen
 
Zitat:

Zitat von wicht
Tag,

habe vorhin mal ein bisschen rumgetestet. Eigentlich ist es nicht besonders schwierig (naja, den Hook habe ich nicht selber geschrieben :wink: ) sich da in die WndProc zu hängen. Was ich jetzt hinbekommen habe ist, dass bei einem Klick auf den Startmenü-Button nicht das Startmenü erscheint, sondern einfach ein Ton abgespielt wird. Das kann man jetzt natürlich erweitern, z.B. dass ein eigenes Menü angezeigt wird. Finde ich jedenfalls schöner als mit diesem Stay-On-Top Thread.
Wenn du Interesse hast könnte ich hier Code posten, jetzt bereite ich den aber nicht mehr dafür auf.

Man ließt sich vielleicht, gute Nacht.

Daran hätte ich auch Interesse!

@Diamond, das Bild hab ich gezeigt, damit die anderen sich den Sch*** erst gar nicht runterladen weil das nicht wirklich funzt oder so wie Ivan schon gesagt hat nen Schwarzes Bild.
Also solltet ihr lieber auf Diamonds Version warten *Diamond push* :duck:

Diamondback2007 4. Jan 2008 14:42

Re: Standard Startmenü durch eigenes ersetzen
 
Zitat:

Zitat von BullsEye
Also solltet ihr lieber auf Diamonds Version warten *Diamond push* :duck:

find ch auch :mrgreen:

wenn du möchtest kann ich dir mal die version mit
OnTop per PN schicken zum testen.
wenn du interesse hast meld dich einfach ;)

gruß

wicht 4. Jan 2008 15:49

Re: Standard Startmenü durch eigenes ersetzen
 
Nabend, also, ich poste das mal schnell... in das Programm habe ich das hier reingepackt:

Delphi-Quellcode:
function InjectIntoProcess(lpProcessID: Cardinal; lpDllname: String):Boolean;
var
  hProc: Cardinal;
  oAlloc: Pointer;
  cWPM: Cardinal;
  hRemThread: Cardinal;
begin
  result := false;
  SetLastError(ERROR_SUCCESS);
  hProc := OpenProcess(PROCESS_ALL_ACCESS, false, lpProcessID);
  if hProc <> 0 then
  begin
    oAlloc := VirtualAllocEx(hProc, 0, length(lpDllname), MEM_COMMIT, PAGE_EXECUTE_READWRITE);
    if oAlloc <> nil then
    begin
      if WriteProcessMemory(hProc, oAlloc, PChar(lpDllName), length(lpDllName), cWPM) = true then
      begin
        CreateRemoteThread(hProc, nil, 0, GetProcAddress(GetModuleHandle('kernel32.dll'), 'LoadLibraryA'), oAlloc, 0, hRemThread);
        if GetLastError = ERROR_SUCCESS then
        begin
          result := true;
        end;
      end;
    end;
  end;
  CloseHandle(hProc);
end;

procedure TForm1.Button1Click(Sender: TObject);
var
  h: hwnd;
  pid: dword;
begin
  h := FindWindow('Shell_TrayWnd', nil); //Taskbar suchen
  GetWindowThreadProcessID(h, @pid); //Prozess zur Taskbar suchen
  InjectIntoProcess(pid, 'hookdll.dll'); //Die DLL reinladen
end;
Die DLL habe ich wie folgt aufgebaut:

Delphi-Quellcode:
library hookdll;

uses
  sysutils,
  Windows,
  messages;

{$R *.res}

var
  h: HWND;
  OldWndProc: pointer;

function NewWndProc(hWnd: HWND; uMsg: UINT; wParam: WPARAM; lParam: LPARAM): LRESULT; stdcall;
begin
  case uMsg of
    WM_LBUTTONDOWN:
      begin // Hier wurde der Linke Mausbutton auf den Startknopf gedrückt.
        MessageBeep(mb_iconinformation);

        Result := DefWindowProc(hWnd, uMsg, wParam, lParam); // Ob das hier richtig ist weiß ich nicht..
        Exit;
      end;
    WM_USER + 22222: // Mit dieser Message kann der Hook deinstalliert werden, das klappt aber nur so "halb".
      begin
        SetWindowLong(h, GWL_WNDPROC, LongInt(@OldWndProc));
        Result := 0;
        Exit;
      end;
  end;
  Result := CallWindowProc(OldWndProc, hWnd, uMsg, wParam, lParam);
end;

begin
  h := FindWindow('Shell_TrayWnd',nil);
  h := FindWindowEx(h,0,'Button',nil); //Startknopf finden
  OldWndProc := Pointer(SetWindowLong(h, GWL_WNDPROC, LongInt(@NewWndProc))); //Die WndProc umlenken
end.
So, das habe ich hier Quick and Dirty hingeklatscht und ist eigentlich nur aus Neugierde entstanden... Sicherlich sind Fehler drin oder falsche Annahmen meinerseits, aber weil ihr ja das Startmenü bauen wollt und ich seit etwas mehr als 30 Stunden keinen Schlaf hatte und das ja nur auf euren Wunsch gepostet habe, lege ich mich trotzdem nun mit gutem Gewissen schlafen.

Gute Nacht, ich hoffe, jemand kann mit diesem Zeug irgendetwas anfangen...


Alle Zeitangaben in WEZ +1. Es ist jetzt 10:21 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz