求助一下熟悉 windows 开发的大佬们,桌面 Widget 的实现

5 天前
tars13344  tars13344

省流版:如何让自己的 windows 程序窗口 在用户按下 WIn+D 的时候也显示在桌面上呢

费流版:

小弟最近正在开发一个 windows 环境下的桌面小组件程序(因为刚学 rust ,所以用 rust 撸的), 但是现在遇到个问题就是微软似乎并没有在新版 winodws 中提供小组件相关 api ,只能用一个窗口来模拟; 我理解的小组件窗口应有的行为:

  1. 主窗口背景透明
  2. 无任务栏图标
  3. 无法通过 Alt-tab 获得焦点
  4. 始终展示在桌面上,用户使用 win+M, win+D 快捷键之后仍会展示在桌面上

特性一二三 相对简单,设置窗口的额外属性成 WS_EX_TOOLWINDOW 、WS_EX_LAYERED 之类的来解决; 但是第四个特性把小弟难住了,研究了一个多月也没找到方法;特来 V2 上寻求各位大佬的帮助 555

1239 次点击
所在节点   Windows  Windows
10 条回复
shuax
shuax
5 天前
你把父窗口设置成桌面试试
samwellwang0
samwellwang0
5 天前
刚试了下,win+D 连 window 自己的 便笺也无法保留在桌面上呢
tars13344
tars13344
5 天前
@shuax #1 用 AI 给的方法试过 把窗口的父窗口设置成 WorkerW ,不好使
kxg3030
kxg3030
5 天前
你把 win+D 消息拦住不响应不行么
tars13344
tars13344
5 天前
@kxg3030 #4 Win+D 时候会给程序下发什么事件么 没有查到
只知道这个快捷键和最小化不同,是收不到 WM_SIZE 消息的;
也尝试过使用底层 Hook 去监听键盘,但是发现系统执行“显示桌面”动作比我程序 HOOK 的动作还要晚,没法实现系统显示完桌面我再去把窗口调出来
theArrowOfCupid
5 天前
snipaste 的贴图能够在 win+m/win+d 的时候保留在桌面上
theArrowOfCupid
5 天前
bilibili 的弹幕姬里面有个全屏弹幕,应该也能保留,你可以试试,这里是代码: https://github.com/copyliu/bililive_dm/
xtreme1
5 天前
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, ...)
tars13344
5 天前
@theArrowOfCupid #7 👌🏻👌🏻 感谢 周末时候研究了一下雨滴桌面的源码 但是这项目太复杂太大了,配合 AI 也找不到实现这个特性的几行代码在哪 回家研究下这个
@xtreme1 #8 感谢大佬! 只试过监听 WM_SIZE ,这几个还真没试过 晚上回家试下~
ehnap
1 天前
楼主可能是在找这个。Win D 是将所有窗口最小化,并且将桌面窗口提到栈顶,如果你想在它上边,也要针对这两个来处理。
https://devblogs.microsoft.com/oldnewthing/20040527-00/?p=39153

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/1118913

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX