Gość Opublikowano 6 Maja 2012 Udostępnij Opublikowano 6 Maja 2012 Witam. Mam problem, z którym 2 lata temu sobie poradziłem, a dziś za nic nie potrafię tego zrobić. Nie wiem czy to mój błąd czy po prostu wada wrodzona GMa. Chodzi o to, że w DLLce, którą piszę, zamieniam główną procedurę okna GM na swoją, żebym mógł obsługiwać różne komunikaty. prevLong = GetWindowLong(hWndParent, GWL_WNDPROC); SetWindowLong(hWndParent, GWL_WNDPROC, (LONG)WndProc); tym samym "tworząc" kopię oryginalnej procedury. No i ok, procedura się zamienia, wszystko ładnie pięknie. Problem nadchodzi, kiedy muszę wrócić do poprzedniej procedury. Kiedy wywołam w GM ręcznie funkcję, która zamienia procedurę na oryginalną (np. przez alarm), to jest ok. Okno i proces normalnie się zamykają i nie ma żadnych problemów. Ale kiedy dam tę funkcję do zdarzenia Game End to się sypie. Okno znika, ale nie zamyka się, a proces nadal pozostaje. Próbowałem też dać w to w Room End i nic. Kolejną próbą ratunku było dodanie w DllMain do DLL_PROCESS_DETACH funkcji, która przywróci oryginalną procedurę case DLL_PROCESS_DETACH: SetWindowLong(hWndParent, GWL_WNDPROC, prevLong); break; Też nic. No i tutaj moje pomysły się kończą, bo już nie wiem w jaki sposób przywrócić tę procedurę, żeby program zamykał się poprawnie. YXE kiedyś mi z tym pomógł, dziś zwracam się z tym pytaniem do całej społeczności. Zapomniałbym: prevLong mam wcześniej zdefiniowane, a kwestia tego, czy procedura faktycznie się zamienia na nową - sprawdzałem, wszystko jest ok. Chyba jasno opisałem problem, bardzo bym prosił o pomoc :) Z góry dzięki. Pozdrawiam. Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
Will Opublikowano 6 Maja 2012 Udostępnij Opublikowano 6 Maja 2012 Ze swojej wszystko czego nie obsługujesz dawaj do: http://msdn.microsoft.com/en-us/library/wi...1(v=vs.85).aspx Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
Gość Opublikowano 6 Maja 2012 Udostępnij Opublikowano 6 Maja 2012 Analizując to co podałeś, to jeśli nic nie robię tą swoją procedurą, to wykonywana jest ta oryginalna? Dobrze rozumiem? Bo dodałem to do swojej WndProc: LRESULT CALLBACK WndProc(HWND hWndParent, UINT uMsg, WPARAM wParam, LPARAM lParam) { switch (uMsg) { case WM_COMMAND: dllWPARAM = wParam; dllLPARAM = lParam; return 0; break; default: return CallWindowProc((WNDPROC)prevLong, hWndParent, uMsg, wParam, lParam); } return 0; } i teraz działa, tylko nie mam jeszcze gotowych innych funkcji, żeby sprawdzić czy poprawnie. Ale wystarczy mi odpowiedź na pierwsze pytanie, to już poleci z górki :) Dzięki. E: Ok, dopisałem funkcję i działa :) Dzięki wielkie, Will. Tylko teraz mam problem w tej funkcji: if ((HWND)dlParam == hWnd) { return 1; } return 0; dlParam = -1; hWnd = NULL; Jjeśli dlParam == hWnd to zwraca 1 i wyświetla okienko z informacją. Mimo tego, że ustawiam po wykonaniu funkcji dlParam na -1 to i tak okienko się stale wyświetla. Wszystko sprawdzam w stepie. if (clicked(button) == 1) { show_message(""); } i powstaje pętla. E: Ok, już sam naprawiłem. Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
Rekomendowane odpowiedzi
Jeśli chcesz dodać odpowiedź, zaloguj się lub zarejestruj nowe konto
Jedynie zarejestrowani użytkownicy mogą komentować zawartość tej strony.
Zarejestruj nowe konto
Załóż nowe konto. To bardzo proste!
Zarejestruj sięZaloguj się
Posiadasz już konto? Zaloguj się poniżej.
Zaloguj się