Registriert seit: 17. Jan 2007
1.169 Beiträge
Turbo Delphi für Win32
|
Re: Welche unit wird benötigt?
23. Dez 2007, 20:36
Hast du auch der Variable Wnd das Handle der Toolbar übergeben?
Ansonsten habe ich es jetzt mal zum Testen so gemacht, dass der 2. Button in der Taskbar (ist ja auch eine Toolbar) von WinXP runtergedrückt wird.
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var
TB: TTBBUTTON;
p: PTBBUTTON;
ProcessHandle, wnd: THandle;
BytesR, ProcId: cardinal;
count, loop, idx: integer;
const
BtnIndex= 2;
begin
Wnd := FindWindow('Shell_TrayWnd', nil);
Wnd := FindWindowEx(Wnd, 0, 'ReBarWindow32', nil);
Wnd := FindWindowEx(Wnd, 0, 'MSTaskSwWClass', nil);
Wnd := FindWindowEx(Wnd, 0, 'ToolbarWindow32', nil);
//wnd:=...;
if isWindow(wnd) then
begin
idx:= 0;
GetWindowThreadProcessId(wnd, @ProcId);
ProcessHandle := OpenProcess(PROCESS_VM_OPERATION or PROCESS_VM_READ or PROCESS_VM_WRITE, False, ProcId);
if ProcessHandle= 0 then
MessageDlg(format('Fehler bei OpenProcess %s', [SyserrorMessage(getLastError)]), mtError, [mbOk], 0)
else
try
p := VirtualAllocEx(ProcessHandle, nil, SizeOf(TB), MEM_COMMIT, PAGE_READWRITE);
if Assigned(p) then
begin
count := SendMessage(wnd, TB_BUTTONCOUNT, 0, 0);
if count= 0 then
MessageDlg('Fehler bei TB_BUTTONCOUNT', mtError, [mbOk], 0);
for loop := 0 to pred(count) do
begin
if SendMessage(wnd, TB_GETBUTTON, loop, Cardinal(p))= 0 then
MessageDlg('Fehler bei TB_GETBUTTON', mtError, [mbOk], 0);
if not ReadProcessMemory(ProcessHandle, p, @TB, SizeOf(TB), BytesR)then
MessageDlg(format('Fehler bei ReadProcessMemory %s', [SyserrorMessage(getLastError)]), mtError, [mbOk], 0);
if TB.fsState and TBSTATE_HIDDEN = 0 then//sichtbar
inc(idx);
if idx= BtnIndex then
begin
if SendMessage(wnd, TB_PRESSBUTTON, TB.idCommand, MAKELONG (1, 0))= 0 then
MessageDlg('Fehler bei TB_PRESSBUTTON', mtError, [mbOk], 0);
end;
end;
VirtualFreeEx(ProcessHandle, p, 0, MEM_RELEASE);
end
else
MessageDlg(format('Fehler bei VirtualAllocEx %s', [SyserrorMessage(getLastError)]), mtError, [mbOk], 0);
finally
CloseHandle(ProcessHandle);
end;
end
else
MessageDlg('Kein gültiges Fenster Hande', mtError, [mbOk], 0);
end;
Gruß bitsetter
"Viele Wege führen nach Rom" Wolfgang Mocker (geb. 1954), dt. Satiriker und Aphoristiker
|