省流版:如何让自己的 windows 程序窗口 在用户按下 WIn+D 的时候也显示在桌面上呢
费流版:
小弟最近正在开发一个 windows 环境下的桌面小组件程序(因为刚学 rust ,所以用 rust 撸的), 但是现在遇到个问题就是微软似乎并没有在新版 winodws 中提供小组件相关 api ,只能用一个窗口来模拟; 我理解的小组件窗口应有的行为:
特性一二三 相对简单,设置窗口的额外属性成 WS_EX_TOOLWINDOW 、WS_EX_LAYERED 之类的来解决; 但是第四个特性把小弟难住了,研究了一个多月也没找到方法;特来 V2 上寻求各位大佬的帮助 555
![]() |
1
shuax 1 天前
你把父窗口设置成桌面试试
|
2
samwellwang0 1 天前
刚试了下,win+D 连 window 自己的 便笺也无法保留在桌面上呢
|
![]() |
4
kxg3030 1 天前
你把 win+D 消息拦住不响应不行么
|
5
tars13344 OP @kxg3030 #4 Win+D 时候会给程序下发什么事件么
![]() 只知道这个快捷键和最小化不同,是收不到 WM_SIZE 消息的; 也尝试过使用底层 Hook 去监听键盘,但是发现系统执行“显示桌面”动作比我程序 HOOK 的动作还要晚,没法实现系统显示完桌面我再去把窗口调出来 |
![]() |
6
theArrowOfCupid 1 天前
snipaste 的贴图能够在 win+m/win+d 的时候保留在桌面上
|
![]() |
7
theArrowOfCupid 1 天前 ![]() bilibili 的弹幕姬里面有个全屏弹幕,应该也能保留,你可以试试,这里是代码: https://github.com/copyliu/bililive_dm/
|
![]() |
8
xtreme1 1 天前 ![]() void CALLBACK WinEventProc(HWINEVENTHOOK hook, DWORD event, ...) {
if (event == EVENT_SYSTEM_MINIMIZEEND) { ::SetWindowPos(g_hMain, HWND_NOTOPMOST, 0, 0, 0, 0, ZPOS_FLAGS); ::SetWindowPos(g_hMain, HWND_BOTTOM, 0, 0, 0, 0, ZPOS_FLAGS); } if (event == EVENT_SYSTEM_MINIMIZESTART) { ::SetWindowPos(g_hMain, HWND_TOPMOST, 0, 0, 0, 0, ZPOS_FLAGS); } } SetWinEventHook(EVENT_SYSTEM_MINIMIZESTART, EVENT_SYSTEM_MINIMIZEEND, nullptr, WinEventProc, ...) |
9
tars13344 OP @theArrowOfCupid #7 👌🏻👌🏻 感谢 周末时候研究了一下雨滴桌面的源码 但是这项目太复杂太大了,配合 AI 也找不到实现这个特性的几行代码在哪
![]() @xtreme1 #8 感谢大佬! 只试过监听 WM_SIZE ,这几个还真没试过 晚上回家试下~ ![]() |