unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, CommCtrl;
type
TForm1 = class(TForm)
Button1: TButton;
Label1: TLabel;
Memo1: TMemo;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
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;
BtnRect: TRect;
R: Cardinal;
begin
Memo1.Clear;
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; // ±×·ì
if (vTBBUTTON.fsState and TBSTATE_HIDDEN) = TBSTATE_HIDDEN 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);
SendMessage(vHandle,TB_GETRECT, vTBBUTTON.idCommand, integer(integer(@vBuffer[0]) + SizeOf(vTBBUTTON)));
ReadProcessMemory(vProcess, Pointer(integer(@vBuffer[0]) + SizeOf(vTBBUTTON)), @BtnRect, SizeOf(BtnRect), R);
Memo1.Lines.Add(vBuffer+' - '+
'(hWnd='+inttostr(vWindow)+')'+
'(left='+inttostr(BtnRect.Left)+')'+
'(top='+inttostr(BtnRect.Top)+')'+
'(width='+inttostr(BtnRect.Right-BtnRect.Left)+')'+
'(height='+inttostr(BtnRect.Bottom-BtnRect.Top)+')');
end;
finally
VirtualFreeEx(vProcess, vPointer, 0, MEM_RELEASE);
CloseHandle(vProcess);
end;
end;
end.
|
|