-
-
Save BiggerDigger/6925cb7a6c4d2263867e to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#NoEnv | |
#SingleInstance, Off | |
SetBatchLines, -1 | |
OnExit, ExitSub | |
Gosub, GlobalDefine | |
Menu, FileMenu, Add, Open File…, OpenFile | |
Menu, FileMenu, Add, Select File(s)…, SelectFiles | |
Menu, FileMenu, Add, Select Folder…, SelectFolder | |
Menu, FileMenu, Add, Save As…, SaveAs | |
Menu, FileMenu, Add, Exit, ExitSub | |
Menu, HelpMenu, Add, % FileExist(A_ScriptDir "\CommonItemDialog.chm") | |
? "Open Help" : "Open MSDN", OpenHelp | |
Menu, MenuBar, Add, File, :FileMenu | |
Menu, MenuBar, Add, Help, :HelpMenu | |
Menu, Tray, Tip, Common Item Dialog Sample | |
Gui, +HwndhOwner | |
Gui, Menu, MenuBar | |
Gui, Font, s10, Consolas | |
Gui, Add, Edit, vEdit1 w800 h400 ReadOnly | |
Gui, Add, ListView, w800 r20 Grid -LV0x10 NoSort, Time|Event | |
LV_ModifyCol(1, 110) | |
LV_ModifyCol(2, 660) | |
Gui, Show, , Common Item Dialog Sample | |
Return | |
ExitSub: | |
DialogEventHandler(0) | |
ExitApp | |
GuiClose: | |
ExitApp | |
OpenFile: | |
FD := New IFileOpenDialog() | |
pFDE := DialogEventHandler() | |
FD.Advise(pFDE, Cookie) | |
FD.SetFileTypes("AutoHotkey Scripts", "*.ahk" | |
, "Web Documents", "*.htm;*.html" | |
, "Text Documents", "*.txt" | |
, "All Files", "*.*") | |
FD.GetOptions(Flags) | |
FD.SetOptions(Flags | FOS_STRICTFILETYPES) | |
pFDC := FD.QueryInterface(IID_IFileDialogCustomize) | |
FDC := New IFileDialogCustomize(pFDC) | |
FDC.StartVisualGroup(10, "Encoding:") | |
FDC.AddComboBox(100) | |
FDC.AddControlItem(100, 1, "Default") | |
FDC.AddControlItem(100, 2, "Unicode (UTF-8)") | |
FDC.AddControlItem(100, 3, "Unicode (UTF-16LE)") | |
FDC.SetSelectedControlItem(100, 1) | |
FDC.EndVisualGroup() | |
FDC.MakeProminent(10) | |
FDC.AddCheckButton(200, "Open as read-only", True) | |
FDC.SetControlState(200, CDCS_INACTIVE | CDCS_VISIBLE) | |
If (FD.Show(hOwner) = 0) { | |
FD.GetResult(pSI) | |
SI := New IShellItem(pSI) | |
SI.GetDisplayName(SIGDN_FILESYSPATH, FilePath) | |
SI.Release() | |
FDC.GetSelectedControlItem(100, Option) | |
Option := Option = 2 ? "*P65001 " : Option = 3 ? "*P1200 " : "" | |
FileRead, Output, % Option FilePath | |
GuiControl, , Edit1, % Output | |
} | |
FDC.Release() | |
FD.Unadvise(Cookie) | |
ObjRelease(pFDE) | |
FD.Release() | |
Return | |
SelectFiles: | |
FD := New IFileOpenDialog() | |
pFDE := DialogEventHandler() | |
FD.Advise(pFDE, Cookie) | |
FD.SetTitle("Select File(s)") | |
FD.GetOptions(Flags) | |
Flags |= FOS_ALLOWMULTISELECT | FOS_NODEREFERENCELINKS | FOS_FORCESHOWHIDDEN | |
FD.SetOptions(Flags) | |
SHCreateItemFromParsingName(A_ScriptDir, 0, IID_IShellItem, pSI) | |
FD.AddPlace(pSI, FDAP_TOP) | |
FD.SetFileNameLabel("File Name(s):") | |
FD.SetOkButtonLabel("Confirm") | |
pFD2 := FD.QueryInterface(IID_IFileDialog2) | |
FD2 := New IFileDialog2(pFD2) | |
FD2.SetCancelButtonLabel("Discard") | |
HResult := FD.Show(hOwner) | |
If (HResult = 0) { | |
FD.GetResults(pSIA) | |
SIA := New IShellItemArray(pSIA) | |
SIA.GetCount(Count) | |
Loop, % Count { | |
SIA.GetItemAt(A_Index - 1, pSI) | |
SI := New IShellItem(pSI) | |
SI.GetDisplayName(SIGDN_FILESYSPATH, FilePath) | |
SI.Release() | |
Output := (A_Index = 1 ? "Selected File(s):`n" : Output "`n") FilePath | |
} | |
SIA.Release() | |
GuiControl, , Edit1, % Output | |
} Else { | |
HResult := HResult < 0 ? ~(-HResult) + 1 : HResult | |
GuiControl, , Edit1, % HResult = 0x800704C7 | |
? "The operation was canceled by the user." | |
: "HResult = " HResult | |
} | |
FD2.Release() | |
FD.Unadvise(Cookie) | |
ObjRelease(pFDE) | |
FD.Release() | |
Return | |
SelectFolder: | |
FD := New IFileOpenDialog() | |
pFDE := DialogEventHandler() | |
FD.Advise(pFDE, Cookie) | |
FD.GetOptions(Flags) | |
FD.SetOptions(Flags | FOS_PICKFOLDERS | FOS_FORCEFILESYSTEM) | |
HResult := FD.Show(hOwner) | |
If (HResult = 0) { | |
FD.GetResult(pSI) | |
SI := New IShellItem(pSI) | |
SI.GetDisplayName(SIGDN_FILESYSPATH, FilePath) | |
SI.Release() | |
GuiControl, , Edit1, % "Selected Folder:`n" FilePath | |
} Else { | |
HResult := HResult < 0 ? ~(-HResult) + 1 : HResult | |
GuiControl, , Edit1, % HResult = 0x800704C7 | |
? "The operation was canceled by the user." | |
: "HResult = " HResult | |
} | |
FD.Unadvise(Cookie) | |
ObjRelease(pFDE) | |
FD.Release() | |
Return | |
SaveAs: | |
FD := New IFileSaveDialog() | |
pFDE := DialogEventHandler() | |
FD.Advise(pFDE, Cookie) | |
FD.SetFileTypes("AutoHotkey Scripts", "*.ahk" | |
, "Web Documents", "*.htm;*.html" | |
, "Text Documents", "*.txt" | |
, "All Files", "*.*") | |
FD.SetDefaultExtension("ahk") | |
SHCreateItemFromParsingName(A_ScriptFullPath, 0, IID_IShellItem, pSI) | |
FD.SetSaveAsItem(pSI) | |
HResult := FD.Show(hOwner) | |
If (HResult = 0) { | |
FD.GetResult(pSI) | |
SI := New IShellItem(pSI) | |
SI.GetDisplayName(SIGDN_FILESYSPATH, FilePath) | |
SI.Release() | |
GuiControl, , Edit1, % "Selected File:`n" FilePath | |
} Else { | |
HResult := HResult < 0 ? ~(-HResult) + 1 : HResult | |
GuiControl, , Edit1, % HResult = 0x800704C7 | |
? "The operation was canceled by the user." | |
: "HResult = " HResult | |
} | |
FD.Unadvise(Cookie) | |
ObjRelease(pFDE) | |
FD.Release() | |
Return | |
OpenHelp: | |
If FileExist(A_ScriptDir "\CommonItemDialog.chm") | |
Run, Open %A_ScriptDir%\CommonItemDialog.chm | |
Else | |
Run, Open http://msdn.microsoft.com/library/bb776913 | |
Return | |
Class IUnknown | |
{ | |
; IUnknown interface http://msdn.microsoft.com/library/ms680509 | |
Static IID_IUnknown := "{00000000-0000-0000-C000-000000000046}" | |
__New(Param := "") { ; Interface pointer or CLSID | |
If Param Is Not Integer | |
CLSID := Param ? Param : This["CLSID_" SubStr(This.__Class, 2)] | |
, IID := This["IID_" This.__Class] | |
, This.Ptr := CLSID ? ComObjCreate(CLSID, IID) : "" | |
Else | |
This.Ptr := Param | |
Return, This.Ptr ? This : False | |
} | |
__Delete() { | |
ObjRelease(This.Ptr) | |
} | |
VTable(Index) { | |
Return, NumGet(NumGet(This.Ptr) + A_PtrSize * Index) | |
} | |
; Methods | |
QueryInterface(Params*) { ; SID and/or IID | |
Return, Params.MaxIndex() ? ComObjQuery(This.Ptr, Params*) : False | |
} | |
AddRef() { | |
ObjAddRef(This.Ptr) | |
} | |
Release() { | |
ObjRelease(This.Ptr) | |
, This.Remove("", Chr(255)) | |
, This.SetCapacity(0) | |
, This.Base := "" | |
} | |
} | |
Class IModalWindow Extends IUnknown | |
{ | |
; IModalWindow interface http://msdn.microsoft.com/library/bb761686 | |
Static IID_IModalWindow := "{b4db1657-70d7-485e-8e3e-6fcb5a5c1802}" | |
; Methods | |
Show(hwndOwner := 0) { | |
Return, DllCall(This.VTable(3), "UPtr", This.Ptr | |
, "UPtr", hwndOwner | |
, "Int") | |
} | |
} | |
Class IFileDialog Extends IModalWindow | |
{ | |
; IFileDialog interface http://msdn.microsoft.com/library/bb775966 | |
Static IID_IFileDialog := "{42f85136-db7e-439c-85f1-e4075d135fc8}" | |
; Methods | |
SetFileTypes(Params*) { | |
If Not Params.MaxIndex() Or Mod(Params.MaxIndex(), 2) | |
Return | |
cFileTypes := Params[1], rgFilterSpec := Params[2] | |
If rgFilterSpec Is Not Integer | |
{ | |
cFileTypes := Params.MaxIndex() // 2 | |
; COMDLG_FILTERSPEC structure | |
VarSetCapacity(FilterSpec, A_PtrSize * Params.MaxIndex()) | |
, rgFilterSpec := &FilterSpec | |
For Index, Field In Params { | |
If Not A_IsUnicode | |
Params.SetCapacity(Index, (StrLen(Field) + 1) * 2) | |
, StrPut(Field, Params.GetAddress(Index), "UTF-16") | |
NumPut(Params.GetAddress(Index) | |
, FilterSpec | |
, A_PtrSize * (Index - 1)) | |
} | |
} | |
Return, DllCall(This.VTable(4), "UPtr", This.Ptr | |
, "UInt", cFileTypes | |
, "UPtr", rgFilterSpec | |
, "Int") | |
} | |
SetFileTypeIndex(iFileType) { | |
Return, DllCall(This.VTable(5), "UPtr", This.Ptr | |
, "UInt", iFileType | |
, "Int") | |
} | |
GetFileTypeIndex(ByRef iFileType) { | |
Return, DllCall(This.VTable(6), "UPtr", This.Ptr | |
, "UInt*", iFileType | |
, "Int") | |
} | |
Advise(pfde, ByRef dwCookie) { | |
Return, DllCall(This.VTable(7), "UPtr", This.Ptr | |
, "UPtr", pfde | |
, "UInt*", dwCookie | |
, "Int") | |
} | |
Unadvise(dwCookie) { | |
Return, DllCall(This.VTable(8), "UPtr", This.Ptr | |
, "UInt", dwCookie | |
, "Int") | |
} | |
SetOptions(fos) { | |
Return, DllCall(This.VTable(9), "UPtr", This.Ptr | |
, "UInt", fos | |
, "Int") | |
} | |
GetOptions(ByRef fos) { | |
Return, DllCall(This.VTable(10), "UPtr", This.Ptr | |
, "UInt*", fos | |
, "Int") | |
} | |
SetDefaultFolder(psi) { | |
Return, DllCall(This.VTable(11), "UPtr", This.Ptr | |
, "UPtr", psi | |
, "Int") | |
} | |
SetFolder(psi) { | |
Return, DllCall(This.VTable(12), "UPtr", This.Ptr | |
, "UPtr", psi | |
, "Int") | |
} | |
GetFolder(ByRef psi) { | |
Return, DllCall(This.VTable(13), "UPtr", This.Ptr | |
, "UPtr*", psi | |
, "Int") | |
} | |
GetCurrentSelection(ByRef psi) { | |
Return, DllCall(This.VTable(14), "UPtr", This.Ptr | |
, "UPtr*", psi | |
, "Int") | |
} | |
SetFileName(sName) { | |
Return, DllCall(This.VTable(15), "UPtr", This.Ptr | |
, "WStr", sName | |
, "Int") | |
} | |
GetFileName(ByRef sName) { | |
hr := DllCall(This.VTable(16), "UPtr", This.Ptr | |
, "UPtr*", pszName | |
, "Int") | |
, sName := StrGet(pszName, "UTF-16") | |
, CoTaskMemFree(pszName) | |
Return, hr | |
} | |
SetTitle(sTitle) { | |
Return, DllCall(This.VTable(17), "UPtr", This.Ptr | |
, "WStr", sTitle | |
, "Int") | |
} | |
SetOkButtonLabel(sLabel) { | |
Return, DllCall(This.VTable(18), "UPtr", This.Ptr | |
, "WStr", sLabel | |
, "Int") | |
} | |
SetFileNameLabel(sLabel) { | |
Return, DllCall(This.VTable(19), "UPtr", This.Ptr | |
, "WStr", sLabel | |
, "Int") | |
} | |
GetResult(ByRef psi) { | |
Return, DllCall(This.VTable(20), "UPtr", This.Ptr | |
, "UPtr*", psi | |
, "Int") | |
} | |
AddPlace(psi, fdap) { | |
Return, DllCall(This.VTable(21), "UPtr", This.Ptr | |
, "UPtr", psi | |
, "UInt", fdap | |
, "Int") | |
} | |
SetDefaultExtension(sExtension) { | |
Return, DllCall(This.VTable(22), "UPtr", This.Ptr | |
, "WStr", sExtension | |
, "Int") | |
} | |
Close(hr) { | |
Return, DllCall(This.VTable(23), "UPtr", This.Ptr | |
, "Int", hr | |
, "Int") | |
} | |
SetClientGuid(rguid) { | |
If rguid Is Not Integer | |
CLSIDFromString(rguid, GUID), rguid := &GUID | |
Return, DllCall(This.VTable(24), "UPtr", This.Ptr | |
, "UPtr", rguid | |
, "Int") | |
} | |
ClearClientData() { | |
Return, DllCall(This.VTable(25), "UPtr", This.Ptr, "Int") | |
} | |
SetFilter(pFilter) { | |
Return, DllCall(This.VTable(26), "UPtr", This.Ptr | |
, "UPtr", pFilter | |
, "Int") | |
} | |
} | |
Class IFileDialog2 Extends IFileDialog | |
{ | |
; IFileDialog2 interface http://msdn.microsoft.com/library/dd378363 | |
Static IID_IFileDialog2 := "{61744fc7-85b5-4791-a9b0-272276309b13}" | |
; Methods | |
SetCancelButtonLabel(sLabel) { | |
Return, DllCall(This.VTable(27), "UPtr", This.Ptr | |
, "WStr", sLabel | |
, "Int") | |
} | |
SetNavigationRoot(psi) { | |
Return, DllCall(This.VTable(28), "UPtr", This.Ptr | |
, "UPtr", psi | |
, "Int") | |
} | |
} | |
Class IFileOpenDialog Extends IFileDialog | |
{ | |
; IFileOpenDialog interface http://msdn.microsoft.com/library/bb775834 | |
Static CLSID_FileOpenDialog := "{DC1C5A9C-E88A-4dde-A5A1-60F82A20AEF7}" | |
, IID_IFileOpenDialog := "{d57c7288-d4ad-4768-be02-9d969532d960}" | |
; Methods | |
GetResults(ByRef psia) { | |
Return, DllCall(This.VTable(27), "UPtr", This.Ptr | |
, "UPtr*", psia | |
, "Int") | |
} | |
GetSelectedItems(ByRef psia) { | |
Return, DllCall(This.VTable(28), "UPtr", This.Ptr | |
, "UPtr*", psia | |
, "Int") | |
} | |
} | |
Class IFileSaveDialog Extends IFileDialog | |
{ | |
; IFileSaveDialog interface http://msdn.microsoft.com/library/bb775688 | |
Static CLSID_FileSaveDialog := "{C0B4E2F3-BA21-4773-8DBA-335EC946EB8B}" | |
, IID_IFileSaveDialog := "{84bccd23-5fde-4cdb-aea4-af64b83d78ab}" | |
; Methods | |
SetSaveAsItem(psi) { | |
Return, DllCall(This.VTable(27), "UPtr", This.Ptr | |
, "UPtr", psi | |
, "Int") | |
} | |
SetProperties(pStore) { | |
Return, DllCall(This.VTable(28), "UPtr", This.Ptr | |
, "UPtr", pStore | |
, "Int") | |
} | |
SetCollectedProperties(pList, fAppendDefault) { | |
Return, DllCall(This.VTable(29), "UPtr", This.Ptr | |
, "UPtr", pList | |
, "Int", fAppendDefault | |
, "Int") | |
} | |
GetProperties(ByRef pStore) { | |
Return, DllCall(This.VTable(30), "UPtr", This.Ptr | |
, "UPtr*", pStore | |
, "Int") | |
} | |
ApplyProperties(psi, pStore, hwnd, pSink) { | |
Return, DllCall(This.VTable(31), "UPtr", This.Ptr | |
, "UPtr", psi | |
, "UPtr", pStore | |
, "UPtr", hwnd | |
, "UPtr", pSink | |
, "Int") | |
} | |
} | |
Class IFileDialogCustomize Extends IUnknown | |
{ | |
; IFileDialogCustomize interface http://msdn.microsoft.com/library/bb775912 | |
Static IID_IFileDialogCustomize := "{e6fdd21a-163f-4975-9c8c-a69f1ba37034}" | |
; Methods | |
EnableOpenDropDown(dwIDCtl) { | |
Return, DllCall(This.VTable(3), "UPtr", This.Ptr | |
, "UInt", dwIDCtl | |
, "Int") | |
} | |
AddMenu(dwIDCtl, sLabel) { | |
Return, DllCall(This.VTable(4), "UPtr", This.Ptr | |
, "UInt", dwIDCtl | |
, "WStr", sLabel | |
, "Int") | |
} | |
AddPushButton(dwIDCtl, sLabel) { | |
Return, DllCall(This.VTable(5), "UPtr", This.Ptr | |
, "UInt", dwIDCtl | |
, "WStr", sLabel | |
, "Int") | |
} | |
AddComboBox(dwIDCtl) { | |
Return, DllCall(This.VTable(6), "UPtr", This.Ptr | |
, "UInt", dwIDCtl | |
, "Int") | |
} | |
AddRadioButtonList(dwIDCtl) { | |
Return, DllCall(This.VTable(7), "UPtr", This.Ptr | |
, "UInt", dwIDCtl | |
, "Int") | |
} | |
AddCheckButton(dwIDCtl, sLabel, bChecked) { | |
Return, DllCall(This.VTable(8), "UPtr", This.Ptr | |
, "UInt", dwIDCtl | |
, "WStr", sLabel | |
, "Int", bChecked | |
, "Int") | |
} | |
AddEditBox(dwIDCtl, sText) { | |
Return, DllCall(This.VTable(9), "UPtr", This.Ptr | |
, "UInt", dwIDCtl | |
, "WStr", sText | |
, "Int") | |
} | |
AddSeparator(dwIDCtl) { | |
Return, DllCall(This.VTable(10), "UPtr", This.Ptr | |
, "UInt", dwIDCtl | |
, "Int") | |
} | |
AddText(dwIDCtl, sText) { | |
Return, DllCall(This.VTable(11), "UPtr", This.Ptr | |
, "UInt", dwIDCtl | |
, "WStr", sText | |
, "Int") | |
} | |
SetControlLabel(dwIDCtl, sLabel) { | |
Return, DllCall(This.VTable(12), "UPtr", This.Ptr | |
, "UInt", dwIDCtl | |
, "WStr", sLabel | |
, "Int") | |
} | |
GetControlState(dwIDCtl, ByRef dwState) { | |
Return, DllCall(This.VTable(13), "UPtr", This.Ptr | |
, "UInt", dwIDCtl | |
, "UInt*", dwState | |
, "Int") | |
} | |
SetControlState(dwIDCtl, dwState) { | |
Return, DllCall(This.VTable(14), "UPtr", This.Ptr | |
, "UInt", dwIDCtl | |
, "UInt", dwState | |
, "Int") | |
} | |
GetEditBoxText(dwIDCtl, ByRef sText) { | |
hr := DllCall(This.VTable(15), "UPtr", This.Ptr | |
, "UInt", dwIDCtl | |
, "UPtr*", pszText | |
, "Int") | |
, sText := StrGet(pszText, "UTF-16") | |
, CoTaskMemFree(pszText) | |
Return, hr | |
} | |
SetEditBoxText(dwIDCtl, sText) { | |
Return, DllCall(This.VTable(16), "UPtr", This.Ptr | |
, "UInt", dwIDCtl | |
, "WStr", sText | |
, "Int") | |
} | |
GetCheckButtonState(dwIDCtl, ByRef bChecked) { | |
Return, DllCall(This.VTable(17), "UPtr", This.Ptr | |
, "UInt", dwIDCtl | |
, "Int*", bChecked | |
, "Int") | |
} | |
SetCheckButtonState(dwIDCtl, bChecked) { | |
Return, DllCall(This.VTable(18), "UPtr", This.Ptr | |
, "UInt", dwIDCtl | |
, "Int", bChecked | |
, "Int") | |
} | |
AddControlItem(dwIDCtl, dwIDItem, sLabel) { | |
Return, DllCall(This.VTable(19), "UPtr", This.Ptr | |
, "UInt", dwIDCtl | |
, "UInt", dwIDItem | |
, "WStr", sLabel | |
, "Int") | |
} | |
RemoveControlItem(dwIDCtl, dwIDItem) { | |
Return, DllCall(This.VTable(20), "UPtr", This.Ptr | |
, "UInt", dwIDCtl | |
, "UInt", dwIDItem | |
, "Int") | |
} | |
RemoveAllControlItems(dwIDCtl) { | |
Return, DllCall(This.VTable(21), "UPtr", This.Ptr | |
, "UInt", dwIDCtl | |
, "Int") | |
} | |
GetControlItemState(dwIDCtl, dwIDItem, ByRef dwState) { | |
Return, DllCall(This.VTable(22), "UPtr", This.Ptr | |
, "UInt", dwIDCtl | |
, "UInt", dwIDItem | |
, "UInt*", dwState | |
, "Int") | |
} | |
SetControlItemState(dwIDCtl, dwIDItem, dwState) { | |
Return, DllCall(This.VTable(23), "UPtr", This.Ptr | |
, "UInt", dwIDCtl | |
, "UInt", dwIDItem | |
, "UInt", dwState | |
, "Int") | |
} | |
GetSelectedControlItem(dwIDCtl, ByRef dwIDItem) { | |
Return, DllCall(This.VTable(24), "UPtr", This.Ptr | |
, "UInt", dwIDCtl | |
, "UInt*", dwIDItem | |
, "Int") | |
} | |
SetSelectedControlItem(dwIDCtl, dwIDItem) { | |
Return, DllCall(This.VTable(25), "UPtr", This.Ptr | |
, "UInt", dwIDCtl | |
, "UInt", dwIDItem | |
, "Int") | |
} | |
StartVisualGroup(dwIDCtl, sLabel) { | |
Return, DllCall(This.VTable(26), "UPtr", This.Ptr | |
, "UInt", dwIDCtl | |
, "WStr", sLabel | |
, "Int") | |
} | |
EndVisualGroup() { | |
Return, DllCall(This.VTable(27), "UPtr", This.Ptr, "Int") | |
} | |
MakeProminent(dwIDCtl) { | |
Return, DllCall(This.VTable(28), "UPtr", This.Ptr | |
, "UInt", dwIDCtl | |
, "Int") | |
} | |
SetControlItemText(dwIDCtl, dwIDItem, sLabel) { | |
Return, DllCall(This.VTable(29), "UPtr", This.Ptr | |
, "UInt", dwIDCtl | |
, "UInt", dwIDItem | |
, "WStr", sLabel | |
, "Int") | |
} | |
} | |
Class IShellItem Extends IUnknown | |
{ | |
; IShellItem interface http://msdn.microsoft.com/library/bb761144 | |
Static CLSID_ShellItem := "{9ac9fbe1-e0a2-4ad6-b4ee-e212013ea917}" | |
, IID_IShellItem := "{43826d1e-e718-42ee-bc55-a1e261c37bfe}" | |
; Methods | |
BindToHandler(pbc, rbhid, riid, ByRef pvOut) { | |
If rbhid Is Not Integer | |
CLSIDFromString(rbhid, BHID), rbhid := &BHID | |
If riid Is Not Integer | |
CLSIDFromString(riid, IID), riid := &IID | |
Return, DllCall(This.VTable(3), "UPtr", This.Ptr | |
, "UPtr", pbc | |
, "UPtr", rbhid | |
, "UPtr", riid | |
, "UPtr*", pvOut | |
, "Int") | |
} | |
GetParent(ByRef psi) { | |
Return, DllCall(This.VTable(4), "UPtr", This.Ptr | |
, "UPtr*", psi | |
, "Int") | |
} | |
GetDisplayName(sigdn, ByRef sName) { | |
hr := DllCall(This.VTable(5), "UPtr", This.Ptr | |
, "UInt", sigdn | |
, "UPtr*", pszName | |
, "Int") | |
, sName := StrGet(pszName, "UTF-16") | |
, CoTaskMemFree(pszName) | |
Return, hr | |
} | |
GetAttributes(sfgaoMask, ByRef sfgaoAttribs) { | |
Return, DllCall(This.VTable(6), "UPtr", This.Ptr | |
, "UInt", sfgaoMask | |
, "UInt*", sfgaoAttribs | |
, "Int") | |
} | |
Compare(psi, hint, ByRef iOrder) { | |
Return, DllCall(This.VTable(7), "UPtr", This.Ptr | |
, "UPtr", psi | |
, "UInt", hint | |
, "Int*", iOrder | |
, "Int") | |
} | |
} | |
Class IShellItemArray Extends IUnknown | |
{ | |
; IShellItemArray interface http://msdn.microsoft.com/library/bb761106 | |
Static IID_IShellItemArray := "{b63ea76d-1f85-456f-a19c-48159efa858b}" | |
; Methods | |
BindToHandler(pbc, rbhid, riid, ByRef pvOut) { | |
If rbhid Is Not Integer | |
CLSIDFromString(rbhid, BHID), rbhid := &BHID | |
If riid Is Not Integer | |
CLSIDFromString(riid, IID), riid := &IID | |
Return, DllCall(This.VTable(3), "UPtr", This.Ptr | |
, "UPtr", pbc | |
, "UPtr", rbhid | |
, "UPtr", riid | |
, "UPtr*", pvOut | |
, "Int") | |
} | |
GetPropertyStore(flags, riid, ByRef pv) { | |
If riid Is Not Integer | |
CLSIDFromString(riid, IID), riid := &IID | |
Return, DllCall(This.VTable(4), "UPtr", This.Ptr | |
, "UInt", flags | |
, "UPtr", riid | |
, "UPtr*", pv | |
, "Int") | |
} | |
GetPropertyDescriptionList(keyType, riid, ByRef pv) { | |
If riid Is Not Integer | |
CLSIDFromString(riid, IID), riid := &IID | |
Return, DllCall(This.VTable(5), "UPtr", This.Ptr | |
, "UPtr", keyType | |
, "UPtr", riid | |
, "UPtr*", pv | |
, "Int") | |
} | |
GetAttributes(dwAttribFlags, sfgaoMask, ByRef sfgaoAttribs) { | |
Return, DllCall(This.VTable(6), "UPtr", This.Ptr | |
, "UInt", dwAttribFlags | |
, "UInt", sfgaoMask | |
, "UInt*", sfgaoAttribs | |
, "Int") | |
} | |
GetCount(ByRef dwNumItems) { | |
Return, DllCall(This.VTable(7), "UPtr", This.Ptr | |
, "UInt*", dwNumItems | |
, "Int") | |
} | |
GetItemAt(dwIndex, ByRef psi) { | |
Return, DllCall(This.VTable(8), "UPtr", This.Ptr | |
, "UInt", dwIndex | |
, "UPtr*", psi | |
, "Int") | |
} | |
EnumItems(ByRef penumShellItems) { | |
Return, DllCall(This.VTable(9), "UPtr", This.Ptr | |
, "UPtr*", penumShellItems | |
, "Int") | |
} | |
} | |
CoTaskMemAlloc(cb) { | |
Return, DllCall("ole32\CoTaskMemAlloc" | |
, "UPtr", cb | |
, "UPtr") | |
} | |
CoTaskMemFree(pv) { | |
Return, DllCall("ole32\CoTaskMemFree" | |
, "UPtr", pv) | |
} | |
GlobalAlloc(uFlags, dwBytes) { | |
Return, DllCall("GlobalAlloc" | |
, "UInt", uFlags | |
, "UPtr", dwBytes | |
, "UPtr") | |
} | |
GlobalFree(hMem) { | |
Return, DllCall("GlobalFree" | |
, "UPtr", hMem | |
, "UPtr") | |
} | |
StringFromCLSID(rclsid, ByRef s) { | |
hr := DllCall("ole32\StringFromCLSID" | |
, "UPtr", rclsid | |
, "UPtr*", lpsz | |
, "Int") | |
, s := StrGet(lpsz, "UTF-16") | |
, CoTaskMemFree(lpsz) | |
Return, hr | |
} | |
CLSIDFromString(s, ByRef clsid) { | |
VarSetCapacity(clsid, 16) | |
Return, DllCall("ole32\CLSIDFromString" | |
, "WStr", s | |
, "UPtr", &clsid | |
, "Int") | |
} | |
SHCreateItemFromParsingName(sPath, pbc, riid, ByRef pv) { | |
If riid Is Not Integer | |
CLSIDFromString(riid, IID), riid := &IID | |
Return, DllCall("shell32\SHCreateItemFromParsingName" | |
, "WStr", sPath | |
, "UPtr", pbc | |
, "UPtr", riid | |
, "UPtr*", pv | |
, "Int") | |
} | |
EventLog(Str) { | |
Row := LV_Add("", A_Hour ":" A_Min ":" A_Sec "." A_MSec, Str) | |
, LV_Modify(Row, "Vis") | |
} | |
DialogEventHandler(Param1 := "", Param2 := "", Param3 := "", Param4 := "") { | |
Critical | |
Static pfde, pfdce, cRef | |
If Not Param1 { | |
If Not A_EventInfo And (Param1 = "") { | |
If Not pfde { | |
If Not pfde := CoTaskMemAlloc(A_PtrSize * 19) | |
Return, False | |
pfdce := pfde + A_PtrSize * 11 | |
VarSetCapacity(cRef, 4, 0) | |
Loop, 2 { | |
lpVtbl := (A_Index = 1 ? pfde : pfdce) + A_PtrSize | |
, Params := A_Index = 1 | |
? "3112322424" ; IFileDialogEventsVtbl | |
: "3114343" ; IFileDialogControlEventsVtbl | |
, NumPut(lpVtbl, (A_Index = 1 ? pfde : pfdce) + 0) | |
Loop, Parse, Params | |
hMem := RegisterCallback("DialogEventHandler" | |
, "" | |
, A_LoopField | |
, A_Index) | |
, NumPut(hMem, lpVtbl + A_PtrSize * (A_Index - 1)) | |
} | |
} | |
Return, ComObjQuery(pfde, IID_IFileDialogEvents) | |
} Else If pfde { | |
Loop, 18 | |
If A_Index <> 11 | |
GlobalFree(NumGet(pfde + A_PtrSize * A_Index)) | |
CoTaskMemFree(pfde), pfde := 0 | |
} | |
} Else If (A_EventInfo = 1) { | |
; QueryInterface(This,riid,ppvObject) | |
If Not Param3 | |
Return, 0x80004003 ; E_POINTER | |
StringFromCLSID(Param2, IID) | |
If (IID = IID_IUnknown Or IID = IID_IFileDialogEvents) { | |
NumPut(pfde, Param3 + 0), ObjAddRef(pfde) | |
Return, 0x00000000 ; S_OK | |
} Else If (IID = IID_IFileDialogControlEvents) { | |
NumPut(pfdce, Param3 + 0), ObjAddRef(pfdce) | |
Return, 0x00000000 ; S_OK | |
} Else { | |
NumPut(0, Param3 + 0) | |
Return, 0x80004002 ; E_NOINTERFACE | |
} | |
} Else If (A_EventInfo = 2) { | |
; AddRef(This) | |
NumPut(NumGet(cRef, "UInt") + 1, cRef, "UInt") | |
Return, NumGet(cRef, "UInt") | |
} Else If (A_EventInfo = 3) { | |
; Release(This) | |
NumPut(NumGet(cRef, "UInt") - 1, cRef, "UInt") | |
If Not NumGet(cRef, "UInt") | |
DialogEventHandler(0) | |
Return, NumGet(cRef, "UInt") | |
} Else If (Param1 = pfde) { | |
; IFileDialogEvents interface http://msdn.microsoft.com/library/bb775876 | |
If (A_EventInfo = 4) { | |
; OnFileOk(This,pfd) | |
EventLog("OnFileOk(" Param1 "," Param2 ")") | |
Return, 0x00000000 | |
} Else If (A_EventInfo = 5) { | |
; OnFolderChanging(This,pfd,psiFolder) | |
EventLog("OnFolderChanging(" Param1 "," Param2 "," Param3 ")") | |
Return, 0x00000000 | |
} Else If (A_EventInfo = 6) { | |
; OnFolderChange(This,pfd) | |
EventLog("OnFolderChange(" Param1 "," Param2 ")") | |
Return, 0x00000000 | |
} Else If (A_EventInfo = 7) { | |
; OnSelectionChange(This,pfd) | |
EventLog("OnSelectionChange(" Param1 "," Param2 ")") | |
Return, 0x00000000 | |
} Else If (A_EventInfo = 8) { | |
; OnShareViolation(This,pfd,psi,pResponse) | |
EventLog("OnShareViolation(" Param1 "," Param2 "," Param3 "," Param4 ")") | |
Return, 0x00000000 | |
} Else If (A_EventInfo = 9) { | |
; OnTypeChange(This,pfd) | |
EventLog("OnTypeChange(" Param1 "," Param2 ")") | |
Return, 0x00000000 | |
} Else If (A_EventInfo = 10) { | |
; OnOverwrite(This,pfd,psi,pResponse) | |
EventLog("OnOverwrite(" Param1 "," Param2 "," Param3 "," Param4 ")") | |
Return, 0x00000000 | |
} | |
} Else If (Param1 = pfdce) { | |
; IFileDialogControlEvents interface http://msdn.microsoft.com/library/bb775936 | |
If (A_EventInfo = 4) { | |
; OnItemSelected(This,pfdc,dwIDCtl,dwIDItem) | |
EventLog("OnItemSelected(" Param1 "," Param2 "," Param3 "," Param4 ")") | |
Return, 0x00000000 | |
} Else If (A_EventInfo = 5) { | |
; OnButtonClicked(This,pfdc,dwIDCtl) | |
EventLog("OnButtonClicked(" Param1 "," Param2 "," Param3 ")") | |
Return, 0x00000000 | |
} Else If (A_EventInfo = 6) { | |
; OnCheckButtonToggled(This,pfdc,dwIDCtl,bChecked) | |
EventLog("OnCheckButtonToggled(" Param1 "," Param2 "," Param3 "," Param4 ")") | |
Return, 0x00000000 | |
} Else If (A_EventInfo = 7) { | |
; OnControlActivating(This,pfdc,dwIDCtl) | |
EventLog("OnControlActivating(" Param1 "," Param2 "," Param3 ")") | |
Return, 0x00000000 | |
} | |
} | |
} | |
GlobalDefine: | |
; CLSIDs | |
Global CLSID_FileOpenDialog := "{DC1C5A9C-E88A-4dde-A5A1-60F82A20AEF7}" | |
, CLSID_FileSaveDialog := "{C0B4E2F3-BA21-4773-8DBA-335EC946EB8B}" | |
, CLSID_ShellItem := "{9ac9fbe1-e0a2-4ad6-b4ee-e212013ea917}" | |
; IIDs | |
Global IID_IUnknown := "{00000000-0000-0000-C000-000000000046}" | |
, IID_IModalWindow := "{b4db1657-70d7-485e-8e3e-6fcb5a5c1802}" | |
, IID_IFileDialog := "{42f85136-db7e-439c-85f1-e4075d135fc8}" | |
, IID_IFileDialog2 := "{61744fc7-85b5-4791-a9b0-272276309b13}" | |
, IID_IFileOpenDialog := "{d57c7288-d4ad-4768-be02-9d969532d960}" | |
, IID_IFileSaveDialog := "{84bccd23-5fde-4cdb-aea4-af64b83d78ab}" | |
, IID_IFileDialogCustomize := "{e6fdd21a-163f-4975-9c8c-a69f1ba37034}" | |
, IID_IFileDialogEvents := "{973510db-7d7f-452b-8975-74a85828d354}" | |
, IID_IFileDialogControlEvents := "{36116642-D713-4b97-9B83-7484A9D00433}" | |
, IID_IShellItem := "{43826d1e-e718-42ee-bc55-a1e261c37bfe}" | |
, IID_IShellItemArray := "{b63ea76d-1f85-456f-a19c-48159efa858b}" | |
; FILEOPENDIALOGOPTIONS enumeration | |
Global FOS_OVERWRITEPROMPT := 0x00000002 | |
, FOS_STRICTFILETYPES := 0x00000004 | |
, FOS_NOCHANGEDIR := 0x00000008 | |
, FOS_PICKFOLDERS := 0x00000020 | |
, FOS_FORCEFILESYSTEM := 0x00000040 | |
, FOS_ALLNONSTORAGEITEMS := 0x00000080 | |
, FOS_NOVALIDATE := 0x00000100 | |
, FOS_ALLOWMULTISELECT := 0x00000200 | |
, FOS_PATHMUSTEXIST := 0x00000800 | |
, FOS_FILEMUSTEXIST := 0x00001000 | |
, FOS_CREATEPROMPT := 0x00002000 | |
, FOS_SHAREAWARE := 0x00004000 | |
, FOS_NOREADONLYRETURN := 0x00008000 | |
, FOS_NOTESTFILECREATE := 0x00010000 | |
, FOS_HIDEMRUPLACES := 0x00020000 | |
, FOS_HIDEPINNEDPLACES := 0x00040000 | |
, FOS_NODEREFERENCELINKS := 0x00100000 | |
, FOS_DONTADDTORECENT := 0x02000000 | |
, FOS_FORCESHOWHIDDEN := 0x10000000 | |
, FOS_DEFAULTNOMINIMODE := 0x20000000 | |
, FOS_FORCEPREVIEWPANEON := 0x40000000 | |
; FDAP enumeration | |
Global FDAP_BOTTOM := 0x00000000 | |
, FDAP_TOP := 0x00000001 | |
; CDCONTROLSTATE enumeration | |
Global CDCS_INACTIVE := 0x00000000 | |
, CDCS_ENABLED := 0x00000001 | |
, CDCS_VISIBLE := 0x00000002 | |
, CDCS_ENABLEDVISIBLE := 0x00000003 | |
; SIGDN enumeration | |
Global SIGDN_NORMALDISPLAY := 0x00000000 | |
, SIGDN_PARENTRELATIVEPARSING := 0x80018001 | |
, SIGDN_DESKTOPABSOLUTEPARSING := 0x80028000 | |
, SIGDN_PARENTRELATIVEEDITING := 0x80031001 | |
, SIGDN_DESKTOPABSOLUTEEDITING := 0x8004c000 | |
, SIGDN_FILESYSPATH := 0x80058000 | |
, SIGDN_URL := 0x80068000 | |
, SIGDN_PARENTRELATIVEFORADDRESSBAR := 0x8007c001 | |
, SIGDN_PARENTRELATIVE := 0x80080001 | |
, SIGDN_PARENTRELATIVEFORUI := 0x80094001 | |
; SFGAO flags | |
Global SFGAO_CANCOPY := 0x00000001 | |
, SFGAO_CANMOVE := 0x00000002 | |
, SFGAO_CANLINK := 0x00000004 | |
, SFGAO_STORAGE := 0x00000008 | |
, SFGAO_CANRENAME := 0x00000010 | |
, SFGAO_CANDELETE := 0x00000020 | |
, SFGAO_HASPROPSHEET := 0x00000040 | |
, SFGAO_DROPTARGET := 0x00000100 | |
, SFGAO_CAPABILITYMASK := 0x00000177 | |
, SFGAO_SYSTEM := 0x00001000 | |
, SFGAO_ENCRYPTED := 0x00002000 | |
, SFGAO_ISSLOW := 0x00004000 | |
, SFGAO_GHOSTED := 0x00008000 | |
, SFGAO_LINK := 0x00010000 | |
, SFGAO_SHARE := 0x00020000 | |
, SFGAO_READONLY := 0x00040000 | |
, SFGAO_HIDDEN := 0x00080000 | |
, SFGAO_DISPLAYATTRMASK := 0x000FC000 | |
, SFGAO_FILESYSANCESTOR := 0x10000000 | |
, SFGAO_FOLDER := 0x20000000 | |
, SFGAO_FILESYSTEM := 0x40000000 | |
, SFGAO_HASSUBFOLDER := 0x80000000 | |
, SFGAO_CONTENTSMASK := 0x80000000 | |
, SFGAO_VALIDATE := 0x01000000 | |
, SFGAO_REMOVABLE := 0x02000000 | |
, SFGAO_COMPRESSED := 0x04000000 | |
, SFGAO_BROWSABLE := 0x08000000 | |
, SFGAO_NONENUMERATED := 0x00100000 | |
, SFGAO_NEWCONTENT := 0x00200000 | |
, SFGAO_CANMONIKER := 0x00400000 | |
, SFGAO_HASSTORAGE := 0x00400000 | |
, SFGAO_STREAM := 0x00400000 | |
, SFGAO_STORAGEANCESTOR := 0x00800000 | |
, SFGAO_STORAGECAPMASK := 0x70C50008 | |
, SFGAO_PKEYSFGAOMASK := 0x81044000 | |
; SICHINTF enumeration | |
Global SICHINT_DISPLAY := 0x00000000 | |
, SICHINT_ALLFIELDS := 0x80000000 | |
, SICHINT_CANONICAL := 0x10000000 | |
, SICHINT_TEST_FILESYSPATH_IF_NOT_EQUAL := 0x20000000 | |
; GETPROPERTYSTOREFLAGS enumeration | |
Global GPS_DEFAULT := 0x00000000 | |
, GPS_HANDLERPROPERTIESONLY := 0x00000001 | |
, GPS_READWRITE := 0x00000002 | |
, GPS_TEMPORARY := 0x00000004 | |
, GPS_FASTPROPERTIESONLY := 0x00000008 | |
, GPS_OPENSLOWITEM := 0x00000010 | |
, GPS_DELAYCREATION := 0x00000020 | |
, GPS_BESTEFFORT := 0x00000040 | |
, GPS_NO_OPLOCK := 0x00000080 | |
, GPS_PREFERQUERYPROPERTIES := 0x00000100 | |
, GPS_MASK_VALID := 0x000001ff | |
; SIATTRIBFLAGS enumeration | |
Global SIATTRIBFLAGS_AND := 0x00000001 | |
, SIATTRIBFLAGS_OR := 0x00000002 | |
, SIATTRIBFLAGS_APPCOMPAT := 0x00000003 | |
, SIATTRIBFLAGS_MASK := 0x00000003 | |
, SIATTRIBFLAGS_ALLITEMS := 0x00004000 | |
; FDE_SHAREVIOLATION_RESPONSE enumeration | |
Global FDESVR_DEFAULT := 0x00000000 | |
, FDESVR_ACCEPT := 0x00000001 | |
, FDESVR_REFUSE := 0x00000002 | |
; FDE_OVERWRITE_RESPONSE enumeration | |
Global FDEOR_DEFAULT := 0x00000000 | |
, FDEOR_ACCEPT := 0x00000001 | |
, FDEOR_REFUSE := 0x00000002 | |
Return |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment