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
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...
.