Piszę prostą aplikację robiącą za menu podręczne, która reaguje na odpowiednie kliknięcia na myszce. Program zakłada globalnego hook`a na myszkę (dll), dzięki czemu może reagować w (praktycznie) każdym momencie na akcję użytkownika. Jaki mam problem? Ano z odczytaniem współrzędnych kursora, chociaż nawet nie tyle odczytanie co przekształcenie tych wartości na poprawne dane (czyt. współrzędne globalne, a nie lokalne danego okna). Funkcja:
mouseProc(int code, WPARAM wParam, LPARAM lParam) {
PostMessage(hWnd, MS_HOOK, wParam, lParam);
return CallNextHookEx(hMouseHook, code, wParam, lParam);
}
Wysyła do głównego (mojego) okna informację o tym, że coś się dzieje z myszką, w wParam znajduje się komunikat, w lParam wskaźnik na strukturę MOUSEHOOKSTRUCT (link). W owej strukturze znajdują się między innymi koordynaty kursora oraz uchwyt okna z którego został wysłany komunikat.
I problem występuje właśnie w tym momencie. W samej dll`ce (w mouseProc), wartości te istnieją i dają się odczytywać, natomiast gdy próbuję odczytać dane w moim oknie (programie), dostaję od systemu "Access Violation". Przykład:
MOUSEHOOKSTRUCT *pm;
HWND test;
pm = (MOUSEHOOKSTRUCT *)lParam;
test = pm->hwnd; // Access Violation
Próbowałem to sobie tłumaczyć w taki oto sposób: dllka w momencie zakładania hook
a jest wstrzykiwana w program, z którego będą odbierane komunikaty (myszki). Gdy dllka posiada wskaźnik, to ma prawo dostępu do obszaru pamięci, na który owy pointer wskazuje - dlatego w funkcji mouseProc(), mogę odczytać potrzebne dane. Natomiast, gdy dll
ka prześle wskaźnik na strukturę do mojego okna (programu), to system odmawia pozwolenia na odczyt danego obszaru pamięci - na co wskazuje właśnie "Access Violation".
Jeśli dobrze rozumuję, to w takim razie jak obejść ten problem...? Mogę wysłać każdą składową struktury w osobnym komunikacie, jednak jest to IMHO czasochłonne, skomplikowane (odbieranie wielu komunikatów, synchronizacja/kolejkowanie itp.) i raczej mało atrakcyjne rozwiązanie. W takim razie powinienem skorzystać z pamięci współdzielonej (shared memory)? Jeśli tak, to gdzie znajdę klasę dla C++ +WinAPI?