zoukankan      html  css  js  c++  java
  • Windows 7桌面显示图标窗口句柄的获取

    在windows XP时代,我们获取桌面图标窗口的句柄往往用一下语句:

    HWND hwndParent = ::FindWindow( "Progman", "Program Manager" );
    HWND hwndSHELLDLL_DefView = ::FindWindowEx( hwndParent, NULL, "SHELLDLL_DefView", NULL );
    HWND hwndSysListView32 = ::FindWindowEx( hwndSHELLDLL_DefView, NULL, "SysListView32", "FolderView" );

    可是在windows 7时代,上述代码失效了,经过SKY++分析,发现类名为"Progman"的窗口根本就没有子窗口,而桌面图标窗口在一个类名为"WorkerW"的窗口下面,如图:

    其中:窗口"FloderView"(类名SysListView32)即为桌面图标窗口,因此,老的方法自然无法成功,但是由于类名为"WorkerW"的窗口不止一个,所以必须遍历到含有类名为"SHELLDLL_DefView"子窗口的才是,故:

    Windows 7下,我们取桌面图标窗口的句柄使用以下语句:

    HWND dwndparent;
    HWND dwndviem=NULL;
    HWND dwdesktopicon;
    dwndparent=FindWindowEx(0,0,L"WorkerW",L"");//获得第一个WorkerW类的窗口,
    while((!dwndviem)&&dwndparent)//因为可能会有多个窗口类名为“WorkerW”的窗口存在,所以只能依次遍历
    {
    dwndviem=FindWindowEx(dwndparent,0,L"SHELLDLL_DefView",0);
    dwndparent=FindWindowEx(0,dwndparent,L"WorkerW",L"");
    }
    dwdesktopicon=FindWindowEx(dwndviem,0,L"SysListView32",L"FolderView");

    好了,经过尝试,这段代码确实可以再win7下正常工作,但是肯定不能再winXp下正常工作(我没有尝试),因此,要写出具有通用性的代码,这段代码还需网友改进(其实上面两段代码加以判断叠加即可)

    综上:在win7/WIN10下,桌面图标窗口的层级从上到下为:(通过spy++来查看窗口的层级关系等信息!)

            "#32769 (桌面)"  ---> "WorkerW" ---> "SHELLDLL_DefView" ---> "SysListView32"   (根据窗口类名排列)   

    "#32769 (桌面)":为桌面窗口,通过函数GetDesktopWindow即可获得该窗口句柄;

    “SysListView32”:为包含桌面图标的窗口,其实是一个CListCtrl类列表控件,所以要想操作桌面上图标可以通过操作列表控件来操作!

  • 相关阅读:
    Tensorflow实战(二):Discuz验证码识别
    文竹越长越乱?教你7种修剪方法可保持文竹株形优美,矮壮浓密
    拼应需求分析
    软工实践结对第二次作业
    软工团队第一次作业--团队展示
    学习命令行传参
    软工实践第三次作业-原型设计
    软工实践第二次作业2.0
    软工实践第二次作业
    学习c++ofstream和ifstream
  • 原文地址:https://www.cnblogs.com/2018shawn/p/9833276.html
Copyright © 2011-2022 走看看