Skocz do zawartości

Zmiana głównej procedury przesyłu informacji okna GM


Bedi

Rekomendowane odpowiedzi

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

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

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ę
  • Ostatnio przeglądający   0 użytkowników

    • Brak zarejestrowanych użytkowników przeglądających tę stronę.
×
×
  • Dodaj nową pozycję...