Forum Gry Hobby Sprzęt Rozmawiamy Archiwum Regulamin

Forum: C++ - wpisywanie tekstu do wyszukiwarki

17.12.2013 17:11
😉
1
zanonimizowany627706
66
Senator

C++ - wpisywanie tekstu do wyszukiwarki

Witam, chciałbym napisać program który po otworzeniu otwiera przeglądarkę, wpisuje tekst w okno a następnie zatwierdza go. Przykładowo automatycznie otwiera się wyszukiwarka googla, wpisuję się do niej tekst "Ala ma kota" po czym zatwierdza się i przechodzi do wyszukiwania. Na początek dałem coś takiego:

ShellExecuteA(0, "open","chrome.exe","www.google.pl",0,SW_SHOWNORMAL);

Otwiera to przeglądarkę i stronę google.pl. Nie niestety jak zabrać się za wpisywanie. Myślałem o dołączeniu biblioteki <fstream> ale nie wiem jak wysłać tekst do pola w przeglądarce. Poda ktoś pomocną dłoń?

17.12.2013 17:32
2
odpowiedz
zanonimizowany939996
5
Chorąży

w ShellExecute nie musisz podawać przeglądarki, program sam uruchomi adres w domyślnej przeglądarce.
A jak chcesz to uruchamiaj od razu stronę typu: https://encrypted.google.com/#q=cukierki
tyle, że w tym przykładzie wyszukiwanie jest dynamiczne z javascript, powinno być ok, choć inny typ zapytania do google też na pewno jest.

A jak chcesz wpisywać coś ręcznie do danego okna to musisz znaleźć uchwyt do okna h: HWND, funkcja FindWindow (i może FindWindowEx), później skorzystać z np. SendMessage i WM_SETTEXT, albo WM_KEYDOWN i tak dalej. Poszukaj w google czegoś z notatnikiem jak findwindow notepad. Albo z symulacją naciśnięcia klawiszy. Choć najepiej będzie gdy uruchomisz stronę tak jak ci na początku napisałem, bez bawienia się w inne funkcje (jak z javascript to #q=cukierki, a bez javascript to sam spradź wyłączając javascript w przeglądarce i wyszukując czegokolwiek)

btw. a gdybyś chciał pobierać dane ze strony i mieć je w programie to poczytaj o GET i o POST, o winsock też możesz czytać

17.12.2013 18:36
😊
3
odpowiedz
zanonimizowany627706
66
Senator

Dzięki za odpowiedź :) Niestety nie mogę użyć wyszukiwania tak jak w pierwszym przykładzie :/
Musi to być koniecznie tekst ze zmiennej w programie. Wykombinowałem coś takiego, ale kompilator się buntuje...

string tekst;
tekst="Ala ma kota";
LRESULT SendMessage(FindWindow("gbqfq",NULL), tekst, 0, 0);

17.12.2013 19:10
4
odpowiedz
zanonimizowany939996
5
Chorąży

zamiast tekstu to może to + tekst w innym miejscu, w parametrze?
http://msdn.microsoft.com/en-us/library/windows/desktop/ms632644%28v=vs.85%29.aspx

po drugie jak robisz FindWindow to upewnij się, czy w ogóle znajduje ci okno, czy uchwyt ma jakąś wartość. Po trzecie nawet jak okno znajdzie to możliwe, że jeszcze do kolejnej rzeczy będziesz musiał mieć uchwyt, nie wiem jak SendMessage zadziała w przeglądarce, bo nie wysyłałem nic do przeglądarki nigdy. Najpierw sprawdź na notatniku. Program WinINFO może ci się przyda do podejrzenia nazw uchwytów.

A u mnie ShellExecute działa dobrze, otwiera nową kartę w firefoxie z adresem google, czyli https://encrypted.google.com/#q=koty
Ale nie piszę w c++

wklej tu kod, który masz z tym ShellExecute

17.12.2013 20:17
5
odpowiedz
zanonimizowany792388
37
Generał

Uchwytami okien z winapi na 99% tego nie zrobisz, bo kontrolki na stronach reprezentowane sa przez cos innego niz WinAPI.

Ponizej moj algo, ale juz wymagajacy skilla:
* uruchamiasz Chrome`a najlepiej na full screenie bez paskow narzedziowych i wchodzisz na strone google(to juz masz)
* majac widoczne okno Chrome`a robisz zrzut ekranowy ekranu na ktorym jest uruchomiony chrome z Google
* wrzucasz ten zrzut dwa razy do OpenCV, pierwszym razem szukasz za pomoca wzorca obszaru podobnego do kontrolki w ktorej wpisujesz tekst na google, drugim razem uzywajac innego wzorca szukasz przycisku "Szukaj w google"
* jesli oba wzorce zostaly znalezione to okreslasz ich polozenie i rozmiar na ekranie dostajac polozenie w pixelach
* teraz majac polozenie obu kontrolek na ekranie symulujesz globalnie w systemie nacisniecie lewego klawisza myszy na obszarze google w ktorym wprowadzany jest tekst
* wklejasz do schowka wartosc swojej zmiennej, symulujesz globalnie ctrl+v(wklejenie), polowa sukcesu!
* teraz majac polozenie przycisku "szukaj w google" symulujesz globalnie nacisniecie LPM

Done !

Symulowanie kopiowania, wklejenia i klikniecia LPM bez problemow mozesz zrobic za pomoca WinAPI.

17.12.2013 20:31
6
odpowiedz
Kijano
91
Generał

Przygotowanie
1) Uruchamiasz Google Chrome
2) Uruchamiasz Spy++
3) Szukasz nazwy textboxu jaki nadali programisci
4) zamykasz Spy++ i Google Chrome

W kodzie
1) Przejmujesz okno Google Chrome (FindWindow)
2) Za pomocą FindWindowEx + nazwa textboxa pobierasz jego id i "uchwyt"
3) Robisz send message z swoim tekstem na "uchwyt"
A i najważniejsze :)
4) wysyłasz enter

Koniec

To tylko za pomoca WinApi, mozna jeszcze na wiele innych sposobow to zrobic

17.12.2013 20:31
7
odpowiedz
zanonimizowany939996
5
Chorąży

btw. już wiem dlaczego miałeś problemy, bo twoje zapytanie składa się z kilku słów i np. znaków specjalnych i słowa:
co robić?
będą zamienione na:
co+robić%3F

i wtedy działa dobrze shellexecute z tą zmienną. Po prostu napisz funkcję, która przerobi napisy w zmiennej na te odpowiadające adresom url, w google znajdziesz spis znaków i obok znaku odpowiednik np. ? -> %3F.
StringReplace istnieje w c++? pewnie tym byś banalnie zamieniał znak jakiś na inne znaki, a spacje na plusy

//edited
masz nawet na tej stronie spis znaków (na dole)
http://www.w3schools.com/tags/ref_urlencode.asp

tylko spację zamieniaj na plus zamiast na %20 (hmm, jednak %20 także działa heh)

17.12.2013 22:10
👍
8
odpowiedz
zanonimizowany627706
66
Senator

[4] - Kod z ShellExecute działa, tylko jak wklejam linijke z WinApi to wywala błąd :)

Dzięki panowie za odpowiedzi! :) Pokombinuje sobie teraz i zobacze czy mi bangla :)

Forum: C++ - wpisywanie tekstu do wyszukiwarki