在底部设置运行过程

时间:2018-04-29 14:16:16

标签: c++ winapi

我刚刚开始学习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;属性并重叠打开的所有其他文件夹或应用程序。

任何想法,代码片段,指导都将非常感谢!

1 个答案:

答案 0 :(得分:1)

包含桌面图标列表视图的SHELLDLL_DefView是Progman窗口的子项,覆盖整个桌面,如果你想“卡在”桌面上,你需要成为listview的孩子,但这是一个黑客和依赖内部壳细节。

HWND_BOTTOM不是属性,只是告诉SetWindowPos将窗口放在z顺序的底部,但它不会卡在那里,它仍然是一个普通的窗口。窗口管理器中有一个内部“最底层”属性,但您无法在自己的应用程序中使用它,只有shell桌面图标窗口可以使用此内部样式。

您可以查看Rainlendar和其他开源小工具应用,看看他们是如何做到的,但没有完美的解决方案。您必须考虑“what if two applications did this”方案。