gpt4 book ai didi

c++ - win32(全屏)无边框窗口重叠任务栏

转载 作者:可可西里 更新时间:2023-11-01 13:04:42 57 4
gpt4 key购买 nike

我正在尝试创建一个无边框窗口,该窗口可能在全屏模式下与任务栏重叠(不使用 ChangeDisplaySettings(&settings, CDS_FULLSCREEN);),但我不太清楚该怎么做。我已经尝试了几乎所有可能的 CreateWindowEx 样式组合,但都没有成功。

它的目的是在使用 opengl/directx 的窗口无边界应用程序中呈现,同时允许 alt-tab 退出,同时继续在后台呈现。这是由许多游戏完成的,例如 wow 和 dota2(windowed fullscreen 选项)以及 windows7 任务管理器等应用程序(在 vm 中截取了两个屏幕截图来证明这个想法)(windows8 没有没有这种行为)。

任务管理器不专注:

专注于任务管理器:

这是我使用的一些最小代码,用于轻松测试我的一些想法,但没有一个真正做到。它只创建一个尺寸为 screenwidth-20 和 screenheight-20 的无边框窗口。

#include <windows.h>

static bool quit = false;

static LRESULT CALLBACK message_handler(HWND hwnd, UINT umsg, WPARAM wparam, LPARAM lparam)
{
switch(umsg)
{
case WM_DESTROY:
PostQuitMessage(0);
break;
case WM_CLOSE:
quit = true;
break;
}

return DefWindowProc(hwnd, umsg, wparam, lparam);
}

int main()
{
WNDCLASSEX wc;
HMODULE hInstance;
HWND hwnd;
MSG msg;

ZeroMemory(&msg, sizeof(MSG));
hInstance = GetModuleHandle(NULL);

wc.style = CS_HREDRAW | CS_VREDRAW | CS_OWNDC;
wc.lpfnWndProc = message_handler;
wc.cbClsExtra = 0;
wc.cbWndExtra = 0;
wc.hInstance = hInstance;
wc.hIcon = LoadIcon(NULL, IDI_WINLOGO);
wc.hIconSm = wc.hIcon;
wc.hCursor = LoadCursor(NULL, IDC_ARROW);
wc.hbrBackground = (HBRUSH)COLOR_WINDOWFRAME;
wc.lpszMenuName = NULL;
wc.lpszClassName = "test";
wc.cbSize = (unsigned int)sizeof(WNDCLASSEX);

RegisterClassEx(&wc);

hwnd = CreateWindowEx(WS_EX_APPWINDOW, "test", "test", WS_OVERLAPPED|WS_POPUP, 10, 10, (int)GetSystemMetrics(SM_CXSCREEN)-20, (int)GetSystemMetrics(SM_CYSCREEN)-20, NULL, NULL, hInstance, NULL);
//hwnd = CreateWindowEx(WS_EX_APPWINDOW, "test", "test", WS_OVERLAPPED|WS_POPUP, 0, 0, (int)GetSystemMetrics(SM_CXSCREEN), (int)GetSystemMetrics(SM_CYSCREEN), NULL, NULL, hInstance, NULL);

ShowWindow(hwnd, SW_SHOW);
SetForegroundWindow(hwnd);
SetFocus(hwnd);

while (!quit)
{
if (PeekMessage(&msg, 0, 0, 0, PM_REMOVE))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
}

return 0;
}

使用

CreateWindowEx(WS_EX_APPWINDOW, "test", "test", WS_OVERLAPPED|WS_POPUP, 0, 0, (int)GetSystemMetrics(SM_CXSCREEN), (int)GetSystemMetrics(SM_CYSCREEN), NULL, NULL, hInstance, NULL);

确实与任务栏重叠,但是当 opengl 在其上呈现时它有一些奇怪的行为(闪烁/闪烁屏幕,例如当视频模式更改时。有人遇到了相同的效果 on this forum 某种使交叉的库用于渲染和其他内容的平台窗口。有人还在该线程中发布了 a video (careful, loud music),它显示了我正在努力实现的目标)。

我已经下载了那个开源库并试图弄清楚它在做什么,但我找不到关于它创建窗口的方式的任何特别之处。

在 Windows8 上使用 g++(由 MinGW-builds 项目构建)4.8.0 20121225(实验性)

最佳答案

陈峰 explained how to switch in and out of full screen mode而不是简单地通过使用 SetWindowLong(Ptr) 更改窗口样式, 使用 SetWindowPlacement调整窗口大小,SetWindowPos以确保重绘框架。

任务栏会检测窗口何时试图全屏并自动退出。

关于c++ - win32(全屏)无边框窗口重叠任务栏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15254078/

57 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com