Skocz do zawartości
  • 👋 Witaj na MPCForum!

    Przeglądasz forum jako gość, co oznacza, że wiele świetnych funkcji jest jeszcze przed Tobą! 😎

    • Pełny dostęp do działów i ukrytych treści
    • Możliwość pisania i odpowiadania w tematach
    • System prywatnych wiadomości
    • Zbieranie reputacji i rozwijanie swojego profilu
    • Członkostwo w jednej z największych społeczności graczy

    👉 Dołączenie zajmie Ci mniej niż minutę – a zyskasz znacznie więcej!

    Zarejestruj się teraz

[pytanie\winapi] Wszystkie drogi prowadza do SendMessage (?)


Rekomendowane odpowiedzi

Opublikowano

Czy jest możliwe pobranie tekstu z kontrolki bez wywoływanie SendMessage ?

 

ktoś wie ?

Zamykam temat, bo autor nie trzyma poziomu.

....

Polityka forum zakazuję nam zamykać tematy, tylko dlatego, że są na niskim poziomie.

I lold.
Opublikowano

Nic z podanych przez Ciebie rozwiązań nie spełnia moich oczekiwań z prostego powodu. GetWindowText oraz GetDlgItemText wywołują SendMessage.

Zamykam temat, bo autor nie trzyma poziomu.

....

Polityka forum zakazuję nam zamykać tematy, tylko dlatego, że są na niskim poziomie.

I lold.
Opublikowano

Tak, widziałem ich "implementacje". Nie wiesz to się nie kłóć. Tak jak poprzednim razem.

 

Te funkcje wywołują SendMessage.

 

Wydaję mi się że użycie SendMessage jest niezbędne do pobrania tekstu, w tym temacie chcę się tylko upewnić, przed publikacją pewnego artykułu(nie, nie na tym forum) w którym właśnie podejmuje takie założenie.

Zamykam temat, bo autor nie trzyma poziomu.

....

Polityka forum zakazuję nam zamykać tematy, tylko dlatego, że są na niskim poziomie.

I lold.
Opublikowano

hmm ciekawe bo jedynym sposobem sprawdzenia czy z wewnatrz funkcji np. getdigitemtext wywolywana jest funkcja sendmessage jest uzycie debuggera(np. olly) i przesledzenie calli. Tym bardziej ze getdigitemtext pobiera text na podstawie uchwytu do kontrolki zawierajacej dane, a ktora znajduje sie przy pomocy funkcji enumchildwindows lub findwindowex, nie za pomoca funkcji sendmessage ktorej callback zwraca nam to odrazu.

Opublikowano

Lub postawienie log breakpointa na SendMessage.

 

Masz rację częściowo, GetDlgItemText nie używa bezpośrednio SendMessage, lecz uzywa funkcji której używa SendMessage i której właściwie wrapperem jest.

 

Teraz to sprawdziłem, zdziwiłem sie, gdyś kiedyś usłyszałem że od moim zdaniem kompetentnego człowieka że GetWindowText w rzeczywistości używa SendMessage (a getDlgItemtext używa GetWindowText, co jest prawdą).

Zamykam temat, bo autor nie trzyma poziomu.

....

Polityka forum zakazuję nam zamykać tematy, tylko dlatego, że są na niskim poziomie.

I lold.
Opublikowano

Winapi nie uzywalem lub inaczej nie zglebialem sie na tyle nigdy, bo nie bylo mi potrzebne, zeby sprawdzac wywolania funkcji posrednich. Mozliwe ze sendmessage jest na tyle podstawowa funkcja winapi, ze wiekszosc funkcji opartych na danych kontrolek przez nia przechodzi. Jesli naprawde chcesz uzyskac odpowiedz na to pytanie to napisz lepiej post na forum 4programmers. Tam udziela sie wielu starych wyjadaczy znajacych pewne sztuczki i magie c-pochodnych jezykow, w tym sam gynvael, wiec jesli da sie to zrobic bez uzycia, co jest bardzo mozliwe wg mnie to tam znajdziesz odpowiedz.

Opublikowano

Powiem Ci tak. Oczywiscie, że się da to zrobić bez użycie SendMessage. Jednak jest to metoda nieuniwersalna - mianowicie szukasz adresów w pamięci, które najczęściej są wielopoziomowymi (niekoniecznie) wskaźnikami na struktury/klasy i inne w których przechowywany jest szukany tekst. Jeśli znajdziesz raz odpowiedni adres jesteś w stanie pobrać tekst i inne dane z zewnętrznej aplikacji poprzez ReadProcessMemory (nie będę tutaj oczywiście opisywał jak tej funkcji poprawnie użyć). Niestety musisz dla każdej aplikacji szukać tych adresów osobno (co jest oczywiste) ponieważ są one zmienne, co jest wynikiem odmiennej budowy/ułożenia kodu każdego programu. Prawdopodobnie gdyby "zdebugować" co dokładnie dzieje się z aplikacją okienkową do której wyślemy wiadomość WM_GETTEXT, poprawnie ustawiając breakpointa, dowiedzielibyśmy się jak interpretowany jest uchwyt okna aplikacji i w jaki sposób Windows/program zwraca nam to co chcieliśmy. Można by po mozolnym patrzeniu w kod assemblera znaleźć uniwersalne rozwiązanie, jednak co do tego nie jestem pewien :)

Opublikowano

Funkcja GetDlgItemText wywołuje GetWindowText.

 

I dalej są gdzieś tam wywoływane 2 funkcje:

 

FTeRQ.png

 

 

 

 

Funkcja SendMessage nie jest bezpośrednio wywoływana, ale te dwie funkcje już tak. Jak możemy zobaczyć funkcja SendMessage jest ewidentym wrapperem do funkcji nr 2 na załączonym obrazku.

 

Sprawdziłem to w taki sposób że o pomyłce nie może być mowy.

bpx <--- ustawienie log breakpointów

call GetDlgItemTextA

bpx <---- odczytanie logów

 

Właściwie potrzebne jest mi to do uniwersalnego znajdowania miejsca w kodzie gdzie pobierany jest tekst.

Tzn możemy robic nie wiadomo ile bpx na różne funkcje ale zastanawiam sie czy nie możemy tego wszystkiego rozwiązać prościej, bo wydaje się wszystkie funkcje pobierania tekstu działają podobnie - wywołują tą samą core funkcje ( nr 2 na obrazky, tak sądzę)

 

@edit

omg, to nie moje zakładki !!!1

Zamykam temat, bo autor nie trzyma poziomu.

....

Polityka forum zakazuję nam zamykać tematy, tylko dlatego, że są na niskim poziomie.

I lold.
Opublikowano

No takie asmowe rozwiazania sa najbardziej oczywiste jesli chcemy pominac wywolanie funkcji. Tylko wlasnie trzebaby poznac budowe struktury danej kontrolki. Zapewne wiekszosc kontrolek dziedziczy z jakiejs nadrzednej, wiec budowa powinna byc bardzo podobna, i wystarczyloby znac adres poczatku struktury, zeby dostac sie do czystych danych. WINAPI jest obecnie dosyc malo uzywany do pisania aplikacji okienkowych z tego wzgledu, ze zeby napisac cos trzeba nawalic kodu 2-4x wiecej niz przy uzyciu zewnetrznych bibliotek, a efekty w takich sa czesto ciekawsze i latwiejsze do uzyskania niz tutaj.

 

Tak spojrzalem w dokumentacje jeszcze. Sprawdz PostMessage, bo z tego co napisali dzialaja na podobnej zasadzie tylko w przypadku postmessage wywolanie jest dolaczane do kolejki wiadomosci i oczekuje na wykonanie w oddelegowanym watku. Mozliwe ze nie uzywa sendmessage.

Zarchiwizowany

Ten temat przebywa obecnie w archiwum. Dodawanie nowych odpowiedzi zostało zablokowane.

×
×
  • Dodaj nową pozycję...