void CHookedWindow::_KillWindow() { if (!_stOldWindowProc && !_stOldRootWindowProc) return; LogWrite(InstIdx(), "**Exiting main loop**", LT_INFO, __FILE__, __LINE__); _pDelMessageProc->Invoke(TWinMessage(WMT_CLOSE)); _pDelMessageProc->Invoke(TWinMessage(WMT_DESTROY)); if (!_bNoMloopHook && !ReleaseTimer(_uiUpdateTimer)) LOG("Can't kill update timer.", LT_ERROR); if( SetWindowLongPtr(_hWnd, GWLP_WNDPROC, (LONG_PTR)_stOldWindowProc)!=NULL && (_stOldRootWindowProc == NULL || SetWindowLongPtr(_hRootHWnd, GWLP_WNDPROC, (LONG_PTR)_stOldRootWindowProc) != NULL) ) LOG("Window controls message hooks unset successfully.", LT_INFO); else LOG("Can't unset window control message hooks.", LT_ERROR); _stOldWindowProc = NULL; _stOldRootWindowProc = NULL; _pDelMessageProc->Invoke(TWinMessage(WMT_RELEASED)); }
int CMainWindow::_wWinMain(HINSTANCE hInstance) { _pEngineCore->AddToLog("**Entering main loop**"); _bIsLooping = true; MSG st_msg = {0}; while (_bIsLooping) if (PeekMessage(&st_msg, NULL, 0, 0, PM_REMOVE )) { if (WM_QUIT == st_msg.message) _bIsLooping = false; else { TranslateMessage(&st_msg); DispatchMessage (&st_msg); } } else { glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glLoadIdentity(); _pDelMainLoop->Invoke(); SwapBuffers(_hDC); } _pDelMessageProc->Invoke(TWinMessage(WMT_RELEASED)); _pEngineCore->AddToLog("**Exiting main loop**"); return (int) st_msg.wParam; }
TWinMessage WinAPIMsgToEngMsg(UINT Msg, WPARAM wParam, LPARAM lParam) { switch (Msg) { case WM_PAINT: return TWinMessage(WMT_REDRAW); case WM_SHOWWINDOW: if (wParam == TRUE && lParam == 0) return TWinMessage(WMT_PRESENT); else return TWinMessage(); case WM_CLOSE: return TWinMessage(WMT_CLOSE); case WM_CREATE: return TWinMessage(WMT_CREATE); case WM_DESTROY: return TWinMessage(WMT_DESTROY); case WM_SETFOCUS: return TWinMessage(WMT_ACTIVATED); case WM_KILLFOCUS: return TWinMessage(WMT_DEACTIVATED); case WM_MOVING: return TWinMessage(WMT_MOVE, ((RECT*)lParam)->left, ((RECT*)lParam)->top, (RECT*)lParam); case WM_SIZING: return TWinMessage(WMT_SIZE, ((RECT*)lParam)->right - ((RECT*)lParam)->left, ((RECT*)lParam)->bottom - ((RECT*)lParam)->top, (RECT*)lParam); case WM_SIZE: RECT r, rc; r.left = r.top = 0; r.right = LOWORD(lParam); r.bottom = HIWORD(lParam); if (wParam == SIZE_MINIMIZED) return TWinMessage(WMT_MINIMIZED, r.right, r.bottom, &r); else if (wParam == SIZE_RESTORED) return TWinMessage(WMT_RESTORED, r.right, r.bottom, &r); else return TWinMessage(WMT_SIZE, r.right, r.bottom, &r); case WM_KEYUP: return TWinMessage(WMT_KEY_UP, ASCIIKeyToEngKey((uchar)wParam)); case WM_KEYDOWN: return TWinMessage(WMT_KEY_DOWN, ASCIIKeyToEngKey((uchar)wParam)); case WM_CHAR: return TWinMessage(WMT_ENTER_CHAR, wParam); case WM_MOUSEMOVE: return TWinMessage(WMT_MOUSE_MOVE, LOWORD(lParam), HIWORD(lParam)); case WM_LBUTTONDOWN: return TWinMessage(WMT_MOUSE_DOWN, 0); case WM_MBUTTONDOWN: return TWinMessage(WMT_MOUSE_DOWN, 3); case WM_RBUTTONDOWN: return TWinMessage(WMT_MOUSE_DOWN, 2); case WM_LBUTTONUP: return TWinMessage(WMT_MOUSE_UP, 0); case WM_MBUTTONUP: return TWinMessage(WMT_MOUSE_UP, 3); case WM_RBUTTONUP: return TWinMessage(WMT_MOUSE_UP, 2); case WM_MOUSEWHEEL: int delta; delta = GET_WHEEL_DELTA_WPARAM(wParam); return TWinMessage(WMT_MOUSE_WHEEL, 0, 0, &delta); default: MSG msg; ZeroMemory(&msg, sizeof(MSG)); msg.lParam = lParam; msg.wParam = wParam; msg.message = Msg; return TWinMessage(WMT_UNKNOWN, 0, 0, &msg); } }