首页 > 解决方案 > 在任务栏可见之前加载时,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;
}

}

但这不起作用。如果我没有检查窗口是否可见,那会导致每次任务栏重新启动时窗口都会闪烁。

这种演示问题..窗口是不可见的,但它显示在任务栏中,就好像它是可见的一样。

标签: c++windowstaskbartrayicon

解决方案


推荐阅读