【窗口置底】使用ahk脚本使任意窗口嵌入桌面

先前的帖子大家有在讨论如何使窗口置底,但最后没有比较好的讨论结果。

最近翻出了一个古老脚本,稍微改了一下,可以将某个窗口变为桌面的子窗口,即按下Win+D,该窗口不会最小化,且永远不会覆盖其他窗口,尤其适合待办事项、笔记窗口等需要强提醒的窗口。

使用方法:将以下代码保存为.ahk文件,Ctrl+D窗口置底,Ctrl+B恢复原状。

;Ctrl+d 将当前窗口设置为桌面的子窗口(置底)
^d::
WinSet:=AlwaysAtBottom(WinExist("A"))
return

;http://www.autohotkey.com/board/topic/80573-how-to-set-a-gui-to-be-always-at-bottom/
AlwaysAtBottom(Child_ID)
 {
  WinGet, Desktop_ID, ID, ahk_class  WorkerW
  Return DllCall("SetParent", "uint", Child_ID, "uint", Desktop_ID)
 }

;Ctrl+b 恢复原状
^b::
WinSet:=undoAlwaysAtBottom(WinExist("A"))
return

undoAlwaysAtBottom(Child_ID)
 {
  Return DllCall("User32\SetParent", "Ptr",Child_ID, "Ptr",0)
 }


 
GuiClose:
GuiEscape:
ExitApp
Return
  1. 有点不完美的是,置底后窗口会变为Win7样式,带有一圈边框,暂时不知如何去除。
  2. 一点设想:配合DockIt或许可以将任意窗口的任意部位钉在桌面上,或许你可以将网页中的天气、股票、视频窗以桌面小部件的方式显示,打造一个桌面版的动态磁帖。不过由于dockit是将窗口置顶的,需要进一步修改。
  3. 目前发现与酷呆桌面冲突,如果你正在使用桌面图标整理软件,可能会有bug。

@dog @deanme @Fox

4 Likes

试试这个指令:

WinSet, Style, -0xC00000, ahk_id %underarrow%

我之前也研究过怎么搞网页局部放桌面:
发现如果firefox要是有类似 Separate Window - Chrome 应用商店 (google.com)这个插件就好办了。

可惜没有,我试了十个chrome系的浏览器,他们的分离窗口全都好死不死有个边框不能通过WinSet, Style, -0xC00000, ahk_id %underarrow%去掉。

只有Firefox的分离窗口,可以通过这个指令去掉边框(但是没有Separate Window这个插件这种选择层级的功能)。

效果如下:
bianse
可以把b站跳舞网页放到桌面图标下面(播完会自动切换下一个视频)。


用这个指令就可以只显示局部窗口了:
WinSet, Region , W151 H61 0-31, A

居然有这种插件,太有用了

尝试用 AutoHotkey v2 写了一下代码~

!F1:: func_WinAlwaysBottom(WinExist("A"), 1) ; Alt + F1:启用窗口置底(嵌入桌面)
!F2:: func_WinAlwaysBottom(WinExist("A"), 0) ; Alt + F2:禁用窗口置底(嵌入桌面)
func_WinAlwaysBottom(Child_ID, DoOrUndo) {
	If DoOrUndo = 1 { ; 启用窗口置底(嵌入桌面)
		Desktop_ID := WinGetID("ahk_exe explorer.exe ahk_class WorkerW")
		Return DllCall("SetParent", "uint", Child_ID, "uint", Desktop_ID)
	} Else If DoOrUndo = 0 { ; 禁用窗口置底(嵌入桌面)
		Return DllCall("User32\SetParent", "Ptr", Child_ID, "Ptr", 0)
	}
}

:rofl:这个脚本对任务栏用的话会透明化任务栏

Windows11 22621.1555
按下 Ctrl+D 以后窗口就不见了…… 也不在桌面
但是按 Ctrl+B 能显示回来~
求解~


这个脚本的原理是将当前窗口绑定到桌面窗口,所以你可能将窗口绑定到其他程序了,例如任务栏。
右键在任务栏脚本图标点下“Window Spy”,再点下桌面,获取系统桌面窗口的标识。
确保脚本里的设定的窗口名称和这里显示的一致