[ --ja-- @ 19.04.2010. 00:05 ] @
Pozdrav svima!

Imam aplikaciju koja ima formu sa par Buttona. Source od te aplikacije ne posjedujem. Želim simulirati klikove na buttone u danoj aplikaciji. Trenutno imam napola funkcionalno rješenje, tj. na neke buttone mogu simulirati klik, dok na neke ne mogu.

Spomenuti program sam otvorio u ResourceHackeru, i na danoj formi, između ostalog imam slijedeće stavke:
CONTROL "Button 0", 1100, BUTTON, BS_OWNERDRAW | BS_CENTER | BS_VCENTER | BS_MULTILINE | WS_CHILD | WS_VISIBLE | WS_TABSTOP, 0, 28, 34, 28
CONTROL "Button 1", 1101, BUTTON, BS_OWNERDRAW | BS_CENTER | BS_VCENTER | BS_MULTILINE | WS_CHILD | WS_VISIBLE | WS_TABSTOP, 35, 28, 34, 28
CONTROL "Button 2", 1102, BUTTON, BS_OWNERDRAW | BS_CENTER | BS_VCENTER | BS_MULTILINE | WS_CHILD | WS_VISIBLE | WS_TABSTOP, 69, 28, 34, 28
CONTROL "Button 3", 1103, BUTTON, BS_OWNERDRAW | BS_CENTER | BS_VCENTER | BS_MULTILINE | WS_CHILD | WS_VISIBLE | WS_TABSTOP, 104, 28, 34, 28
CONTROL "Button 4", 1104, BUTTON, BS_OWNERDRAW | BS_CENTER | BS_VCENTER | BS_MULTILINE | WS_CHILD | WS_VISIBLE | WS_TABSTOP, 139, 28, 34, 28
CONTROL "Logic", 1012, BUTTON, BS_AUTOCHECKBOX | WS_CHILD | WS_VISIBLE | WS_TABSTOP, 282, 0, 29, 8
CONTROL "Details", 1016, BUTTON, BS_PUSHBUTTON | WS_CHILD | WS_VISIBLE | WS_TABSTOP, 334, 10, 35, 9

Na Buttone koji su BS_OWNERDRAW ne mogu simulirati klik, dok na BS_AUTOCHECKBOX i BS_PUSHBUTTON simulacija klika radi dobro. Pokušao sam promijeniti BS_OWNERDRAW u BS_PUSHBUTTON, međutim tad se dani program više ne ponaša kako bi trebao.

Klikanje na Button sam uradio prema ovom uputstvu: http://www.swissdelphicenter.ch/torry/showcode.php?id=727
Pokušao sam i zamijeniti
PostMessage(H, BM_CLICK, 0, 0);
sa
PostMessage(H, WM_LBUTTONDOWN, 0, 0);
PostMessage(H, WM_LBUTTONUP, 0, 0);
međutim dobivam iste rezultate.

Ima li kakvo rješenje? Zahvaljujem!
[ savkic @ 19.04.2010. 10:35 ] @
> Imam aplikaciju koja ima formu sa par Buttona. Source od te aplikacije ne posjedujem. Želim simulirati klikove na buttone u danoj aplikaciji. Trenutno imam napola
> funkcionalno rješenje, tj. na neke buttone mogu simulirati klik, dok na neke ne mogu.

Pokušaj prvo sa simuliranjem pritisaka na tastaturi, startuj WinSight (dolazi uz Delphi) ili Spy++ (dolazi uz Visual Studio) i pogledaj koje poruke se šalju prozoru kada se odabiraju komande preko tastature. Posle samo treba da fokusiraš taj program i simuliraš mu pritisak na tastaturu pomoću keybd_event ili SendInput. Za simulaciju pritisaka mišem koristi mouse_event ili SendInput. Pogledaj ova dva linka za primere.

http://www.elitesecurity.org/t249539-0#1499539
http://www.elitesecurity.org/t72043-0#457518
[ --ja-- @ 06.05.2010. 18:09 ] @
Igrao sam se sa WinSightom sad i jedna zanimljiva stvar se dogodila. Pratim poruke koje se šalju buttonima, i one jednako izgledaju kao i one koje ja šaljem, međutim program na moje poruke ne reagira.

Onda sam ubacio sleep(150) između mousedown i mouseup poruka, i stvar je proradila (ovo 150 sam odredio eksperimentalno, manji delay ne radi pouzdano, nekad primi nekad ne...)

Ovo za keybd_event i SendInput ću sad pogledati, jer postoje 2 buttona koja nemaju nikakav caption pa ne mogu na taj način doći do njihovog handle-a, a imaju pridružene tipke na tipkovnici (tipke 7 i 8).

Kad pritišćem tipke na tipkovnici ne vidim nikakve keyboard evente u winsightu pa me to zbunjuje...
[ --ja-- @ 07.05.2010. 10:36 ] @
Evo uspio sam i ovo sa tipkama, pa da podijelim, možda će nekome trebati:

Code:
        PostMessage(windowHandle, WM_KEYDOWN, VkKeyScan ('7'), 0);
        sleep(150);
        PostMessage(windowHandle, WM_CHAR, VkKeyScan ('7'), 0);
        sleep(150);
        PostMessage(windowHandle, WM_KEYUP, VkKeyScan ('7'), 0);


Isprva mi nije radio jer sam poruku slao sa SendMessage, dok sa PostMessage radi. Također, ako maknem ove sleep-ove, stvar prestaje funkcionirati.

Sad mi još ostaje samo jedna stvar. U prvom postu navedeni Buttoni ponekad mijenjaju boju (blinkaju). Potrebno mi je da vidim koja je trenutna boja buttona. Pokušao sam pomoću GetPixel ali stalno dobivam crnu boju. Prozor je skriven. Može li se ovo napraviti?
[ savkic @ 07.05.2010. 11:45 ] @
> Sad mi još ostaje samo jedna stvar. U prvom postu navedeni Buttoni ponekad mijenjaju boju (blinkaju). Potrebno mi je da vidim koja je trenutna boja buttona.
> Pokušao sam pomoću GetPixel ali stalno dobivam crnu boju. Prozor je skriven. Može li se ovo napraviti?

Dođi do handla tog buttona, onda do njegovog DCa (GetDC) i potom pozovi GetPixel.
[ --ja-- @ 07.05.2010. 13:26 ] @
Tako sam i pokušao, ali mi ne radi...

Nešto sam uspio pomoću PrintWindow API-ja, međutim to radi samo ako je prozor prikazan na ekranu. Ako ga minimiziram ili mu pošaljem SW_HIDE, onda ova metoda više ne funkcionira.
Preko PrintWindow API-ja dobivam i okvir prozora, a htio bih samo Client Area (s obzirom da debljina okvira ovisi o os-u i postavkama). Pokušam sa opcijom PW_CLIENTONLY ali to ne radi, a kad umjesto toga stavim 1 dobijem neki bijeli okvir okolo, i svejedno iscrta i title bar. Ako pošaljem handle od buttona, a ne od prozora onda mi vrati sliku veličine buttona kompletno bijele boje...

Puno bi mi značilo kad bi prozor s kojeg izvlačim podatke mogao ostati skriven, ali ako baš ne može, onda kako da bar dobijem sliku samo njegovog Client Area?
[ tkaranovic @ 08.05.2010. 15:13 ] @
Traži se Client Area Buttona a to se može u svakom os-u dobiti ovako, iz te slike prozora:

CARect.left := Button.left - Form1.Left;
CARect.top := Button.top - Form1.top;
CARect.Right := Button.Right - Form1.Left;
CARect.Bottom := Button.Bottom - Form1.top;