1

TaskbarKiller-v2

 2 years ago
source link: https://discretetom.github.io/posts/taskbar-killer-v2/
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

why v2?

第一代TaskbarKiller使用了Qt库而显得有点臃肿。作为一个后台运行的程序,TaskbarKiller完全不需要图形界面。所以计划使用原生无图形界面的C重构出来一个更简洁的TaskbarKiller

实现windows热键

使用RegisterHotkey函数实现热键的注册。TaskbarKiller v2不打算使用一代的热键ctrl+~(因为这是vscode呼出终端的键),所以改为win+~

参数原型为BOOL RegisterHotKey(HWND hWnd, int id, UINT fsModifiers, UINT vk);

  • hWnd为处理热键事件的句柄。因为是TaskbarKiller自己处理热键事件,所以置NULL
  • id为热键在处理热键句柄中的ID。因为TaskbarKiller仅处理这一个热键,所以随便设置一个数即可
  • fsModifiers为装饰键,此处为MOD_WIN表示按下win键
  • vk表示非装饰键,此处为VK_OEM_3表示~

如果函数返回0则注册失败,否则注册成功

可以使用函数UnregisterHotKey(hWnd, id)来取消注册热键。程序关闭时也会自动注销热键

实现后台运行

编写windows服务程序实现后台运行

此方案已失败。不过留下了一些注意事项:

  • 使用SC命令注册服务需要管理员身份
  • SC命令的路径参数必须是绝对路径
  • 应用需要先设置为START_PENDDING状态然后再设置RUNNING状态

使用服务程序注册热键的时候出现错误代码1459,查阅文档得到如下结果

ERROR_REQUIRES_INTERACTIVE_WINDOWSTATION

1459 (0x5B3)

This operation requires an interactive window station.

所以使用windows后台服务程序实现热键是不可能了

使用MSVC linker参数隐藏控制台窗口

实现此方案需要使用MSVC的如下linker参数:

  • subsystem:"windows" - 表示程序不需要控制台窗口
  • entry:"mainCRTStartup" - 指明程序入口函数为mainwmain

因为使用subsystem:"windows"参数取消控制台窗口之后默认入口函数为WinMainwWinMain所以需要参数entry:"mainCRTStartup"重新指定入口函数

因为使用此方案需要MSVC的linker所以不能使用GCC,使用Visual Studio实现

使用注册表实现开机自启动

v2不打算把开机自启动写到程序里面以便删除不必要的交互

仍然使用注册表方案添加开机启动项,参考之前的博文,在注册表的HKEY_CURRENT_USER\SOFTWARE\Microsoft\Windows\CurrentVersion\Run目录下添加TaskbarKiller-v2项即可

为了获得TaskbarKiller-v2.exe的路径,使用了reg-gen.bat文件。reg-gen.bat会以其所在的目录创建TaskbarKill-v2.exe的注册表文件,所以只要reg-gen.batTaskbarKiller-v2.exe在同一个文件夹里就可以生成正确的注册表文件。双击注册表文件即可完成启动项的注册

因为是第一次使用注册表文件,所以遇到了一个小坑:注册表文件中的字符串值里面的\需要转义,即\\。所以使用reg-gen.bat生成路径的时候简单地把路径中的\替换为了\\


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK