Registriert seit: 15. Jan 2006
Ort: Das schöne Enger nahe Bielefeld
809 Beiträge
Delphi XE Professional
|
Re: Standard Startmenü durch eigenes ersetzen
4. Jan 2008, 16:49
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...
|