我正试图将我的窗口设置为桌面的一个孩子,我这样做:
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主题,则会再次隐藏。
由于
答案 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();
}