自动打开“我的电脑” 编号:QA000957 建立日期:1999年5月10日最后修改日期:2004年9月4日所属类别:C/C++ - Windows API 我的问题是在Win95 or Win98 下,能不能编一个程序实现这样的功能. 该程序先自动打开“我的电脑”, 然后在自动关闭, 然后在模拟按键Alt+F4出现关机界面, 最后在模拟输入"Alt+y"关闭计算机。 能实现的话,如何实现?采用的语言为vc++ 5.0 。谢谢!(wenwp01) 可以使用SHGetSpecialFolderLocation函数获得“我的电脑”所对应的虚拟文件夹的id。然后使用ShellExecuteEx打开这个虚拟文件夹。 使用API函数SHGetSpecialFolderLocation。shlobj.h里有SHGetSpecialFolderLocation的原型声明。这个函数可以帮我们找到Windows的桌面目录、启动目录、我的文档目录等。 SHGetSpecialFolder需要三个参数。 第一个参数是HWND,它指定了"所有者窗口":在调用这个函数时可能出现的对话框或消息框。第二个参数是一个整数id,决定哪个目录是待查找目录,它的取值可能是: CSIDL_BITBUCKET回收站CSIDL_CONTROLS控制面板CSIDL_DESKTOPWindows 桌面DesktopCSIDL_DESKTOPDIRECTORYDesktop的目录CSIDL_DRIVES我的电脑CSIDL_FONTS字体目录CSIDL_NETHOOD网上邻居CSIDL_NETWORK网上邻居虚拟目录CSIDL_PERSONAL我的文档CSIDL_PRINTERS打印机CSIDL_PROGRAMS程序组CSIDL_RECENT最近打开的文档CSIDL_SENDTO“发送到”菜单项CSIDL_STARTMENU任务条启动菜单项CSIDL_STARTUP启动目录CSIDL_TEMPLATES文档模板 这里只是最常用的部分。完整的请参考http://msdn.microsoft.com/library/default.asp?url=/library/en-us/shellcc/platform/shell/reference/enums/csidl.asp。 最后一个参数是pidl地址。SHGetSpecialFolderLocation把地址写到pidl。 下面是一个例子: LPITEMIDLIST pidl; TCHAR szPath [MAX_PATH]; LPMALLOC pMalloc; if ( SUCCEEDED( SHGetSpecialFolderLocation ( NULL, CSIDL_DRIVES, &pidl ))) { SHELLEXECUTEINFO sei; ZeroMemory(&sei, sizeof(sei)); sei.cbSize = sizeof(sei); sei.fMask = SEE_MASK_IDLIST; sei.lpIDList = pidl; sei.lpVerb = "open"; sei.hwnd = AfxGetMainWnd()->GetSafeHwnd(); sei.nShow = SW_SHOWNORMAL; ShellExecuteEx(&sei); if ( SUCCEEDED( SHGetMalloc ( &pMalloc ))) { pMalloc->Free ( pidl ); pMalloc->Release(); } } 由于“我的电脑”是虚拟文件夹,所以必须使用ShellExecuteEx函数,如果是普通文件夹,则可以使用SHGetPathFromIDList获得文件名,然后利用ShellExecute函数打开。例如要打开“发送到”文件夹,可以这样: if ( SUCCEEDED( SHGetSpecialFolderLocation ( NULL, CSIDL_SENDTO, &pidl ))) { if ( SHGetPathFromIDList ( pidl, szPath )) { ShellExecute(AfxGetMainWnd()->GetSafeHwnd(), "open", szPath, NULL, NULL, SW_SHOWNORMAL); } if ( SUCCEEDED( SHGetMalloc ( &pMalloc ))) { pMalloc->Free ( pidl ); pMalloc->Release(); } } 如果是虚拟文件夹,SHGetPathFromIDList函数会失败。 对于普通文件夹也可以使用SHGetSpecialFolderPath函数,而不使用SHGetSpecialFolderLocation函数,这样更简单些,但运行环境必须是Windows 2000以后的操作系统或安装了IE 4.0以上版本。 关闭窗口和关机参考QA000166 "如何利用VB实现操作系统或者某一应用程序的自动关闭"。