![]() |
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ß |
Re: Standard Startmenü durch eigenes ersetzen
*push*
:duck: |
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 ? |
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.
|
Re: Standard Startmenü durch eigenes ersetzen
ich kenne zum beispiel
![]() 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ß |
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 |
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. |
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ß |
Re: Standard Startmenü durch eigenes ersetzen
okay hab was gefunden
![]() allerdings kann sich die taskbar bei fsStayOnTop noch über das programm lagern. wie kann ich das verhindern? gruß |
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ß |
Re: Standard Startmenü durch eigenes ersetzen
okay ich habe jetzt eine lösung gefunden:
Delphi-Quellcode:
das braucht kaum prozessor! damit hat sich das jetzt fürs erste erledigt!
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; danke :) gruß |
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 :)
|
Re: Standard Startmenü durch eigenes ersetzen
Zitat:
kenn ich nicht. ein link wäre nett :) gruß |
Re: Standard Startmenü durch eigenes ersetzen
|
Re: Standard Startmenü durch eigenes ersetzen
Zitat:
![]() Von Rechtschreibung haben die anscheinend noch nie was gehört?! |
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. |
Re: Standard Startmenü durch eigenes ersetzen
Zitat:
leider nicht ;) :( Zitat:
ich habe zu hause selber vista ;) [OT] die sprache da im menü sieht aus wie holländisch :roll: :mrgreen: [OT] Zitat:
gruß |
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. |
Re: Standard Startmenü durch eigenes ersetzen
ja das wäre nett :)
gruß |
Re: Standard Startmenü durch eigenes ersetzen
Zitat:
@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: |
Re: Standard Startmenü durch eigenes ersetzen
Zitat:
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ß |
Re: Standard Startmenü durch eigenes ersetzen
Nabend, also, ich poste das mal schnell... in das Programm habe ich das hier reingepackt:
Delphi-Quellcode:
Die DLL habe ich wie folgt aufgebaut:
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;
Delphi-Quellcode:
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.
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. 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