uses commctrl;
procedure tform1.button1click(sender: tobject);
var
vhandle: thandle;
vcount: integer;
vprocessid: longword;
vprocess: thandle;
vpointer: pointer;
vbuffer: array[0..255] of char;
vnumberofbytesread: longword;
i: integer;
vtbbutton: ttbbutton;
vwindow: thandle;
begin
vhandle := findwindow('shell_traywnd', nil);
vhandle := findwindowex(vhandle, 0, 'rebarwindow32', nil);
vhandle := findwindowex(vhandle, 0, 'mstaskswwclass', nil);
vhandle := findwindowex(vhandle, 0, 'toolbarwindow32', nil);
if vhandle = 0 then exit;
vcount := sendmessage(vhandle, tb_buttoncount, 0, 0);
getwindowthreadprocessid(vhandle, vprocessid);
vprocess := openprocess(process_vm_operation or process_vm_read or
process_vm_write, false, vprocessid);
vpointer := virtualallocex(vprocess, nil, $1000, mem_reserve or mem_commit,
page_readwrite);
try
for i := 0 to vcount - 1 do
begin
sendmessage(vhandle, tb_getbutton, i, integer(vpointer));
readprocessmemory(vprocess, vpointer, @vtbbutton,
sizeof(ttbbutton), vnumberofbytesread);
if vtbbutton.fsstyle = 170 then continue; // 组按钮
readprocessmemory(vprocess, pointer(vtbbutton.dwdata), @vwindow,
sizeof(integer), vnumberofbytesread);
sendmessage(vhandle, tb_getbuttontext, i, integer(vpointer));
readprocessmemory(vprocess, vpointer,
@vbuffer[0], sizeof(vbuffer), vnumberofbytesread);
outputdebugstring(pchar(format('handle=%d,title=%s', [vwindow, vbuffer])));
end;
finally
virtualfreeex(vprocess, vpointer, 0, mem_release);
closehandle(vprocess);
end;
end;