如题
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);
      showmessage(PChar(Format('Handle=%d,Title=%s', [vWindow, vBuffer])));
    end;
  finally
    VirtualFreeEx(vProcess, vPointer, 0, MEM_RELEASE);
    CloseHandle(vProcess);
  end;
end;
按钮控件换成时间控件

解决方案 »

  1.   

    unit Unit1;interfaceuses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, ExtCtrls;type
      TForm1 = class(TForm)
        Timer1: TTimer;
        procedure Timer1Timer(Sender: TObject);
      private
        { Private declarations }
      public
        { Public declarations }
      end;var
      Form1: TForm1;implementation{$R *.dfm}
       uses CommCtrl;procedure TForm1.Timer1Timer(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);
          showmessage(PChar(Format('Handle=%d,Title=%s', [vWindow, vBuffer])));
        end;
      finally
        VirtualFreeEx(vProcess, vPointer, 0, MEM_RELEASE);
        CloseHandle(vProcess);
      end;
    end;end.
    请看二楼