Odnalezienie szukanego TWinControl innej aplikacji

0

Witam,

Pobieram ClassName, ControlName i Caption innej aplikacji i dodaję do TListView.

ClassName ControlName Caption
TButton btnSzukaj Szukaj

Uchwyt tutaj jest mi nie potrzebny i nie przydatny z tego względu, że po ponownym uruchomieniu aplikacji jej uchwyty się zmienią.

Teraz chciałbym np. ustawić kursor na tym Buttonie, tylko pytanie: Jak mam znaleźć ten przycisk?
Jeśli miałbym użyć FindWindowEx to musiałbym znać strukturę drzewa parenta na którym jest przycisk i pobierać do niej po kolei uchwyty, a tego nie będę znał.

Przychodzi mi na myśl jeden sposób - pobrać współrzędne poprzez

ReadProcessMemory

ale z tym podejrzewam, że miałbym sporo zabawy i nie jestem pewny czy nie ma prostszego rozwiązania.

Słyszałem trochę o EnumChildWindows ale nie za bardzo wiem czy mogę w tym przypadku z tego skorzystać, bo co w przypadku gdy będę miał 3x button o tej samej nazwie? Jego klasa to TButton, caption np. 'Szukaj' dlatego mam też ControlName ale nie mam pojęcia jak wszukać go w obcej aplikacji.

Założeniem programu jest zautomatyzowanie pewnych czynności takich jak np. Kliknięcie buttona, wpisanie tekstu w edit obcej aplikacji, w razie komunikatu kliknąć odpowiedni przycisk. Wszystko na podstawie wczesniej nagranego schematu wczytanego do TListView.

Odnajdywanie okna realizowane jest na zasadzie FindWindow('nazwa okna'), następnie odczytywana jest wcześniej zapisana pozycja kursora nad danym obiektem i wywoływane odpowiednie zdarzenie SendMessage, lub MouseClick, z tym, że wszystko się zacznie walić jeśli w programie zmienimy położenie przycisku... Dlatego chciałbym znaleźć daną kontrolkę i pobrać jej współrzędne aby później ustawić na niej kursor.

Liczę na pomoc i ewentualnie gotowca w miarę możliwości.
Z góry dziękuję Olesiowi za pomoc bo wie sporo na ten temat i z teorii i z praktyki oraz reszcie, która będzie w stanie mi pomóc.

0
  1. ControlName - nie ma możliwości pobrania tego z gotowej aplikacji (owszem w niektórych specyficznych przypadkach się da)
  2. Czy myślałeś co zrobisz z TBitBtn?
  3. Używając FindWindowEx możesz rekursywnie przeiterować wszystkie okienka występujące w windowsach
  4. Jako wyróżnik dwóch jednakowych TButton z Caption='Szukaj' możesz użyć: Parent/BrotherBefore/BrotherAfter (ewentualnie wszystkie naraz) uzyskane ze skanowania FindWindowEx
  5. Rozmiary (współrzędne) możesz pobrać za pomocą GetWindowRect
0

Dzięki za odpowiedź. A co do punktów to:

  1. Da się, robię to za pomocą ReadProcessMemory.
  2. Nie bardzo, czemu akurat TBitBtn?
  3. Jakaś szansa na przykład?
  4. Ze współrzędnymi nie będzie problemu jeżeli już pobiorę uchwyt szukanego przycisku

usunięcie cytowania całego poprzedniego posta - fp

0

Ad1. Zakładając że aplikacja napisana w Delphi, już dla Lazarusa będzie inaczej nie wspominając już o C# i innych.
Ad2. TBitBtn - to też przycisk który coś może robić ale to twór nie posiadający uchwytu.
Ad3. ... ), ( Item:'TButton:Szukaj';Left:'TButton:Dodaj';Right:'TButton:Usuń';Parent:'TGroupBox:Operacje' ), ( ...

0

Testowałem na Visual Studio, folderach windows i większość kontrolek ma nazwę. Program pisane w innych językach też zwracają ControlName mi głównie chodzi o aplikację więc jest ok.

Co do punktu 3. to nie czaje o co chodzi ;/

0

... ), ( Item:'TButton:Szukaj';Left:'TButton:Dodaj';Right:'TButton:Usuń';Parent:'TGroupBox:Operacje' ), ( ...
Kontrolka TButton z Caption "Szukaj" która "po lewej" (poprzednie dziecko rodzica) ma kontrolkę TButton z Caption "Dodaj" oraz "po prawej" (następne dziecko rodzica) ma kontrolkę TButton z Caption "Usuń" oraz ma rodzica TGroupBox z Caption "Operacje"

2

Looknij na to:
Pobieranie uchwytów Edit innej aplikacji.

W poście od @olesio, masz przykład, który powinien, dużo wyjaśnić.
Jest tam sposób użycia EnumeChildWindows, które powinno rozwiązać Twój problem.

0

Idealny przykład rozwiązujący problem!

WIELKIE DZIĘKI! MISTRZU

ps. Jak najbardziej Olesio już nie 1 raz pomógł mi w temacie podając 100% trafny przykład. Jeszcze raz dzięki.

usunięcie cytowania całego poprzedniego posta - fp

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