将窗口设置为始终在Windows 7上的桌面上

时间:2010-05-17 23:18:36

标签: c++ windows mfc winapi windows-7

我正试图将我的窗口设置为桌面的一个孩子,我这样做:

HWND ProgmanHwnd = 
                ::FindWindowEx(
                    ::FindWindowEx(
                        ::FindWindow(L"Progman", L"Program Manager"), 
                        NULL, 
                        L"SHELLDLL_DefView", 
                        L""), 
                    NULL, 
                    L"SysListView32", 
                    L"FolderView");
SetParent(m_hWnd, ProgmanHwnd);

这在windowsXP中工作正常,我的窗口在所有窗口下面,当我按下“显示桌面”选项时,窗口显示,所有其他“正常”窗口都隐藏。

但是在Win7中,当我执行上面的代码时,不会显示相同的窗口,在spy ++中,我可以看到我的窗口是SysListView32的子窗口,但它没有显示(并且它具有WM_VISIBLE样式)?

我缺少什么?或者从winXP变为win7的是什么?我怎样才能在win7上工作?

更新: 它与aero主题有关,因为如果我将桌面主题更改为基本主题,则会显示窗口,但如果我切换回其中一个aero主题,则会再次隐藏。

由于

2 个答案:

答案 0 :(得分:1)

我尝试了你的代码,它可以正常使用我的测试MFC应用程序。除了在 SetParent 之前需要双重冒号。你把你引用的代码放在哪里了?我已将我的功能放在 OnCreate 功能中。工作没有问题。

int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
    if (CFrameWnd::OnCreate(lpCreateStruct) == -1)
        return -1;

    // create a view to occupy the client area of the frame
    if (!m_wndView.Create(NULL, NULL, AFX_WS_DEFAULT_VIEW,
        CRect(0, 0, 0, 0), this, AFX_IDW_PANE_FIRST, NULL))
    {
        TRACE0("Failed to create view window\n");
        return -1;
    }

    HWND ProgmanHwnd = 
        ::FindWindowEx(
            ::FindWindowEx(
                ::FindWindow(L"Progman", L"Program Manager"), 
                NULL, 
                L"SHELLDLL_DefView", 
                L""), 
            NULL, 
            L"SysListView32", 
            L"FolderView");
    ::SetParent(m_hWnd, ProgmanHwnd);

    return 0;
}

答案 1 :(得分:0)

桌面窗口是ProgMan-> SHELLDLL_DefView-> SysListView32的一部分 而不是直接在winxp中的程序。

让以下代码片段用java编写

尝试{             NativeCall.init();             IntCall ic = new IntCall(“user32.dll”,“FindWindowA”);             parent = ic.executeCall(new Object [] {                      “ProgMan”,“项目经理”});             ic.destroy();

    } catch (Exception e) {
        e.printStackTrace();
    }
    System.out.println(" parent :"+parent);




    try {
        NativeCall.init();
        IntCall ic = new IntCall("user32.dll", "FindWindowExW");
        child1 = ic.executeCall(new Object[]{
                parent, 0,"SHELLDLL_DefView", null});
        ic.destroy();

    } catch (Exception e) {
        e.printStackTrace();

    }

    System.out.println(" child1 :"+child1);


    try {
        NativeCall.init();
        IntCall ic = new IntCall("user32.dll", "FindWindowExW");
        child1 = ic.executeCall(new Object[]{
                child1, 0,"SysListView32", null});
        ic.destroy();

    } catch (Exception e) {
        e.printStackTrace();

    }

    System.out.println(" child2 :"+child1);

System.out.println(“parent:”+ parent);

    try {
        NativeCall.init();
        IntCall ic = new IntCall("user32.dll", "FindWindowA");
         tmp = ic.executeCall(new Object[]{
                  "notepad", "hi.txt - Notepad"});
        ic.destroy();

    } catch (Exception e) {
        e.printStackTrace();

}