在现代版本的 Windows 上最小化窗口是否仍将其移动到坐标 (-32000, -32000)?

Gov*_*mar 6 windows-nt window-managers screen

根据Raymond Chen 的这篇博客文章,Windows NT 通过将窗口移动到坐标 (-32000, -32000) 来“最小化”窗口,并且,我从阅读它得到的印象是 Windows NT的早期版本就是这种情况(3.x,4...)。

在现代版本的 Windows NT(例如 7、8 和 10)中,情况是否仍然如此?

是否有可以编写的程序来演示现代 Windows 操作系统上此功能的存在/不存在?

Gov*_*mar 4

回答我自己的问题...我编写了一个小型 C 程序来完成我的要求。基本上,它使用代码创建一个窗口,如果窗口的位置在 x 或 y 维度上更改为负值,它会将静态文本字段的文本设置为新坐标。

该程序在 Windows 10 RTM 上的输出:

该程序的输出

#include <Windows.h>
#include <windowsx.h>
#include <CommCtrl.h>
#include <strsafe.h>
#include <sal.h>

#pragma comment(lib, "comctl32.lib")

#if defined _M_IX86
#pragma comment(linker,"/manifestdependency:\"type='win32' name='Microsoft.Windows.Common-Controls' version='6.0.0.0' processorArchitecture='x86' publicKeyToken='6595b64144ccf1df' language='*'\"")
#elif defined _M_IA64
#pragma comment(linker,"/manifestdependency:\"type='win32' name='Microsoft.Windows.Common-Controls' version='6.0.0.0' processorArchitecture='ia64' publicKeyToken='6595b64144ccf1df' language='*'\"")
#elif defined _M_X64
#pragma comment(linker,"/manifestdependency:\"type='win32' name='Microsoft.Windows.Common-Controls' version='6.0.0.0' processorArchitecture='amd64' publicKeyToken='6595b64144ccf1df' language='*'\"")
#else
#pragma comment(linker,"/manifestdependency:\"type='win32' name='Microsoft.Windows.Common-Controls' version='6.0.0.0' processorArchitecture='*' publicKeyToken='6595b64144ccf1df' language='*'\"")
#endif


WCHAR g_szClassName[] = L"CoordReportWnd";

LRESULT CALLBACK WindowProc(_In_ HWND hWnd, _In_ UINT Msg, _In_ WPARAM wParam, _In_ LPARAM lParam);
BOOL CALLBACK EnumChildProc(_In_ HWND hWnd, _In_ LPARAM lParam);

ATOM RegisterWCEX(_In_ HINSTANCE hInstance)
{
    WNDCLASSEXW wcex;
    ZeroMemory(&wcex, sizeof(WNDCLASSEXW));

    wcex.cbSize = sizeof(WNDCLASSEXW);
    wcex.lpfnWndProc = WindowProc;
    wcex.hInstance = hInstance;
    wcex.lpszClassName = g_szClassName;
    wcex.hIcon =
    wcex.hIconSm = LoadIconW(NULL, IDI_APPLICATION);
    wcex.hCursor = LoadCursorW(NULL, IDC_ARROW);
    wcex.hbrBackground = (HBRUSH) COLOR_WINDOW;

    return RegisterClassExW(&wcex);
}

BOOL CALLBACK EnumChildProc(_In_ HWND hWnd, _In_ LPARAM lParam)
{
    HFONT hfDefault = *(HFONT *)lParam;
    SendMessageW(hWnd, WM_SETFONT, (WPARAM) hfDefault, 0);
    return TRUE;
}

INT APIENTRY wWinMain(_In_ HINSTANCE hInstance, _In_opt_ HINSTANCE hPrevInstance, _In_ LPWSTR lpCmdLine, _In_ INT nShowCmd)
{
    HWND hWnd;
    MSG Msg;
    NONCLIENTMETRICSW ncm;
    HFONT hfDefault;

    ZeroMemory(&ncm, sizeof(NONCLIENTMETRICSW));
    ncm.cbSize = sizeof(NONCLIENTMETRICSW);
    SystemParametersInfoW(SPI_GETNONCLIENTMETRICS, sizeof(NONCLIENTMETRICSW), &ncm, FALSE);
    hfDefault = CreateFontIndirectW(&ncm.lfMessageFont);

    if (!RegisterWCEX(hInstance))
    {
        MessageBoxW(0, L"Window registration failed!", L"Error", MB_ICONSTOP);
        return -1;
    }

    hWnd = CreateWindowExW(WS_EX_OVERLAPPEDWINDOW, g_szClassName, L"Minimize Me", WS_VISIBLE | WS_SYSMENU | WS_MINIMIZEBOX, 100, 100, 400, 250, NULL, NULL, GetModuleHandleW(NULL), NULL);
    ShowWindow(hWnd, SW_SHOW);
    EnumChildWindows(hWnd, EnumChildProc, (LPARAM) &hfDefault);
    UpdateWindow(hWnd);

    while (GetMessageW(&Msg, NULL, 0, 0) > 0)
    {
        TranslateMessage(&Msg);
        DispatchMessageW(&Msg);
    }
    return (INT) Msg.wParam;
}

VOID WINAPI OnClose(_In_ HWND hWnd)
{
    DestroyWindow(hWnd);
}

BOOL WINAPI OnCreate(_In_ HWND hWnd, _In_ LPCREATESTRUCTW lpCS)
{
    HINSTANCE hInstance = lpCS->hInstance;
    HWND hStatic;
    INITCOMMONCONTROLSEX iccx;

    iccx.dwICC = ICC_STANDARD_CLASSES;
    iccx.dwSize = sizeof(INITCOMMONCONTROLSEX);
    InitCommonControlsEx(&iccx);

    hStatic = CreateWindowW(L"Static", L"", WS_VISIBLE | WS_CHILD, 10, 10, 180, 20, hWnd, NULL, hInstance, NULL);

    return TRUE;
}

VOID WINAPI OnDestroy(_In_ HWND hWnd)
{
    PostQuitMessage(ERROR_SUCCESS);
}

VOID WINAPI OnWindowPosChanged(_In_ HWND hWnd, _In_ CONST LPWINDOWPOS lpWP)
{
    if (lpWP->x < 0 || lpWP->y < 0)
    {
        WCHAR stTxt[64];
        HWND hStatic = FindWindowExW(hWnd, NULL, L"Static", NULL);
        StringCchPrintfW(stTxt, 64, L"(%d, %d)", lpWP->x, lpWP->y);
        SetWindowTextW(hStatic, stTxt);
    }
}

LRESULT CALLBACK WindowProc(_In_ HWND hWnd, _In_ UINT Msg, _In_ WPARAM wParam, _In_ LPARAM lParam)
{
    switch (Msg)
    {
        HANDLE_MSG(hWnd, WM_CLOSE, OnClose);
        HANDLE_MSG(hWnd, WM_CREATE, OnCreate);
        HANDLE_MSG(hWnd, WM_DESTROY, OnDestroy);
        HANDLE_MSG(hWnd, WM_WINDOWPOSCHANGED, OnWindowPosChanged);
    default:
        return DefWindowProcW(hWnd, Msg, wParam, lParam);
    }
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

运行时,如果最小化然后重新最大化,它会显示(-32000,-32000),表明这是窗口最小化时移动到的位置。