Kliknięcie buttona innej aplikacji - prośba o pomoc

0

Witam,

Chciałbym uruchomić jeden button innej aplikacji. Czytam forum, staram się implementować kod, który proponujecie - ale nie działa.. Jestem początkującym w Delphi, więc proszę o wyrozumiałość :) Pogubiłem się w tych uchytach, ponieważ uchwyt POTOMKA cały czas jest inny po ponownym uruchomieniu obcej aplikacji.

  1. Aplikacja (obca) jest uruchomiona.
  2. Uruchamiam swoją (delphi) i mam taki kod - w tej ważnej części:

procedure TForm1.BitBtn1Click(Sender: TObject);
var
h:hWnd;
begin
ShellExecute(0,'open','D:!\Avaya Reliable Data Transport Tool\server.exe',nil,nil,SW_Show);
Sleep(4000);
h:=FindWindow('Avaya Reliable Data Transport Tool - Server', nil);

if h<>0 then begin
SendMessage(h, WM_COMMAND,1378652,0);
SendMessage(h, WM_LBUTTONDOWN, 1247366, 0);
SendMessage(h, WM_LBUTTONUP, 1247366, 0);
end
else
ShowMessage('Cos nie tak...');
end;

Wiem że jest coś nie tak.. Proszę o pomoc, wskazówkę, cokolwiek ! :)

Z góry dzięki
Maciek

0

Dlaczego w ścieżce jest wykrzyknik?

katalonia napisał(a)
  1. Aplikacja (obca) jest uruchomiona.

No to po co ją uruchamiasz jeszcze raz w kodzie?

procedure TForm1.BitBtn1Click(Sender: TObject);
var
  h:hWnd;
begin
  ShellExecute(0,'open','D:\!\Avaya Reliable Data Transport Tool\server.exe',nil,nil,SW_Show);
  Sleep(4000);
  h:=FindWindow('Avaya Reliable Data Transport Tool - Server', nil);

  if h<>0 then begin
    SendMessage(h, WM_COMMAND,1378652,0);
    SendMessage(h, WM_LBUTTONDOWN, 1247366, 0);
    SendMessage(h, WM_LBUTTONUP, 1247366, 0);
  end
  else
  ShowMessage('Cos nie tak...');
end;

==================================================================

Wiem że jest coś nie tak.. Proszę o pomoc, wskazówkę, cokolwiek ! :)

Z góry dzięki
Maciek

Jak dla mnie kod wygląda na dobry. Jeśli Ci nie znajduje handla to znaczy, że:

  • nie ma takiego okna
  • okno, które chcesz znaleźć ma inny caption niż ten przekazany przez Ciebie.
0

Nie precyzyjnie się wyraziłem, sorry :)

Obca aplikacja uruchamia się poprzez kod oczywiście.. Znam uchwyty okna aplikacji, oraz button'a który muszę uruchomić, ale one się zmieniają po każdym jej uruchomieniu.. Tutaj jest problem. Jak mam to oprogramować ?

Skorzystałem z "enumchildwindows" i listuje mi wszystkie okna, klasy i uchwyty (jest tam też ten button), ale za każdym razem mam inne numery.. Jak to zrobić ?

Oto listing z "enumchildwindows":

NAZWA OKNA: TEKST: Avaya Reliable Data transport Tool - Server KLASA: #32770 1575224
POTOMEK OKNA: TEKST: Exit KLASA: Button 723624
POTOMEK OKNA: TEKST: KLASA: ListBox 7472930
POTOMEK OKNA: TEKST: KLASA: Static 1640774
POTOMEK OKNA: TEKST: Server Started KLASA: Static 723650
POTOMEK OKNA: TEKST: Stop KLASA: Button 2820484
POTOMEK OKNA: TEKST: Start KLASA: Button 723682

Chciałbym uruchamiać automatycznie button START - jak odwołać się zawsze do tego samego buttona, jego numer zawsze jest inny po każdorazowym uruchomieniu obcej aplikacji..

0

Aha, dopiero teraz zrozumiałem Twój problem.
Ja bym pokombinował coś z FindWindowEx, poza zwykłym FindWindow.
Możesz tak uzyskać handla do buttona. Tylko dokładnie nie wiem jak to zrobić.

0

a ja bym chciał kodzik do enumchildwindows jak go zrobiłes?

0

szukasz "Transport" z dużej a z listingu wynika że jest z małej

0
lankusiek napisał(a)

a ja bym chciał kodzik do enumchildwindows jak go zrobiłes?

Spoko, mówisz i masz, są to dwie funkcje oraz button uruchamiający:

//==============================================================================
function EnumChildProc(uchwyt:Hwnd;P:pointer):boolean;stdcall;
var
winname,cname:array[0..144]of char;
begin
result:=true;
getwindowtext(uchwyt,winname,144);
getclassname(uchwyt,cname,144);
Form1.ListBox1.Items.Add('POTOMEK OKNA: TEKST: '+strpas(winname)+' KLASA: '+strpas(cname)+' '+IntToStr(uchwyt));
end;
//==============================================================================
function EnumWindowProc(uchwyt:HWnd;P:Pointer):boolean;stdcall;
var
winname,cname:array[0..144]of char;
begin
result:=true;
getwindowtext(uchwyt,winname,144);
getclassname(uchwyt,cname,144);
Form1.ListBox1.Items.Add('NAZWA OKNA: TEKST: '+strpas(winname)+' KLASA: '+strpas(cname)+' '+IntToStr(uchwyt));
enumchildwindows(uchwyt,@enumchildproc,0);
end;
//==============================================================================
procedure TForm1.BitBtn2Click(Sender: TObject);
begin
EnumWindows(@enumwindowproc,0);
end;

0
lankusiek napisał(a)

a ja bym chciał kodzik do enumchildwindows jak go zrobiłes?

Mam numery uchwytów, mam nazwę klasy i numer potomka obcej aplikacji, jednak nadal nie mogę wcisnąć w niej buttona. Szlag mnie już trafia.. [glowa]

0

Katalonia dzięki za funkcję. co do:

Chciałbym uruchamiać automatycznie button START - jak odwołać się zawsze do tego samego buttona, jego numer zawsze jest inny po każdorazowym uruchomieniu obcej aplikacji..

Więc Tak:
Zrobię Ci to od początku po Amatorsku Tak abyś potrafił myśleć :)
Dajesz na forme 4 Buttony, 1 Edit, 1 Memo.

1) Na początku kodu dodajesz  sobie te swoje funkcje enumchildwindows tylko zamiast "Form1.ListBox1.Items.Add" dajesz "Form1.Memo1.Lines.Add"

2) Button1 // Start
begin
EnumWindows(@enumwindowproc,0);  // wyszuka Ci wszystkie Klasy i doda do Memo1
end;

3) Button2 // Wyszukaj Linie 
var
  i : Integer;
begin
 for i := 0 to memo1.lines.count - 1 do
 if Pos('Start', memo1.lines[i]) <> 0 then  // Tu zostaje wyszukany Text  "start" z Memo1
 Edit1.Text:= memo1.lines[i];   // Wyszukana Linia z tekstem zostaje dodana do Edita
end; 

4) Button3 // Pobierz numer 
var
  I : integer;
  L : String;
begin
   L:= edit1.text;   // Pobiera z Edita Twoją wcześniej wyszukaną linie
  for I := Length(L) downto 1 do
  begin
    if Copy(L, I, 1) = ' ' then   { Tutaj po spacji zostanie skopiowany numer Buttona. W twoim przypadku "POTOMEK OKNA: TEKST: Start KLASA: Button 723682" to będzie  723682}
    begin
      Delete(L, 1, I);  // Kasuje to co jest przed spacją
      Edit1.Text:=(L);  //Dodaje do Edita Twój numer
end;
  end;
    end;

5) Button4 // Start
var
  h:hWnd;
  numer : String;
begin
  
  h:=FindWindow('Avaya Reliable Data Transport Tool - Server', nil);
  numer:= Edit1.text;  // Pobiera Twój Numer z Edita

  if h<>0 then begin
      SendMessage(h, WM_COMMAND,0, StrToInt(numer));
      SendMessage(h, WM_LBUTTONDOWN, 0, StrToInt(numer));
     SendMessage(h, WM_LBUTTONUP, 0, StrToInt(numer));
  end
  else
  ShowMessage('Cos nie tak...');
end;
 

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