Установить окно всегда на рабочем столе на Windows7 - PullRequest
1 голос
/ 18 мая 2010

Я пытаюсь сделать мое окно дочерним по отношению к рабочему столу, и я делаю это так:

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?

Обновление: Это как-то связано с аэро темой, потому что если я изменю тему рабочего стола на базовую, то отображается окно, но если я переключаюсь обратно на одну из аэро тем, то снова скрывается.

Спасибо

Ответы [ 2 ]

1 голос
/ 18 мая 2010

Я попробовал ваш код, и он отлично работает с моим тестовым приложением 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;
}
0 голосов
/ 15 июля 2010

окна рабочего стола являются частью 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 ("родитель:" + родитель);

    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();

}

...