16,472
社区成员
发帖
与我相关
我的任务
分享
/****************************************************************************
获取主窗口下某个子窗口的窗口句柄
参数1:最顶层父窗口
参数2:控件ID,可使用spy++(VS2008版本) 查看
****************************************************************************/
HWND FindControlWnd(HWND ParentWnd,DWORD ControlID)
{
HWND hChild = ::GetWindow(ParentWnd, GW_CHILD);
for(; hChild!=NULL ; hChild=::GetWindow(hChild,GW_HWNDNEXT))
{
//判断是否为需要的控件
if ( GetDlgCtrlID(hChild) == ControlID )
return hChild;
HWND FindWnd=FindControlWnd(hChild,ControlID);
if (FindWnd)
return FindWnd;
}
return NULL;
}
/****************************************************************************
获取资源管理器的文件夹路径
只在Xp的下测试过
****************************************************************************/
bool GetExplorerPath(HWND hwnd,TCHAR* FilePath,UINT MaxSize)
{
bool IsOpenAddressBarWndManual=false;
HWND AddressBarWnd=FindControlWnd(hwnd,41477); //找到地址栏窗口
//如果没有找到地址栏,发送菜单消息打开它
if (!AddressBarWnd)
{
// trace("发送菜单消息打开地址栏");
::SendMessage(hwnd,WM_COMMAND,MAKEWPARAM(41477,0),NULL); //发送菜单消息打开地址栏
Sleep(200);
AddressBarWnd=FindControlWnd(hwnd,41477); //找地址栏窗口
if (AddressBarWnd)
IsOpenAddressBarWndManual=true;
else
return false;
}
// trace("find AddressBarWnd");
::SendMessage(AddressBarWnd,WM_GETTEXT,(WPARAM)MaxSize,(LPARAM)FilePath);
// trace(FilePath);
//如果地址栏是我们打开的,重新关闭它
if (IsOpenAddressBarWndManual)
::SendMessage(hwnd,WM_COMMAND,MAKEWPARAM(41477,0),NULL);
return true;
}
/****************************************************************************
枚举桌面可见窗口
****************************************************************************/
BOOL CALLBACK EnumWindowsProc(HWND hwnd,LPARAM lParam)
{
if ( GetParent(hwnd)==NULL && IsWindowVisible(hwnd) )
{
TCHAR ClassName[100];
::GetClassName(hwnd,ClassName,sizeof(ClassName)/sizeof(TCHAR));
if (_tcscmp(_T("CabinetWClass"),ClassName)==0
|| _tcscmp(_T("ExploreWClass"),ClassName)==0 ) //是资源管理器窗口
{
TCHAR FilePath[MAX_PATH]={0};
if ( GetExplorerPath(hwnd,FilePath,sizeof(FilePath)/sizeof(TCHAR)) )
{
if (_tcsstr(FilePath,(TCHAR*)lParam)) //路径里包含有u盘的盘符
{
::PostMessage(hwnd,WM_CLOSE,NULL,NULL);
}
}
}
}
return true;
}
void CDemoDlg::OnButton1()
{
EnumWindows(EnumWindowsProc ,(LPARAM)"E:\\"); //注意U盘符大小写
}