举报

EasyX如何获取关闭消息(WM_CLOSE)

0

我希望程式能在關閉前,先執行我要完成的內容

我嘗試用GetMessage获取關閉消息 ,但是無法成功获取

        MSG msg;
        while (1) {
            GetMessage(&msg, hwnd, 0, 0);
            if (msg.message == WM_CLOSE) {
                    /*执行关闭前的处理*/
            }
        }

一种可以继续用easyX消息函数以及处理WM_CLOSE的方法,本人测试是可行的,但不确定原理为何:

WNDPROC g_OriginWndProc = NULL;    

LRESULT CALLBACK WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{    
    if (uMsg == WM_CLOSE) {
        exit(0);
    }
    else {    
        LRESULT result = CallWindowProc((WNDPROC)g_OriginWndProc, hwnd, uMsg, wParam, lParam);
        return result;
    }
}

int main() {
    HWND hwnd = initgraph(1296, 960);   
    g_OriginWndProc = (WNDPROC)GetWindowLongPtr(hwnd, GWLP_WNDPROC);
    SetWindowLongPtr(hwnd, GWLP_WNDPROC, (LONG_PTR)WindowProc);

}

ava
josh

2023-10-25

0
我照著您提供的問題回答,試著用 SetWindowLongPtr修改窗口過程函數:LRESULT CALLBACK WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam){    if (uMsg == WM_CLOSE) {        exit(0);    }    else {        return DefWindowProc(hwnd, uMsg, wParam, lParam);    }}雖然能获取WM_CLOSE,但是我的程式getmessage這些EasyX函數都失效了,有什麼辦法能修復這些問題呢? -  josh  2023-10-25
@josh 原贴里介绍过,这个事件处理是在另一个线程。你可能需要通过一些线程同步的技术来完成你的需求。 -  慢羊羊  2023-10-25
@慢羊羊 是因为我修改窗口过程函数,导致EasyX::GraphWnd::WndProc失效吗,我感觉EasyX的消息处理函数失效可能跟线程同步无关 -  josh  2023-10-27
@josh 看给你的参考地址,该做法不会让 easyx 的消息处理失效。但你必须清楚,这是两个线程。如果对多线程不太熟悉,建议换一个设计。 -  慢羊羊  2023-11-3
技术讨论社区