打開一個文件夾或者一個文件該怎么寫?當然是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
