4

屏蔽Windows任务栏

 2 years ago
source link: https://discretetom.github.io/posts/hide-windows-taskbar/
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

屏蔽Windows任务栏

基于QT的热键、隐藏任务栏

写了个基于QT的简单程序👉TaskBarKiller👈

默认任务栏为自动隐藏状态,即鼠标贴近屏幕边缘可以显示任务栏。

目标是实现在运行非全屏应用时鼠标贴近屏幕边缘不会呼出任务栏,以减少错误操作

搜索得到以下信息

  1. 任务栏也是窗口,可以获取句柄
  2. 获取句柄的情况下可以使用Windows的SetWindowsPos函数实现窗口的置顶与取消置顶等位置操作
  3. 获取句柄的情况下可以使用Windows的ShowWindow函数实现控制窗口的隐藏与显示

于是得到以下方案

  1. 任务栏始终置底,只有在桌面鼠标贴近屏幕边缘才可以呼出任务栏(信息1+信息2)
  2. 设置热键,使用热键切换任务栏的隐藏与显示(信息1+信息3)

方案1看起来是个优秀的方案,因为只需要设置一次即可满足任何时间的使用需要,而方案2每次调出任务栏需要按下热键。但是根据测试,使用SetWindowPos函数似乎并不对任务栏产生效果。在找到更好的方案之前,暂时选择使用方案2(测试得到方案2的另一个缺点是隐藏任务栏时无法使用Win+数字快捷键切换或启动应用,使用Alt+Tab切换应用吧)

细化方案2,需要写一个程序,满足:

  1. 可以注册全局热键
  2. 可以隐藏到系统托盘区域
  3. 支持开机自启动

全局热键使用第三方库QHotkey实现

MainWindow添加头文件

#include <qhotkey.h>

添加私有成员

QHotkey * hotkey;
bool taskBarIsHidden;

构造函数初始化,这里的快捷键选择了和网上相似软件一样的Ctrl+~

hotkey = new QHotkey(QKeySequence("Ctrl+`"), true, this);//设置快捷键、默认启动
connect(hotkey, &QHotkey::activated, this, &MainWindow::getHotKeyPressed);//连接快捷键能够触发的功能
taskBarIsHidden = false;//默认任务栏是显示的

添加接收信号的槽函数

void MainWindow::getHotKeyPressed()
{
	HWND hwnd=::FindWindow(L"Shell_TrayWnd",NULL);//查找任务栏句柄
	taskBarIsHidden = !taskBarIsHidden;//切换状态
	if (taskBarIsHidden){
		ShowWindow(hwnd, 0);//hide
	} else {
		ShowWindow(hwnd, 1);//show
	}
}

为了防止意外情况程序关闭导致任务栏一去不复返,在MainWindow的析构函数中添加显示任务栏的代码,在一定程度上补救一下

MainWindow::~MainWindow()
{
	HWND hwnd=::FindWindow(L"Shell_TrayWnd",NULL);
	ShowWindow(hwnd, 1);//show
	delete ui;
}

至此实现主要功能

接下来添加开机自启动功能和最小化托盘功能,之前的博客已经讲过


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK