Einzelnen Beitrag anzeigen

Benutzerbild von bitsetter
bitsetter

Registriert seit: 17. Jan 2007
1.169 Beiträge
 
Turbo Delphi für Win32
 
#23

Re: Welche unit wird benötigt?

  Alt 23. Dez 2007, 19: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
  Mit Zitat antworten Zitat