得到win7 win8的桌面句柄

在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"的窗口下面,如图:

关于win7的桌面句柄(转贴加自己的经验) - lhybird - 我的博客

其中:窗口"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)
{
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桌面的句柄会变,暂时不知道在什么情况下会变。

有时是 WorkerW--> SHELLDLL_DefView,

有时是 Progman --> SHELLDLL_DefView

在windows 8时代 又有所变化 如图:


	//得到桌面ListView控件句柄
	/*
	HWND hTop=FindWindow(TEXT("Progman"), NULL);    //得到最上层窗口句柄
	HWND hFirst=GetFirstChild(hTop);                //得到第一个子窗口 WorkerW
	HWND hNext=GetWindow(hFirst,GW_HWNDNEXT);       //得到同一级的下一个窗口 SHELLDLL_DefView
	HWND hWndLV=GetFirstChild(hNext);               //得到桌面控件句柄
	*/
	HWND hWndLV=GetFirstChild(GetWindow(GetFirstChild(
		FindWindow(TEXT("Progman"), NULL)), GW_HWNDNEXT));


评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值