@bronex: Ty jako doświadczony Użytkownik na forum, powinieneś umieć szukać. A przede wszystkim czytać co również @kAzek napisał. Taka pętla Ci nic nie da, bo zmienna J i jej zawartosć będzie dla aplikacji z d... to raz. Dwa nie wiadomo czy będą buttony o tak niskim Id. Trzeba było spojrzeć na MSDN. Pogooglować. Mi się udało z google znależć kod bazujący na zmiennej Amiga2 i kod działa. Warunek jest taki aby właśnie używać takiej metody z VirtualAllocEx
, ponieważ inaczej dostaniemy kod błędu "Odmowa dostępu".
//...
uses
CommCtrl;
var
ControlCnt : Byte;
WinrarToolBarH : HWND;
function EnumChildWinProc(AHandle : HWND) : boolean; stdcall;
var
ControlName, ControlText : array[0..255] of Char;
begin
Result := True;
GetClassName(AHandle, ControlName, SizeOf(ControlName));
SendMessage(AHandle, WM_GETTEXT, SizeOf(ControlText), integer(@ControlText));
with Form1 do
begin
ControlCnt := ControlCnt + 1;
if ControlCnt = 6 then
begin
WinrarToolBarH := AHandle;
Result := False;
end;
Memo1.Lines.Add('$' + IntToHex(AHandle, 1) + ' = ' + ControlName + ' = "' + ControlText + '"');
end;
end;
procedure TForm1.Button1Click(Sender : TObject);
var
AppH : HWND;
ProcessH : THandle;
ResBtn : TTBButton;
BytesRead, Pid : DWORD;
PtrButton : ^TTBButton;
begin
Memo1.Clear;
ControlCnt := 0;
AppH := FindWindow('WinRarWindow', nil);
EnumChildWindows(AppH, @EnumChildWinProc, 0);
GetWindowThreadProcessID(WinrarToolBarH, @Pid);
ProcessH := OpenProcess(PROCESS_ALL_ACCESS, False, Pid);
PtrButton := VirtualAllocEx(ProcessH, nil, SizeOf(TTBButton), MEM_COMMIT, PAGE_EXECUTE_READWRITE);
SendMessage(WinrarToolBarH, TB_GETBUTTON, 0, Integer(Pointer(PtrButton)));
ReadProcessMemory(ProcessH, PtrButton, @ResBtn, SizeOf(TTBButton), BytesRead);
VirtualFreeEx(ProcessH, PtrButton, 0, MEM_RELEASE);
CloseHandle(ProcessH);
SendMessage(WinrarToolBarH, WM_COMMAND, ResBtn.idCommand, 0);
end;
Przykładowy kod jest dla WinRAR'a i działa liczba po parametrze TB_GETBUTTON
możesz ustawić na wyższą (maksymalnie do ilości buttonów na toolbarze minus - 1). Co w przypadku WinRAR'a, na którym ja testowałem, l;czba wynosi 10. A i niestety TB_PRESSBUTTON
nie działało. Być może w WinRAR'ze obsługa buttonów jest zrobiona tylko przez WM_COMMAND
. Bo robienie przykładowo poniższego kodu nie skutkowało reakcją, a błędów po GerlastError
nie było. Może z tym @kAzek albo ktoś inny tutaj, będzie umiał naprowadzić.
PostMessage(WinrarToolBarH, TB_PRESSBUTTON, ResBtn.idCommand, MakeLParam(1, 0));
PostMessage(WinrarToolBarH, TB_PRESSBUTTON, ResBtn.idCommand, MakeLParam(0, 0));