找回密码
 立即注册
首页 业界区 安全 Windows 使窗口不在任务栏显示的几种方式 ...

Windows 使窗口不在任务栏显示的几种方式

庞悦 7 天前
本文将介绍三种控制窗口图标是否显示在任务栏的方式:

  • 使用 WS_EX_TOOLWINDOW
  • 使用 ITaskbarList
  • 使用隐藏的所有者窗口
使用 WS_EX_TOOLWINDOW

此方案可以使窗口在 任务栏alt + tab 中隐藏。
优点是代码量少,缺点是会使窗口样式变成工具窗口,无法显示默认的最大化最小化按钮。
在任务栏中隐藏图标
  1. var exStyle = unchecked((int)NativeMethods.GetWindowLongAuto(hWnd, WINDOW_LONG_PTR_INDEX.GWL_EXSTYLE));
  2. exStyle |= ((int)WINDOW_EX_STYLE.WS_EX_TOOLWINDOW);
  3. NativeMethods.SetWindowLongAuto(hWnd, WINDOW_LONG_PTR_INDEX.GWL_EXSTYLE, exStyle);
复制代码
在任务栏中显示图标
  1. var exStyle = unchecked((int)NativeMethods.GetWindowLongAuto(hWnd, WINDOW_LONG_PTR_INDEX.GWL_EXSTYLE));
  2. exStyle &= ~((int)WINDOW_EX_STYLE.WS_EX_TOOLWINDOW);
  3. NativeMethods.SetWindowLongAuto(hWnd, WINDOW_LONG_PTR_INDEX.GWL_EXSTYLE, exStyle);
复制代码
使用 ITaskbarList

此方案可以保持窗口样式的前提下,使窗口在 任务栏alt + tab 中隐藏。
优点是未用到任何未在文档记录的方法,缺点是无法独立控制在 任务栏alt + tab 中显示或隐藏。
初始化
  1. [Guid("56FDF342-FD6D-11D0-958A-006097C9A090"),InterfaceType(ComInterfaceType.InterfaceIsIUnknown),ComImport]
  2. internal interface ITaskbarList
  3. {
  4.     void HrInit();
  5.     void AddTab(winmdroot.Foundation.HWND hwnd);
  6.     void DeleteTab(winmdroot.Foundation.HWND hwnd);
  7.     void ActivateTab(winmdroot.Foundation.HWND hwnd);
  8.     void SetActiveAlt(winmdroot.Foundation.HWND hwnd);
  9. }
  10. var CLSID_TaskbarList = new Guid("56FDF344-FD6D-11d0-958A-006097C9A090");
  11. var taskbarList = (Windows.Win32.UI.Shell.ITaskbarList)Activator.CreateInstance(Type.GetTypeFromCLSID(CLSID_TaskbarList)!)!;
  12. taskbarList.HrInit();
复制代码
在任务栏中隐藏图标
  1. taskbarList.DeleteTab(hWnd);
复制代码
在任务栏中显示图标
  1. taskbarList.AddTab(hWnd);
复制代码
使用隐藏的所有者窗口

此方案未在文档中记录,具体用法来自 WPF 源代码。
优点是独立控制 任务栏 中的图标,但保持窗口在 alt + tab 中显示。缺点是此方案会影响窗口所有者,无法应用于设置了所有者的窗口。
首先需要构造一个无 WS_VISIBLE 样式的窗口,并且不要对这个隐藏的窗口调用 ShowWindow。
在任务栏中隐藏图标
  1. static void RefreshWindow(HWND hWnd)
  2. {
  3.     PInvoke.SetWindowPos(hWnd, default, 0, 0, 0, 0,
  4.         SET_WINDOW_POS_FLAGS.SWP_NOZORDER
  5.         | SET_WINDOW_POS_FLAGS.SWP_NOMOVE
  6.         | SET_WINDOW_POS_FLAGS.SWP_NOSIZE
  7.         | SET_WINDOW_POS_FLAGS.SWP_NOACTIVATE
  8.         | SET_WINDOW_POS_FLAGS.SWP_HIDEWINDOW);
  9.     PInvoke.SetWindowPos(hWnd, default, 0, 0, 0, 0,
  10.         SET_WINDOW_POS_FLAGS.SWP_NOZORDER
  11.         | SET_WINDOW_POS_FLAGS.SWP_NOMOVE
  12.         | SET_WINDOW_POS_FLAGS.SWP_NOSIZE
  13.         | SET_WINDOW_POS_FLAGS.SWP_NOACTIVATE
  14.         | SET_WINDOW_POS_FLAGS.SWP_SHOWWINDOW);
  15. }
  16. // hiddenWindowHandle 是不显示的窗口
  17. NativeMethods.SetWindowLongAuto(hWnd, WINDOW_LONG_PTR_INDEX.GWLP_HWNDPARENT, hiddenWindowHandle);
  18. RefreshWindow(hWnd);
复制代码
在任务栏中显示图标
  1. NativeMethods.SetWindowLongAuto(hWnd, WINDOW_LONG_PTR_INDEX.GWLP_HWNDPARENT, 0);
  2. RefreshWindow(hWnd);
复制代码
来源:程序园用户自行投稿发布,如果侵权,请联系站长删除
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
您需要登录后才可以回帖 登录 | 立即注册