Skip to content

Instantly share code, notes, and snippets.

@BiggerDigger
Last active June 17, 2019 03:09
Show Gist options
  • Star 2 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save BiggerDigger/6925cb7a6c4d2263867e to your computer and use it in GitHub Desktop.
Save BiggerDigger/6925cb7a6c4d2263867e to your computer and use it in GitHub Desktop.
#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