打开一个文件夹或者一个文件该怎么写?当然是ShellExecute函数了,但是他不能完成文件属性窗口的调用。
要想调用一个文件的属性窗口,就要用到ShellExecute的扩展ShellExecuteEx了
先看怎么声明
Private Declare Function ShellExecuteEx Lib "shell32.dll" (ByRef lpExecInfo As SHELLEXECUTEINFOA) As Long
参数很简单,只有一个SHELLEXECUTEINFOA,但是SHELLEXECUTEINFOA这个结构却不简单
声明
Private Type SHELLEXECUTEINFO
cbSize As Long
fMask As Long
hwnd As Long
lpVerb As String
lpFile As String
lpParameters As String
lpDirectory As String
nShow As Long
hInstApp As Long
lpIDList As Long
lpClass As String
hkeyClass As Long
dwHotKey As Long
hIcon As Long
hProcess As Long
End Type
我擦,这么多成员
其实用到的不多,只要指定其中的几个就可以了,先看看这个结构的介绍(以下摘自MSDN,翻译有google翻译)
会员
- CBSIZE
-
类型:DWORD
-
需要。这个结构的大小,以字节为单位。
- fMask
-
类型:ULONG
-
表明其他结构成员的内容和有效性的标志; 以下值的组合:
SEE_MASK_CLASSNAME(0x00000001)
-
使用由lpIDList成员给出的项目标识符列表。所述lpIDList构件必须指向一个ITEMIDLIST结构。
SEE_MASK_INVOKEIDLIST(0x0000000C)
-
使用所选项目的快捷菜单处理程序的IContextMenu界面。使用lpFile通过其文件系统路径或lpIDList来标识项目以通过其PIDL标识项目。此标志允许应用程序使用ShellExecuteEx从快捷菜单扩展中调用动词,而不是注册表中列出的静态动词。
注意 SEE_MASK_INVOKEIDLIST覆盖并隐含SEE_MASK_IDLIST。
SEE_MASK_NOCLOSEPROCESS(0x00000040)
-
用于指示hProcess成员接收进程句柄。此句柄通常用于允许应用程序查明用ShellExecuteEx创建的进程何时终止。在某些情况下,例如通过DDE对话满足执行时,不会返回句柄。调用应用程序负责在不再需要时关闭句柄。
SEE_MASK_CONNECTNETDRV(0x00000080)
-
在返回之前等待执行操作完成。此标志应由使用ShellExecute表单的调用方使用,这些表单可能会导致异步激活,例如DDE,并创建可能在后台线程上运行的进程。(注:的ShellExecuteEx在默认情况下在后台线程运行,如果来电者的线程模型是不是公寓。)调用的ShellExecuteEx从后台线程已经运行的进程应该总是通过此标志。此外,在调用ShellExecuteEx之后立即退出的应用程序应指定此标志。
如果执行操作是在后台线程上执行的,并且调用者未指定SEE_MASK_ASYNCOK标志,则调用线程将等待,直到新进程启动后再返回。这通常意味着CreateProcess已被调用,DDE通信已完成,或者自定义执行委托已通知ShellExecuteEx它已完成。如果指定了SEE_MASK_WAITFORINPUTIDLE标志,则ShellExecuteEx将调用WaitForInputIdle,并在返回之前等待新进程闲置,最大超时时间为1分钟。
有关此标志何时需要的更多讨论,请参阅备注部分。
SEE_MASK_FLAG_DDEWAIT(0x00000100)
SEE_MASK_DOENVSUBST(0x00000200)
SEE_MASK_FLAG_NO_UI(0x00000400)
SEE_MASK_NO_CONSOLE(0x00008000)
-
用于继承新进程的父级控制台,而不是创建新控制台。这与CreateProcess使用CREATE_NEW_CONSOLE标志是相反的。
-
执行可以在后台线程上执行,并且调用应该立即返回而不需要等待后台线程完成。请注意,在某些情况下,ShellExecuteEx将忽略此标志,并在返回之前等待该过程完成。
SEE_MASK_NOQUERYCLASSSTORE(0x01000000)
SEE_MASK_NOZONECHECKS(0x00800000)
-
在Windows XP中引入。不要执行区域检查。此标志允许ShellExecuteEx绕过由IAttachmentExecute放置到位的区域检查。
SEE_MASK_WAITFORINPUTIDLE(0x02000000)
-
新流程创建完成后,请等待进程在返回之前变为空闲状态,并等待一分钟。有关更多详细信息,请参阅WaitForInputIdle。
SEE_MASK_FLAG_LOG_USAGE(0x04000000)
SEE_MASK_FLAG_HINST_IS_SITE(0x08000000)
-
所述hInstApp构件用于指定所述的IUnknown实现的对象的的IServiceProvider。这个对象将被用作站点指针。站点指针用于为ShellExecute函数,处理程序绑定进程和调用的动词处理程序提供服务。
要在Windows 8之前的操作系统中使用SEE_MASK_FLAG_HINST_IS_SITE,请在程序中手动定义它:#define SEE_MASK_FLAG_HINST_IS_SITE 0x08000000。
-
- HWND
-
类型:HWND
-
可选的。父窗口的句柄,用于显示执行此功能时系统可能产生的任何消息框。该值可以是NULL。
- lpVerb
-
类型:LPCTSTR
-
一个字符串,被称为动词,用于指定要执行的操作。可用动词的集合取决于特定的文件或文件夹。通常,对象快捷菜单中的可用动作是可用的动词。该参数可以为NULL,在这种情况下,如果可用,则使用默认动词。如果不是,则使用“打开”动词。如果两个动词都不可用,则系统使用注册表中列出的第一个动词。以下动词通常使用:
-
显示文件或文件夹的属性。
-
- lpFile
-
类型:LPCTSTR
-
空终止字符串的地址,它指定ShellExecuteEx将执行由lpVerb参数指定的操作的文件或对象的名称。ShellExecuteEx函数支持的系统注册表动词包括可执行文件和文档文件的“打开”以及已为其注册打印处理程序的文档文件的“打印”。其他应用程序可能会通过系统注册表添加Shell动词,例如.avi和.wav文件的“play”。要指定一个Shell命名空间对象,请传递完全限定的解析名称,并在fMask参数中设置SEE_MASK_INVOKEIDLIST标志。
注意 如果设置了SEE_MASK_INVOKEIDLIST标志,则可以使用lpFile或lpIDList分别通过其文件系统路径或其PIDL来识别项目。一个值-两个lpFile或lpIDList -必须进行设置。注意 如果路径不包含在名称中,则假定当前目录。 - lpParameters
-
类型:LPCTSTR
-
可选的。包含应用程序参数的以空字符结尾的字符串的地址。参数必须用空格分隔。如果lpFile成员指定一个文档文件,则lpParameters应该为NULL。
- lpDirectory
-
类型:LPCTSTR
-
可选的。指定工作目录名称的以空字符结尾的字符串的地址。如果此成员为NULL,则当前目录用作工作目录。
- n显示
-
类型:int
-
需要。指定应用程序在打开时如何显示的标志; 为ShellExecute函数列出的其中一个SW_值。如果lpFile指定一个文档文件,该标志只是传递给关联的应用程序。决定如何处理它取决于应用程序。
- hInstApp
-
类型:HINSTANCE
-
[out]如果设置了SEE_MASK_NOCLOSEPROCESS并且ShellExecuteEx调用成功,则它将此成员设置为大于32的值。如果该函数失败,则将其设置为指示失败原因的SE_ERR_XXX错误值。虽然hInstApp为了兼容16位Windows应用程序而声明为HINSTANCE,但它并不是真正的HINSTANCE。它只能转换为int,并与32或以下SE_ERR_XXX错误代码进行比较。
-
文件关联不可用。
-
- lpIDList
-
类型:LPVOID
-
绝对ITEMIDLIST结构(PCIDLIST_ABSOLUTE)的地址,用于包含唯一标识要执行的文件的项目标识符列表。如果fMask成员不包含SEE_MASK_IDLIST或SEE_MASK_INVOKEIDLIST,则该成员将被忽略。
- lpClass
-
类型:LPCTSTR
-
以空值终止的字符串的地址,指定以下之一:
- 一个ProgId。例如,“Paint.Picture”。
- 一个URI协议方案。例如,“http”。
- 文件扩展名。例如,“.txt”。
- HKEY_CLASSES_ROOT下的注册表路径,用于命名包含一个或多个Shell动词的子项。这个键将有一个符合Shell动态注册表模式的子键,比如
shell \ 动词名称
。
如果fMask不包含SEE_MASK_CLASSNAME,则该成员将被忽略。
- hkeyClass
-
类型:HKEY
-
文件类型的注册表项句柄。此注册表项的访问权限应设置为KEY_READ。如果fMask不包含SEE_MASK_CLASSKEY,则该成员将被忽略。
- dwHotKey
-
类型:DWORD
-
与应用程序关联的键盘快捷键。低位字是虚拟键码,高位字是修饰符标志(HOTKEYF_)。有关修饰符标志的列表,请参阅WM_SETHOTKEY消息的描述。如果fMask不包含SEE_MASK_HOTKEY,则该成员将被忽略。
- DUMMYUNIONNAME
- 惠康
-
类型:手柄
-
文件类型图标的句柄。如果fMask不包含SEE_MASK_ICON,则该成员将被忽略。该值仅在Windows XP及更早版本中使用。在Windows Vista中忽略它。
- HMONITOR
-
类型:手柄
-
要显示文档的显示器的句柄。如果fMask不包含SEE_MASK_HMONITOR,则该成员将被忽略。
- hProcess
-
类型:手柄
好了,看代码吧
Private Declare Function ShellExecuteEx Lib "shell32.dll" (SEI As SHELLEXECUTEINFO) As Long
Private Const SEE_MASK_INVOKEIDLIST As Long = &HC
Private Const SW_SHOW As Long = 5
Private Const SEE_MASK_ICON As Long = &H10
Private Sub Form_Load()
Dim s As SHELLEXECUTEINFO
s.cbSize = Len(s) ‘结构大小
s.lpVerb = "properties" ‘当properties时打开属性窗口,open时打开文件或文件夹
s.lpFile = "F:\Recv" ‘路径
s.nShow = SW_SHOW
s.fMask = SEE_MASK_INVOKEIDLIST
ShellExecuteEx s
End Sub