我正试图在桌面上的图标上方或下方放置一个窗口。我主要只是想让它一直附着在桌面上。类似于Rainmeter或Wallpaper引擎。到目前为止,我所尝试的一切要么禁用交互,要么在使用"显示桌面"按钮时最小化。关于如何实现这一点,有什么想法吗?我正在使用电子和节点中的本地模块来做这件事。
这是一个老话题,但我会在最近找到如何做并回答它。
方法是找到桌面窗口的父窗口
SHELLDLL_DefView
的句柄,然后使SHELLDLL_DefView
句柄成为我的窗口的父对象,将其固定到桌面
方法是找到桌面窗口的所有者SHELLDLL_DefView
的句柄,然后使SHELLDLL_DefView
句柄成为我的窗口的所有者,将其固定到桌面上。
SHELLDLL_DefView
位于Progma
或WorkerW
句柄之下。这是一个代码,用于防止ShowDesktop在ffi-napi
创建的Electget包中用于将Electron
浏览器窗口附加到桌面。
const GWLP_HWNDPARENT = -8;
// find SHELLDLL_DefView in Progma
const progman = user32.FindWindowExA(ref.NULL, ref.NULL, 'Progman', ref.NULL);
let defView = user32.FindWindowExA(progman, ref.NULL, 'SHELLDLL_DefView', ref.NULL );
// find SHELLDLL_DefView in WorkerW
if (!defView) {
const desktopHWnd = user32.GetDesktopWindow();
let workerW = 0;
do {
workerW = user32.FindWindowExA(desktopHWnd, workerW, 'WorkerW', ref.NULL);
defView = user32.FindWindowExA(workerW, ref.NULL, 'SHELLDLL_DefView', ref.NULL );
} while (!defView && workerW);
}
if (!defView) return false;
// make the SHELLDLL_DefView handle the parent of my window
user32.SetWindowLongPtrA(hWnd, GWLP_HWNDPARENT, defView);
这允许您创建一个窗口,您可以在其中单击和交互,而不会被ShowDesktop隐藏。
2022-03-29
有一个错误的单词,所以我纠正了它。根据doc的说法,它不是父窗口,而是所有者窗口。在文档中,奇怪的是GWLP_HWNDPARENT
常量与父窗口相关。但是,当使用Spy++
进行测试时,相应的常量会更改所有者窗口。