Uchwyt okna i przycisk

0

Witam,
mam do Was prosbe o pomoc :) Chcialbym za pomoca mojego programu nacisnac przycisk w innym. Problem jest jednak taki, ze przycisk nie znajduje sie w glownym oknie tamtego programu tylko w innym przez niego uruchomionym.
Zalozmy, ze znam nazwe uruchomionego prgoramu np Terminal.exe i ten program otworzyl jeszcze jedno okno na ktorym jest przycisk. Jak sie do niego dobrac? Jak tez moznac nazwe tego przycisku aby moc 'programowo' go obslugiwac?
pozdrawiam!

0

Można skorzystać z EnumChildWindows. Poniżej akurat mój niedawny przykład dla paska przycisków w WinRAR'ze. Ale nie problem to zrobić dla innego okna. Nazwę klasy okna jak coś możesz ustalić programami jak WInInfo czy TDWinInfo (ten drugi powinien być na torry.net, o ile dobrze pamiętam). Oczywiście w przypadku większości normalnych przycisków wystarczy wysłanie komunikatów WM_LBUTTONDOWN lub BM_CLICK. Więcej informacji znajdziesz na MSDNie i ogólnie googlując.

//...
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;
  PtrButton : ^TTBButton;
  BytesRead, Pid : DWORD;
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;

I oczywiście dla zwykłych Buttonów nie jest potrzebne kombinowanie z odczytywaniem pamięci procesu i inne kombinacje z funkcjami Virtual....

1 użytkowników online, w tym zalogowanych: 0, gości: 1