我刚刚开始学习C ++,我试图改变正在运行的流程的外观,例如"计算器"总是在底部/桌面上,但没有成功。
这是我到目前为止的代码:
#include "stdafx.h"
#include <windows.h>
#include <stdio.h>
#include <string>
#include <iostream>
using namespace std;
void set_to_bg() {
LPCSTR app_name = "Calculator";
HWND hWnd = FindWindowA(0, (app_name));
HWND ProgmanHwnd = FindWindow(_T("Progman"), _T("Program Manager"));
SetParent(hWnd, ProgmanHwnd);
SetWindowPos(hWnd, HWND_BOTTOM, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE | SWP_NOACTIVATE);
}
int main()
{
set_to_bg();
return 0;
}
&#34;计算器&#34;会发生什么?窗口消失了。
我使用Spy ++来监控窗口,我注意到&#34;计算器&#34;是项目经理和#34;的成员。但它并没有显示出来。
如果我省略"SetParent(hWnd, ProgmanHwnd);"
&#34;计算器&#34;显示并设置为底部。
当我打开一个文件夹或其他应用程序时,它们重叠了&#34;计算器&#34;这是一个很好的结果,但如果我点击&#34;计算器&#34;然后它失去了它的“OnBottom&#34;属性并重叠打开的所有其他文件夹或应用程序。
任何想法,代码片段,指导都将非常感谢!
答案 0 :(得分:1)
包含桌面图标列表视图的SHELLDLL_DefView是Progman窗口的子项,覆盖整个桌面,如果你想“卡在”桌面上,你需要成为listview的孩子,但这是一个黑客和依赖内部壳细节。
HWND_BOTTOM
不是属性,只是告诉SetWindowPos
将窗口放在z顺序的底部,但它不会卡在那里,它仍然是一个普通的窗口。窗口管理器中有一个内部“最底层”属性,但您无法在自己的应用程序中使用它,只有shell桌面图标窗口可以使用此内部样式。
您可以查看Rainlendar和其他开源小工具应用,看看他们是如何做到的,但没有完美的解决方案。您必须考虑“what if two applications did this”方案。