设置窗口在windows7上始终保持在桌面上

我试图把我的窗口设置为桌面的孩子,我这样做是这样的:

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的时候,我做了上面的代码不显示相同的窗口,在间谍+我可以看到我的窗口是SysListView32的子窗口,但它不显示(它具有WM_VISIBLE风格)?

我错过了什么? 还是从winXP改为win7? 我怎么能做到这一点在win7上工作?

更新:这与航空主题有关,因为如果我将桌面主题更改为基本,则显示窗口,但是如果我切换回航空主题之一,则会再次隐藏。

谢谢

我试过你的代码,它与我的测试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; } 

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

让下面的代码片断用java编写

尝试{NativeCall.init(); IntCall ic =新的IntCall(“user32.dll”,“FindWindowA”); parent = ic.executeCall(new Object [] {“ProgMan”,“Program Manager”}); 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(); 

}