在 Windows 11 上将窗口保持在任务栏顶部

问题描述 投票:0回答:1

我发现在Windows 11上,即使我创建了带有

WS_EX_TOPMOST
样式的窗口,如果您单击任务栏上的任意位置,窗口仍然会被任务栏覆盖。 唯一的例外是任务管理器。它是如何实现的?

我想要一个在任务栏上绘制内容的功能,或者至少使用透明窗口模仿该行为。我认为过去有两种方法可以实现这一目标:

  1. 获取任务栏的DC并绘制(Windows11不再适用)
  2. 创建一个透明窗口并将其保持在任务栏顶部(如何将其保持在最上面的问题)

我现在有点陷入困境。如有任何帮助,我们将不胜感激。

更新: 我刚刚注意到任务栏窗口(在

Spy++
中显示为 DesktopWindowXamlSource)没有设置
WS_EX_TOPMOST
样式。我想可以通过某些方式来掩盖它吗?

#ifndef UNICODE
#define UNICODE
#endif 

#include <windows.h>
#include <iostream>

LRESULT CALLBACK WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam);

int WINAPI wWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, PWSTR pCmdLine, int nCmdShow)
{
    // Register the window class.
    const wchar_t CLASS_NAME[] = L"Sample Window Class";

    WNDCLASS wc = { };

    wc.lpfnWndProc = WindowProc;
    wc.hInstance = hInstance;
    wc.lpszClassName = CLASS_NAME;

    RegisterClass(&wc);

    // Create the window.

    HWND hwnd = CreateWindowEx(
        WS_EX_TOPMOST,                  // Optional window styles.
        CLASS_NAME,                     // Window class
        L"Learn to Program Windows",    // Window text
        WS_OVERLAPPEDWINDOW,            // Window style
        // Size and position
        CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT,
        NULL,       // Parent window    
        NULL,       // Menu
        hInstance,  // Instance handle
        NULL        // Additional application data
    );

    if (hwnd == NULL)
    {
        return 0;
    }
    ShowWindow(hwnd, nCmdShow);
    // Run the message loop.

    MSG msg = { };
    while (GetMessage(&msg, NULL, 0, 0) > 0)
    {
        TranslateMessage(&msg);
        DispatchMessage(&msg);
    }
}

LRESULT CALLBACK WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
    switch (uMsg)
    {
        case WM_DESTROY:
            PostQuitMessage(0);
            return 0;

        case WM_PAINT:
        {
            PAINTSTRUCT ps;
            HDC hdc = BeginPaint(hwnd, &ps);
            // All painting occurs here, between BeginPaint and EndPaint.
            FillRect(hdc, &ps.rcPaint, (HBRUSH)(COLOR_WINDOW + 1));
            EndPaint(hwnd, &ps);
        }
        return 0;

    }
    return DefWindowProc(hwnd, uMsg, wParam, lParam);
}

这就是当我单击开始时窗口被任务栏覆盖的方式。

winapi
1个回答
-1
投票

给你

使用

Sleep(1)
创建循环以节省一些 CPU 内存,然后调用
BringWindowToTop(hWnd)

© www.soinside.com 2019 - 2024. All rights reserved.