wince禁止程序标题栏上的退出按钮示例


在Windows编程中,如果你想禁止程序标题栏上的退出按钮(通常是窗口右上角的关闭按钮),你可以通过处理窗口消息来实现。以下是一个使用Win32 API(在C++中)的简单示例,展示了如何创建一个窗口并禁止关闭按钮。

请注意,直接禁止关闭按钮可能会让用户感到困惑,因为他们可能不知道如何安全地关闭你的程序。因此,一个更常见的做法是拦截关闭按钮的消息,并在那里执行一些清理操作,然后再安全地关闭程序。但根据你的要求,这里是一个禁用关闭按钮的示例:


#include <windows.h>

LRESULT CALLBACK WindowProcedure(HWND, UINT, WPARAM, LPARAM);

char szClassName[ ] = "WindowsApp";

int WINAPI WinMain(HINSTANCE hThisInstance,
                   HINSTANCE hPrevInstance,
                   LPSTR lpszArgument,
                   int nCmdShow)
{
    HWND hwnd;               // 窗口句柄
    MSG messages;            // 消息
    WNDCLASSEX wincl;        // 窗口结构

    // 窗口结构
    wincl.hInstance = hThisInstance;
    wincl.lpszClassName = szClassName;
    wincl.lpfnWndProc = WindowProcedure;      // 窗口过程
    wincl.style = CS_DBLCLKS;                 // 双击
    wincl.cbSize = sizeof(WNDCLASSEX);

    // 使用默认图标和鼠标指针
    wincl.hIcon = LoadIcon(NULL, IDI_APPLICATION);
    wincl.hIconSm = LoadIcon(NULL, IDI_APPLICATION);
    wincl.hCursor = LoadCursor(NULL, IDC_ARROW);
    wincl.lpszMenuName = NULL;                 // 无菜单
    wincl.cbClsExtra = 0;                      // 没有额外的窗口数据
    wincl.cbWndExtra = 0;                      // 没有额外的窗口数据
    wincl.hbrBackground = (HBRUSH)COLOR_BACKGROUND; // 窗口背景色

    if (!RegisterClassEx(&wincl))
        return 0;

    hwnd = CreateWindowEx(
       0,                   // 扩展风格
       szClassName,         // 类名
       "Windows App",       // 窗口标题
       WS_OVERLAPPEDWINDOW, // 默认窗口
       CW_USEDEFAULT,       // Windows决定位置
       CW_USEDEFAULT,       // Windows决定大小
       HWND_DESKTOP,        // 父窗口
       NULL,                // 无菜单
       hThisInstance,       // 程序实例句柄
       NULL                 // 附加应用数据
    );

    ShowWindow(hwnd, nCmdShow);

    // 消息循环
    while (GetMessage(&messages, NULL, 0, 0))
    {
        TranslateMessage(&messages);
        DispatchMessage(&messages);
    }

    return messages.wParam;
}

// 窗口过程函数
LRESULT CALLBACK WindowProcedure(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
    switch (message)                  // 处理窗口消息
    {
    case WM_DESTROY:
        PostQuitMessage(0);       // 发送退出消息
        break;
    case WM_CLOSE:
        // 在这里,我们不做任何事情,从而禁止窗口关闭
        // 通常你会在这里调用DestroyWindow(hwnd); 但现在我们不这样做
        return 0; // 表示消息已被处理
    default:                          // 其他消息
        return DefWindowProc(hwnd, message, wParam, lParam);
    }

    return 0;
}

在这个例子中,我们处理了`WM_CLOSE`消息,但没有执行任何关闭窗口的操作(如调用`DestroyWindow`)。这实际上会阻止窗口通过点击关闭按钮来关闭。然而,请注意,这仍然允许用户通过任务管理器或其他方式强制关闭程序。如果你想要更彻底地控制程序的退出,你可能需要在程序中实现更复杂的逻辑,以确保所有资源都被正确释放。