Wysyłanie sygnału do innej aplikacji

0

Witam,
Z programowaniem mam już trochę do czynienia (3 rok informatyki, c, c++, qt, java). Ostatnio chcę zabrać się za pisanie pewnej aplikacji ale zwyczajnie brak mi wiedzy. Chodzi o to aby przy pomocy mojej aplikacji wysyłać sygnał/działanie do innej aplikacji, np. podpinam do zwykłego kalkulatora windowsa i po naciśnięciu klawisza w mojej aplikacji "naciskany jest" przykładowo przycisk '=' w kalkulatorze. Na razie z tego co udało mi się odnaleźć widzę, że powinienem zainteresować się bibliotekami DLL oraz ich wstrzykiwaniem oras Windows Hooks. Na ten moment wiedzę na ten temat mam niewielką a z luźno zebranych informacji znalezionych w googlach trudno się czegos konkretnego nauczyc. I tu moje pytania: Czy dlle i hooks to na prawdę to czym powinienem się zainteresować do tego typu aplikacji? Jeśli nie to czym? Jeśli tak to jaką literaturę, ew strony polecicie do zapoznania się z tematem.

2

Do czegoś takiego wystarczą standardowe funkcje WinAPI. Zainteresuj się FindWindow, EnumWindow, FindChildWindow itp. Jak już znajdziesz odpowiednie okno/przycisk(można ich dane podglądnąć np. przez Spy++) to wystarczy SendMessage do wysłania odpowiedniego komunikatu.

0

Dzięki za informacje, masz może jeszcze do polecenia jakieś w miarę rzetelne materiały na ten temat? Nie lubię się uczyć czegoś na wyrywki tylko jak już to porządnie :)

0

Najlepszym źródłem będzie MSDN, ale przydałaby Ci się wiedza jak mniej więcej działa WinAPI - pełno tutoriali w necie jest, a wystarczy Ci poznać koncepcję

0

Korzystając z przykładów i tutoriali próbowałem na razie napisać coś co znajdzie mi uchwyt do szukanego okna, wyszło coś takiego:

#include <windows.h>


static int i = 1;
 

 BOOL CALLBACK enumWindowsProc( HWND hWnd, LPARAM lParam )
 {
char cTitle[255];
char wName[255];
GetWindowText(hWnd,(LPWSTR)wName,255);
 fprintf(stdout,"HWND of window nr %d: %d	%d.\n",i++,(DWORD)hWnd, wName);

GetWindowText( hWnd, (LPWSTR)cTitle, 255 );

 if( (strcmp( cTitle, (char*)lParam )) == 0 )
 {
 fprintf(stdout,"Found!\n");
 return false;
 } 
 return TRUE;
 }
 
 int main()
 {
 char cTitle[] = { "Notepad" };
 
 EnumWindows( (WNDENUMPROC)enumWindowsProc, (LPARAM)cTitle );
 getchar();
 return 0;
 }

Nie wiem czy coś źle zrozumiałem, czy o co chodzi, ale nigdy nie znajduje wyszukiwanego okna (nigdy nie wyświetla mi się napis "Found!"). Poza tym chciałem obok każdego uchwytu wyświetlić nazwę jego okna i nie wiem co robię nie tak ale przy każdym uchwycie zamiast nazwy pojawia się ta sama liczba (inna przy każdym uruchomieniu). Mógłby ktoś naprowadzić mnie na błędy i wytłumaczyć o co chodzi?

1

Rzutujesz char na LPWSTR co nie będzie działać. Zamiast char użyj wchar_t lub zamiast GetWindowText użyj GetWindowTextA. Bez tego A używasz GetWindowTextW, która operuje na stringach w Unicode.

//W C chyba nie ma typu wchar_t

0

Jestem w tym momencie na grzebaniu w aplikacji do której chcę wysyłać sygnały przez Spy++. Czy da się i jak tak to w jaki sposób przy jego pomocy uzyskać wszystkie potrzebne parametry do SendMessage podczas wykonywanej akcji (naciskanie przycisku myszką)? Próbuję podglądać wiadomości wysyłane przez okno ale jakoś nie wiele mi z tego przyszło, nie wiem czy źle je odczytuję czy robię coś nie tak.

0

Raczej nie potrzeba podglądać wiadomości(ale to zależy co chcesz zrobić). Powinno wystarczyć dowiedzieć się jakiej klasy jest dana kontrolka. Zależy w czym program jest napisany, ale jak się ID kontrolki nie zmienia to wystarczy znać jej ID, wtedy można pobrać uchwyt, a mając uchwyt można wysyłać komunikaty.

0

Jak robiłem to sobie testowo na kalkulatorze widnowsa to owszem dało się ładnie dobrać do przycisków ale aplikacja z którą się bawię jest chyba napisana w inny sposób, nie widzę tam żadnych standardowych przycisków. Wymyśliłem sobie żeby jakoś sprawdzić jaki sygnał jest wysyłany gdy klikam na przyciski ale jakos nie mogę się do tego dobić. Może dało by się to jakoś zrobić poprzez pozycjonowanie kursora myszy w odpowiednim miejscu okna a następnie klikanie? Czy jaki sposób byś sugerował?

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