C++将窗口设置在桌面图标的下方(或上方)



我正试图在桌面上的图标上方或下方放置一个窗口。我主要只是想让它一直附着在桌面上。类似于Rainmeter或Wallpaper引擎。到目前为止,我所尝试的一切要么禁用交互,要么在使用"显示桌面"按钮时最小化。关于如何实现这一点,有什么想法吗?我正在使用电子和节点中的本地模块来做这件事。

这是一个老话题,但我会在最近找到如何做并回答它。

方法是找到桌面窗口的父窗口SHELLDLL_DefView的句柄,然后使SHELLDLL_DefView句柄成为我的窗口的父对象,将其固定到桌面

方法是找到桌面窗口的所有者SHELLDLL_DefView的句柄,然后使SHELLDLL_DefView句柄成为我的窗口的所有者,将其固定到桌面上。

SHELLDLL_DefView位于ProgmaWorkerW句柄之下。这是一个代码,用于防止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++进行测试时,相应的常量会更改所有者窗口。

相关内容

  • 没有找到相关文章

最新更新