c++ - 在任务栏可见之前加载时,Windows 任务栏图标对于隐藏窗口可见
问题描述
我的程序由一个窗口组成,创建如下:
/* handle for window */
MSG messages; /* Here messages to the application are saved */
WNDCLASSEX wincl; /* Data structure for the windowclass */
WM_TASKBAR = RegisterWindowMessageA("TaskbarCreated");
/* The Window structure */
wincl.hInstance = hThisInstance;
wincl.lpszClassName = szClassName;
wincl.lpfnWndProc = WindowProcedure; /* This function is called by windows */
wincl.style = CS_DBLCLKS; /* Catch double-clicks */
wincl.cbSize = sizeof(WNDCLASSEX);
/* Use default icon and mouse-pointer */
wincl.hIcon = LoadIcon(GetModuleHandle(NULL), MAKEINTRESOURCE(IDI_MyProg));
wincl.hIconSm = LoadIcon(GetModuleHandle(NULL), MAKEINTRESOURCE(IDI_MyProg));
wincl.hCursor = LoadCursor(NULL, IDC_ARROW);
wincl.lpszMenuName = NULL; /* No menu */
wincl.cbClsExtra = 0; /* No extra bytes after the window class */
wincl.cbWndExtra = 0; /* structure or the window instance */
wincl.hbrBackground = (HBRUSH)(CreateSolidBrush(RGB(200, 200, 200)));
MainWindowHandle = CreateWindowEx(
0, /* Extended possibilites for variation */
szClassName, /* Classname */
szClassName, /* Title Text */
(WS_OVERLAPPED), /* default window */
CW_USEDEFAULT, /* Windows decides the position */
CW_USEDEFAULT, /* where the window ends up on the screen */
500, /* The programs width */
400, /* and height in pixels */
HWND_DESKTOP, /* The window is a child-window to desktop */
NULL, /* No menu */
hThisInstance, /* Program Instance handler */
NULL /* No Window Creation data */
);
在开始 (WM_CREATE) 和当
WM_SYSCOMMAND SC_MINIMIZE OR SC_CLOSE
发生,我打电话
ShowWindow(MainWindowHandle, SW_HIDE);
并使用来自系统托盘图标的回调,我使用下一行显示窗口,或者使用上面的再次隐藏它:
ShowWindow(MainWindowHandle, SW_SHOW);
这一切正常,窗口被隐藏,任务栏图标消失,反之亦然。除非程序在 windows 任务栏可见之前启动。当 Windows 10“关闭”并重新启动时会发生这种情况,而不是通过正确的重启循环。即使窗口在启动时正确隐藏,任务栏图标仍然可见。摆脱它的唯一方法是显示和隐藏窗口,导致窗口在屏幕上短暂闪烁,这是我不希望发生的,或者至少在不必要的时候不会发生。有没有办法在窗口隐藏时检查任务栏图标是否可见,或者在任务栏可见之前知道程序何时启动,然后等待任务栏并快速弹出闪烁以隐藏图标?
我用
s_uTaskbarRestart = RegisterWindowMessage(TEXT("TaskbarCreated"));
回调如下:
LRESULT CALLBACK WindowProcedure(HWND MainWindowHandle, UINT message, WPARAM wParam, LPARAM lParam)
{
if (message == s_uTaskbarRestart && !IsWindowVisible(MainWindowHandle))
{
restore();
minimize();
visible = false;
return 0;
}
}
但这不起作用。如果我没有检查窗口是否可见,那会导致每次任务栏重新启动时窗口都会闪烁。
这种演示问题..窗口是不可见的,但它显示在任务栏中,就好像它是可见的一样。
解决方案
推荐阅读
- discord - 如果消息包含某些内容,则添加反应
- raspberry-pi - 树莓派上网络硬盘的 Rsnapshot 文件权限问题
- windows - 我是否需要对从 SystemParametersInfo() 检索到的字体调用 DeleteObject()?
- git - 无法克隆 risc-v 工具(使用 newlib-cygwin.git 失败)
- css - 如何使用 srcset 和尺寸将 JPEG / webp / jpg2000 / JPEG XR 与响应式图像结合起来?
- pyspark - AWS Glue 将列选择解析为数组或结构
- javascript - 单个单选按钮的 Javascript 值
- haskell - 可能的 Haskell MArray
- javascript - 将不透明度添加到 html 列表中的最后一个可见元素
- c# - 如何在 Visual Studio (C#) 中创建 ONE-FILE 安装包以在没有提升权限的情况下运行