WinApi, przechwytywanie komunikatow z aktywnego okna

0

Witam! Od tygodnia bawie sie w winapi... dla cwiczen postanowilem napisac symulator pijanego czlowieka przed komputerem, okienka sie ruszaja powiekszaja itd... Wszystko mi ladnie szlo tylko chce tez zamienic przyciski myszki, lewy z prawym i na odwrot, na glownym oknie programu zrobilem to sprawdzajac i zmieniajac komunikat w petli komunikatow... Niestety po przejsciu do innego okienka (pobieram uchwyt GetForegroundWindow) nie otrzymuje komunikatow, z tego co wiem to GetMessage dziala tylko do 1 watku, wiec pytanie jak mam przeniesc sciaganie komunikatow na inne okienko z calkiem innej aplikacji? Dzieki z gory :))

Ps. google przekopalem w poszukiwaniu podobnego problemu ale cos rozwiazania nie znalazlem.

EDIT: dopiero znalazlem SwapMouseButton... ale miloby bylo wiedziec jak przechwytywac komunikaty z innych oknien ;p

0

z tego co wiem z GetForegroundWindow dostajesz uchwyt do okna. jezeli tak to mozna takie cos:

WNDPROC oldproc;
HWND _hwnd;

LRESULT CALLBACK MyWndProc (HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
    switch(msg)
    {
        //twoje przetwarzanie wiadomosci zakonczone na break (albo przez return CallWindowProc(...); ) - wazne zeby przekazac wiadomosc dalej
    }
    return CallWindowProc (oldproc, hwnd, msg, wParam, lParam);
}

void Overtake ()
{
    _hwnd = GetForegroundWindow ();
    oldproc = (WNDPROC)GetWindowLong (_hwnd, GWL_WNDPROC);
    SetWindowLong (_hwnd, GWL_WNDPROC, MyWndProc);
}
 

jkbym cos pokopal to mowcie ale powinno byc dobrze ;)

i aby przejac uzywasz powyzszego Overtake () i masz. trzeba by dopisac jeszcze osobno przywrocenie do stanu pierwotnego ale to wyglada w sumie tak samo jak Overtake ()

0

Porwalem sie z motyka na slonce ;p, na chwile obecna niewszystko rozumiem ale widac ze powinno zadzialac. Dzieki tak czy siak ;)

0

zapytaj msdn to ci sie wyjasni sporo z tego co napisalem ;)

to co napisalem to jest zwykle przejecie procedury obslugi okna (to co normalnie podajesz w deffiniowaniu klasy)

0

D:\code block\winapi firefox\main.cpp|105|error: invalid conversion from 'LRESULT ()(HWND__, UINT, WPARAM, LPARAM)' to 'LONG'|
D:\code block\winapi firefox\main.cpp|105|error: initializing argument 3 of 'LONG SetWindowLongA(HWND__*, int, LONG)'|

Jednak cos sie nie kompiluje, zerknij jeszcze raz na poprawnosc kodu jak mozesz. Ja nie ogarniam jeszcze a potrzebuje przechwycic pare komunikatow ;)

0

sprobuj SetWindowLong (..., (LONG)MyWndProc)

ewentualnie SetWindowLong (..., (LONG)&MyWndProc);

ja zaraz w dev cpp zobacze ;)

u mnie przepuscil z (LONG)MyWndProc

0

Dzieki, dziala ale nadal tylko na oknie mojego programu.
MSDN
GWL_WNDPROC
Sets a new address for the window procedure.

You cannot change this attribute if the window does not belong to the same process as the calling thread.

Wiec nie ma szans na zmiane procedury okna innego procesu?

0

skoro msdn powiedzial ze nie mozna zmienic procedury okna innego procesu w ten sposob to pozostaje juz chyba tylko metoda wstawiania kodu (ang. Code injection). Majac adres procedury moznaby wstawic na jej poczatku odnosnik do twojej i w ten sposob przejac. Zakladajac ze wczesniej opisana metoda dzialala by 'po stronie twojego programu' to code injection bylby bardziej po stronie przechwytywanego procesu. Tylko ze takie zadanie jest dosc trudne do zrobienia i wymaga znajomosci asemblera (juz nie mowiac o uprawnieniach, wielowatkowosciach itp) wiec dosc trudno by bylo ale do zrobienia jest ;)

0

Ok, wiec dam sobie spokoj ;). Dzieki za pomoc!

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