[code=C++]
///查询桌面句柄 原来在xp 是
HWND hwndParent = ::FindWindow( "Progman", "Program Manager" );
HWND hwndSHELLDLL_DefView = ::FindWindowEx( hwndParent, NULL, "SHELLDLL_DefView", NULL );
HWND hwndSysListView32 = ::FindWindowEx( hwndSHELLDLL_DefView, NULL, "SysListView32", "FolderView" );
//win7 应该是
HWND dwndparent;
HWND dwndviem=NULL;
HWND dwdesktopicon;
dwndparent=FindWindowEx(0,0,L"WorkerW",L"");//获得第一个WorkerW类的窗口
while((!dwndviem)&&dwndparent)
{
        dwndviem=FindWindowEx(dwndparent,0,L"SHELLDLL_DefView",0);
        dwndparent=FindWindowEx(0,dwndparent,L"WorkerW",L"");
}
dwdesktopicon=FindWindowEx(dwndviem,0,L"SysListView32",L"FolderView");C++代码正常 可以使用  问题在C#了
[/code]
///查询桌面句柄 原来在xp 是
IntPtr vHandle1 = FindWindow("Progman", "Program Manager");//FindWindow("WorkerW", null);// 
IntPtr vHandle2 = FindWindowEx(vHandle1, IntPtr.Zero, "SHELLDLL_DefView", null);
IntPtr vHandle = FindWindowEx(vHandle2, IntPtr.Zero, "SysListView32", null);//win7 应该是  IntPtr vHandle1 = FindWindow("WorkerW", null);// FindWindow("Progman", "Program Manager");
            IntPtr vHandle2 = FindWindowEx(vHandle1, IntPtr.Zero, "SHELLDLL_DefView", null);
            IntPtr vHandle = FindWindowEx(vHandle2, IntPtr.Zero, "SysListView32", null);
            if (vHandle==IntPtr.Zero)
            {
                MessageBox.Show("");
            }
这样取不到  spy++查看有好几个  使用循环 
IntPtr dwndparent=IntPtr.Zero;
IntPtr dwndviem=IntPtr.Zero;
IntPtr dwdesktopicon=IntPtr.Zero;
dwndparent=FindWindow("WorkerW", null);//获得第一个WorkerW类的窗口
while((dwndviem!=IntPtr.Zero) && dwndparent!=IntPtr.Zero)
{
        dwndviem=FindWindowEx(dwndparent, IntPtr.Zero, "SHELLDLL_DefView", null);
if(dwndviem!=IntPtr.Zero){
        dwndparent= FindWindowEx(dwndviem, IntPtr.Zero, "SysListView32", null);
break;}
}
这样查找   dwndviem 一直是 0  陷入死循环了   不知道为什么

解决方案 »

  1.   

    static CWnd* FindWindowEx(
       HWND hwndParent,
       HWND hwndChildAfter,
       LPCTSTR lpszClass,
       LPCTSTR lpszWindow
    ); 
    Retrieves the window object whose class name and window name match the specified strings.If the function succeeds, the return value is a pointer to the window object having the specified class and window names. If the function fails, the return value is NULL.就是通过你给的字符串来找窗体,如果你说一直是0那么说明没找到。
    第一可能性:可能是dwndparent这个祸害。
    你用的是FindWindowEx而不是FindWindow,这个API是需要在指定的Handle里面找窗体的。如果你给出的句柄是NULL,那么就永远也找不到子窗体了。
    dwndparent=FindWindow("WorkerW", null);这句代码里面,有可能因为你刚刚创建完毕窗体亦或代码的运行速度太快,一次没找出来,导致dwndparent有可能还是NULL。

    如果是这种情况,可以使用循环来等待句柄有效。
    第二种可能性:字符串的问题
    采用spy+看看你要取的句柄的对象的名称是否正确。
      

  2.   

    翻译得不对吧。
    dwndparent = FindWindowEx(0,dwndparent,L"WorkerW",L""); 
     -》
    dwndparent = FindWindowEx(dwndviem, IntPtr.Zero, "SysListView32", null);试试这样
    dwndparent = FindWindowEx(0,dwndparent,L"WorkerW",L""); 
    -》
    dwndparent = FindWindowEx(IntPtr.Zero, dwndviem, "SysListView32", null);
      

  3.   

    Windows 7 难道不是 Program Manager ??
      

  4.   


    IntPtr vHandle1 = FindWindow("Progman", "Program Manager");//FindWindow("WorkerW", null);// 
    while (vHandle1!=IntPtr.Zero){
    IntPtr vHandle2 = FindWindowEx(0,dwndparent,L"WorkerW",L"");  
    vHandle2 一直是0  不知道为什么  size 有4 个  
    if (vHandle2!=IntPtr.Zero){
    IntPtr vHandle = FindWindowEx(IntPtr.Zero, dwndviem, "SysListView32", null);break;
    }
    ///这里死循环了 
    }
      

  5.   


    IntPtr vHandle1 = FindWindow("WorkerW", null);
    while (vHandle1!=IntPtr.Zero){
    IntPtr vHandle2 = FindWindowEx(0,dwndparent,L"WorkerW",L"");  
    vHandle2 一直是0  不知道为什么  size 有4 个  
    if (vHandle2!=IntPtr.Zero){
    IntPtr vHandle = FindWindowEx(IntPtr.Zero, dwndviem, "SysListView32", null);break;
    }
    ///这里死循环了 
    }
      

  6.   

    IntPtr vHandle1 = FindWindow("WorkerW", null);
    while (vHandle1!=IntPtr.Zero)
    {
        IntPtr vHandle2 = FindWindowEx(0,dwndparent,L"WorkerW",L"");  
        vHandle2 一直是0  不知道为什么  size 有4 个  
        if (vHandle2!=IntPtr.Zero)
        {
            IntPtr vHandle = FindWindowEx(IntPtr.Zero, dwndviem, "SysListView32", null);
            break;
        }
    ///这里死循环了 
    }
    前面就说了,我希望你在IntPtr vHandle2 = FindWindowEx(0,dwndparent,L"WorkerW",L""); 这句话打断点,看看你的dwndparent的值是多少。如果是0,就算你while一千一万遍也无济于事的。死循环说明
    vHandle2始终等于了IntPtr.Zero,当你Create一个Window的时候,并不能马上就能通过FindWindow找到窗体的。返回的vHandle1 等于IntPtr.Zero。你可以在IntPtr vHandle1 = FindWindow("WorkerW", null);后面加一些代码while(vHandle1 == IntPtr.Zero){IntPtr vHandle1 = FindWindow("WorkerW", null);}
      

  7.   

    楼上的 加上那个一样是死循环  IntPtr vHandle1 = FindWindow("WorkerW", null);
    while (vHandle1!=IntPtr.Zero){
    IntPtr vHandle2 = FindWindowEx(0,dwndparent,L"WorkerW",L"");  
    vHandle1 = FindWindow("WorkerW", null);
    vHandle2 一直是0  不知道为什么  size 有4 个  
    if (vHandle2!=IntPtr.Zero){
    IntPtr vHandle = FindWindowEx(IntPtr.Zero, dwndviem, "SysListView32", null);break;
    }
    ///这里死循环了 
    }
      

  8.   

    楼上的 加上那个一样是死循环  IntPtr vHandle1 = FindWindow("WorkerW", null);
    while (vHandle1!=IntPtr.Zero){
    IntPtr vHandle2 = FindWindowEx(0,dwndparent,L"WorkerW",L"");  
    vHandle1 = FindWindow("WorkerW", null);
    vHandle2 一直是0  不知道为什么  size 有4 个  
    if (vHandle2!=IntPtr.Zero){
    IntPtr vHandle = FindWindowEx(IntPtr.Zero, dwndviem, "SysListView32", null);break;
    }
    ///这里死循环了 
    }
      

  9.   

    楼上的 加上那个一样是死循环  IntPtr vHandle1 = FindWindow("WorkerW", null);
    while (vHandle1!=IntPtr.Zero){
    IntPtr vHandle2 = FindWindowEx(0,dwndparent,L"WorkerW",L"");  
    vHandle1 = FindWindow("WorkerW", null);
    vHandle2 一直是0  不知道为什么  size 有4 个  
    if (vHandle2!=IntPtr.Zero){
    IntPtr vHandle = FindWindowEx(IntPtr.Zero, dwndviem, "SysListView32", null);break;
    }
    ///这里死循环了 
    }
      

  10.   

    你在循环里有改变vHandle1的值吗?如果没有,当然while(true)
      

  11.   


    看这里if (vHandle2!=IntPtr.Zero){
    IntPtr vHandle = FindWindowEx(IntPtr.Zero, dwndviem, "SysListView32", null);break;
    }
     已经有条件中断