]> Tony Duckles's Git Repositories (git.nynim.org) - autohotkey-scripts.git/commitdiff
Init AutoHotKey master
authorsvn <svn@4ca61c99-ecf1-0310-a92a-a4333d9a229c>
Tue, 12 Jan 2010 22:32:59 +0000 (22:32 +0000)
committersvn <svn@4ca61c99-ecf1-0310-a92a-a4333d9a229c>
Tue, 12 Jan 2010 22:32:59 +0000 (22:32 +0000)
git-svn-id: svn://svn/src/AutoHotKey@856 4ca61c99-ecf1-0310-a92a-a4333d9a229c

AutoHotkey.ahk [new file with mode: 0644]
GmailKeys.ahk [new file with mode: 0644]
Lib/COM.ahk [new file with mode: 0644]
Lib/VA.ahk [new file with mode: 0644]
VolumeOSD.ahk [new file with mode: 0644]
Winamp.ahk [new file with mode: 0644]

diff --git a/AutoHotkey.ahk b/AutoHotkey.ahk
new file mode 100644 (file)
index 0000000..ecf076c
--- /dev/null
@@ -0,0 +1,20 @@
+; IMPORTANT INFO ABOUT GETTING STARTED: Lines that start with a\r
+; semicolon, such as this one, are comments.  They are not executed.\r
+\r
+; This script has a special filename and path because it is automatically\r
+; launched when you run the program directly.  Also, any text file whose\r
+; name ends in .ahk is associated with the program, which means that it\r
+; can be launched simply by double-clicking it.  You can have as many .ahk\r
+; files as you want, located in any folder.  You can also run more than\r
+; one ahk file simultaneously and each will get its own tray icon.\r
+\r
+;#################\r
+;### NOTEPAD++ ###\r
+; Control+Alt+N = Launch/activate Notepad++\r
+^!n::\r
+IfWinExist Notepad++\r
+       WinActivate\r
+else\r
+       Run C:\Program Files\Notepad++\notepad++.exe\r
+return\r
+\r
diff --git a/GmailKeys.ahk b/GmailKeys.ahk
new file mode 100644 (file)
index 0000000..901df85
--- /dev/null
@@ -0,0 +1,82 @@
+;*******************************************************************************\r
+;                                                        Information                                   \r
+;*******************************************************************************\r
+; AutoHotkey Version:  1.x\r
+; Language:                            English\r
+; Platform:                            XP/Vista/7\r
+; Author: Lowell Heddings (How-To Geek)\r
+; URL:         http://lifehacker.com/5175724/add-gmail-shortcuts-to-outlook-with-gmail-keys\r
+; Real Author: Original script by Jayp: http://www.ocellated.com/2009/03/18/pimping-microsoft-outlook/\r
+;\r
+; Script Function: Gmail Keys adds Gmail Shortcut Keys to Outlook\r
+;\r
+;*******************************************************************************\r
+;                                                        Version History                                       \r
+;*******************************************************************************\r
+; 0.1 release - initial set of hotkeys\r
+;*******************************************************************************\r
+\r
+\r
+#NoEnv ; Recommended for performance and compatibility with future AutoHotkey releases.\r
+SendMode Input ; Recommended for new scripts due to its superior speed and reliability.\r
+;#NoTrayIcon\r
+SendMode Input ; superior speed and reliability.\r
+SetTitleMatchMode 2 ;allow partial match to window titles\r
+\r
+  ;********************\r
+  ;Hotkeys for Outlook\r
+  ;********************\r
+\r
+  ;As best I can tell, the window text 'NUIDocumentWindow' is not present \r
+  ;on any other items except the main window. Also, I look for the phrase\r
+  ; ' - Microsoft Outlook' in the title, which will not appear in the title (unless \r
+  ;a user types this string into the subject of a message or task).\r
+  #IfWinActive - Microsoft Outlook ahk_class rctrl_renwnd32, NUIDocumentWindow\r
+       e::HandleOutlookKeys("!.", "e") ;calls archive macro\r
+       f::HandleOutlookKeys("!w", "f") ;forwards message\r
+       r::HandleOutlookKeys("!r", "r") ;replies to message\r
+;      a::HandleOutlookKeys("^+r", "a") ;reply all\r
+       v::HandleOutlookKeys("^+v", "v") ;Move message box\r
+       +u::HandleOutlookKeys("^u", "+u") ;marks messages as unread\r
+       +i::HandleOutlookKeys("^q", "+i") ;marks messages as read\r
+       j::HandleOutlookKeys("!{Down}", "j") ;move down in list\r
+       +j::HandleOutlookKeys("+!{Down}", "+j") ;move down and select next item\r
+       k::HandleOutlookKeys("!{Up}", "k") ;move up\r
+       +k::HandleOutlookKeys("+!{Up}", "+k") ;move up and select next item\r
+       o::HandleOutlookKeys("^o", "o") ;open message\r
+       ;s::HandleOutlookKeys("{Insert}", "s") ;toggle flag (star)\r
+       c::HandleOutlookKeys("^n", "c") ;new message\r
+       /::HandleOutlookKeys("^e", "/") ;focus search box\r
+       .::HandleOutlookKeys("+{F10}", ".") ;Display context menu\r
+    #::HandleOutlookKeys("{Delete}", "#")  ;delete message\r
+    ^g::HandleOutlookKeys("^y", "^g")  ;goto folder\r
+  #IfWinActive\r
+\r
+  ;Passes Outlook a special key combination for custom keystrokes or normal key value, depending on context\r
+  HandleOutlookKeys( specialKey, normalKey ) {\r
+    ;Activates key only on main outlook window, not messages, tasks, contacts, etc. \r
+    IfWinActive, - Microsoft Outlook ahk_class rctrl_renwnd32, NUIDocumentWindow, ,\r
+    {\r
+    \r
+      ;Find out which control in Outlook has focus\r
+      ControlGetFocus, currentCtrl\r
+      ;MsgBox, Control with focus = %currentCtrl%\r
+      \r
+      ;set list of controls that should respond to specialKey. Controls are the list of emails and the main (and minor) controls of the reading pane, including controls when viewing certain attachments.\r
+      ;Currently I handle archiving when viewing attachments of Word, Excel, Powerpoint, Text, jpgs, pdfs\r
+      ;The control 'RichEdit20WPT1' (email subject line) is used extensively for inline editing. Thus it had to be removed. If an email's subject has focus, it won't archive...\r
+      ctrlList = Acrobat Preview Window1,AfxWndW5,AfxWndW6,EXCEL71,MsoCommandBar1,OlkPicturePreviewer1,paneClassDC1, RichEdit20WPT2,RichEdit20WPT4,RichEdit20WPT5,RICHEDIT50W1,SUPERGRID1,_WwG1\r
+      \r
+      if currentCtrl in %ctrlList%\r
+      {\r
+        Send %specialKey%\r
+      ;Allow typing normalKey somewhere else in the main Outlook window. (Like the search field or the folder pane.)\r
+      } else {\r
+        Send %normalKey%\r
+      }\r
+      \r
+    ;Allow typing normalKey in another window type within Outlook, like a mail message, task, appointment, etc.\r
+    } else {\r
+      Send %normalKey%\r
+    }\r
+  }\r
diff --git a/Lib/COM.ahk b/Lib/COM.ahk
new file mode 100644 (file)
index 0000000..0b9a477
--- /dev/null
@@ -0,0 +1,623 @@
+;------------------------------------------------------------------------------\r
+; COM.ahk Standard Library\r
+; by Sean\r
+; http://www.autohotkey.com/forum/topic22923.html\r
+;------------------------------------------------------------------------------\r
+\r
+COM_Init()\r
+{\r
+       Return  DllCall("ole32\OleInitialize", "Uint", 0)\r
+}\r
+\r
+COM_Term()\r
+{\r
+       Return  DllCall("ole32\OleUninitialize")\r
+}\r
+\r
+COM_VTable(ppv, idx)\r
+{\r
+       Return  NumGet(NumGet(1*ppv)+4*idx)\r
+}\r
+\r
+COM_QueryInterface(ppv, IID = "")\r
+{\r
+       If      DllCall(NumGet(NumGet(1*ppv)+0), "Uint", ppv, "Uint", COM_GUID4String(IID,IID ? IID : IID=0 ? "{00000000-0000-0000-C000-000000000046}" : "{00020400-0000-0000-C000-000000000046}"), "UintP", ppv)=0\r
+       Return  ppv\r
+}\r
+\r
+COM_AddRef(ppv)\r
+{\r
+       Return  DllCall(NumGet(NumGet(1*ppv)+4), "Uint", ppv)\r
+}\r
+\r
+COM_Release(ppv)\r
+{\r
+       Return  DllCall(NumGet(NumGet(1*ppv)+8), "Uint", ppv)\r
+}\r
+\r
+COM_QueryService(ppv, SID, IID = "")\r
+{\r
+       DllCall(NumGet(NumGet(1*ppv)+4*0), "Uint", ppv, "Uint", COM_GUID4String(IID_IServiceProvider,"{6D5140C1-7436-11CE-8034-00AA006009FA}"), "UintP", psp)\r
+       DllCall(NumGet(NumGet(1*psp)+4*3), "Uint", psp, "Uint", COM_GUID4String(SID,SID), "Uint", IID ? COM_GUID4String(IID,IID) : &SID, "UintP", ppv:=0)\r
+       DllCall(NumGet(NumGet(1*psp)+4*2), "Uint", psp)\r
+       Return  ppv\r
+}\r
+\r
+COM_FindConnectionPoint(pdp, DIID)\r
+{\r
+       DllCall(NumGet(NumGet(1*pdp)+ 0), "Uint", pdp, "Uint", COM_GUID4String(IID_IConnectionPointContainer, "{B196B284-BAB4-101A-B69C-00AA00341D07}"), "UintP", pcc)\r
+       DllCall(NumGet(NumGet(1*pcc)+16), "Uint", pcc, "Uint", COM_GUID4String(DIID,DIID), "UintP", pcp)\r
+       DllCall(NumGet(NumGet(1*pcc)+ 8), "Uint", pcc)\r
+       Return  pcp\r
+}\r
+\r
+COM_GetConnectionInterface(pcp)\r
+{\r
+       VarSetCapacity(DIID, 16, 0)\r
+       DllCall(NumGet(NumGet(1*pcp)+12), "Uint", pcp, "Uint", &DIID)\r
+       Return  COM_String4GUID(&DIID)\r
+}\r
+\r
+COM_Advise(pcp, psink)\r
+{\r
+       DllCall(NumGet(NumGet(1*pcp)+20), "Uint", pcp, "Uint", psink, "UintP", nCookie)\r
+       Return  nCookie\r
+}\r
+\r
+COM_Unadvise(pcp, nCookie)\r
+{\r
+       Return  DllCall(NumGet(NumGet(1*pcp)+24), "Uint", pcp, "Uint", nCookie)\r
+}\r
+\r
+COM_Enumerate(penum, ByRef Result, ByRef vt = "")\r
+{\r
+       VarSetCapacity(varResult,16,0)\r
+       If (0 = hr:=DllCall(NumGet(NumGet(1*penum)+12), "Uint", penum, "Uint", 1, "Uint", &varResult, "UintP", 0))\r
+               Result:=(vt:=NumGet(varResult,0,"Ushort"))=8||vt<0x1000&&DllCall("oleaut32\VariantChangeTypeEx","Uint",&varResult,"Uint",&varResult,"Uint",LCID,"Ushort",1,"Ushort",8)=0 ? COM_Ansi4Unicode(bstr:=NumGet(varResult,8)) . COM_SysFreeString(bstr) : NumGet(varResult,8)\r
+       Return  hr\r
+}\r
+\r
+COM_Invoke(pdsp,name="",prm0="vT_NoNe",prm1="vT_NoNe",prm2="vT_NoNe",prm3="vT_NoNe",prm4="vT_NoNe",prm5="vT_NoNe",prm6="vT_NoNe",prm7="vT_NoNe",prm8="vT_NoNe",prm9="vT_NoNe")\r
+{\r
+       If      name=\r
+       Return  COM_Release(pdsp)\r
+       If      name contains .\r
+       {\r
+               SubStr(name,1,1)!="." ? name.=".":name:=SubStr(name,2) . ".",COM_AddRef(pdsp)\r
+       Loop,   Parse,  name, .\r
+       {\r
+       If      A_Index=1\r
+       {\r
+               name := A_LoopField\r
+               Continue\r
+       }\r
+       Else If name not contains [,(\r
+               prmn := ""\r
+       Else If InStr("])",SubStr(name,0))\r
+       Loop,   Parse,  name, [(,'")]\r
+       If      A_Index=1\r
+               name := A_LoopField\r
+       Else    prmn := A_LoopField\r
+       Else\r
+       {\r
+               name .= "." . A_LoopField\r
+               Continue\r
+       }\r
+       If      A_LoopField!=\r
+               pdsp:=  COM_Invoke(pdsp,name,prmn!="" ? prmn:"vT_NoNe")+COM_Release(pdsp)*0,name:=A_LoopField\r
+       Else    Return  prmn!="" ? COM_Invoke(pdsp,name,prmn,prm0,prm1,prm2,prm3,prm4,prm5,prm6,prm7,prm8):COM_Invoke(pdsp,name,prm0,prm1,prm2,prm3,prm4,prm5,prm6,prm7,prm8,prm9),COM_Release(pdsp)\r
+       }\r
+       }\r
+       sParams := "0123456789"\r
+       Loop,   Parse,  sParams\r
+               If      (prm%A_LoopField% == "vT_NoNe")\r
+               {\r
+                       sParams := SubStr(sParams,1,A_Index-1)\r
+                       Break\r
+               }\r
+       VarSetCapacity(varg,16*nParams:=StrLen(sParams),0), VarSetCapacity(DispParams,16,0), VarSetCapacity(varResult,32,0), VarSetCapacity(ExcepInfo,32,0)\r
+       Loop,   Parse,  sParams\r
+;              If      prm%A_LoopField%+0=="" || InStr(prm%A_LoopField%,".") || prm%A_LoopField%>=0x80000000 || prm%A_LoopField%<-0x80000000\r
+               If      prm%A_LoopField% is not integer\r
+                       NumPut(COM_SysAllocString(prm%A_LoopField%),NumPut(8,varg,(nParams-A_Index)*16),4)\r
+               Else    NumPut(SubStr(prm%A_LoopField%,1,1)="+" ? 9:prm%A_LoopField%=="-0" ? (prm%A_LoopField%:=0x80020004)*0+10:3,NumPut(prm%A_LoopField%,varg,(nParams-A_Index)*16+8),-12,"Ushort")\r
+       If      nParams\r
+               NumPut(nParams,NumPut(&varg,DispParams),4)\r
+       If      (nvk := SubStr(name,0)="=" ? 12:3)=12\r
+               name := SubStr(name,1,-1),NumPut(1,NumPut(NumPut(-3,varResult,4)-4,DispParams,4),4)\r
+       Global  COM_HR, COM_LR:=""\r
+       If      (COM_HR:=DllCall(NumGet(NumGet(1*pdsp)+20),"Uint",pdsp,"Uint",&varResult+16,"UintP",COM_Unicode4Ansi(wname,name),"Uint",1,"Uint",LCID,"intP",dispID,"Uint"))=0&&(COM_HR:=DllCall(NumGet(NumGet(1*pdsp)+24),"Uint",pdsp,"int",dispID,"Uint",&varResult+16,"Uint",LCID,"Ushort",nvk,"Uint",&DispParams,"Uint",&varResult,"Uint",&ExcepInfo,"Uint",0,"Uint"))!=0&&nParams&&nvk!=12&&(COM_LR:=DllCall(NumGet(NumGet(1*pdsp)+24),"Uint",pdsp,"int",dispID,"Uint",&varResult+16,"Uint",LCID,"Ushort",12,"Uint",NumPut(1,NumPut(NumPut(-3,varResult,4)-4,DispParams,4),4)-16,"Uint",0,"Uint",0,"Uint",0,"Uint"))=0\r
+               COM_HR:=0\r
+       Loop, % nParams\r
+               NumGet(varg,(A_Index-1)*16,"Ushort")=8 ? COM_SysFreeString(NumGet(varg,(A_Index-1)*16+8)) : ""\r
+       Global  COM_VT := NumGet(varResult,0,"Ushort")\r
+       Return  COM_HR=0 ? COM_VT>1 ? COM_VT=8||COM_VT<0x1000&&DllCall("oleaut32\VariantChangeTypeEx","Uint",&varResult,"Uint",&varResult,"Uint",LCID,"Ushort",1,"Ushort",8)=0 ? COM_Ansi4Unicode(bstr:=NumGet(varResult,8)) . COM_SysFreeString(bstr):NumGet(varResult,8):"":COM_Error(COM_HR,COM_LR,&ExcepInfo,name)\r
+}\r
+\r
+COM_Invoke_(pdsp,name,typ0="",prm0="",typ1="",prm1="",typ2="",prm2="",typ3="",prm3="",typ4="",prm4="",typ5="",prm5="",typ6="",prm6="",typ7="",prm7="",typ8="",prm8="",typ9="",prm9="")\r
+{\r
+       If      name contains .\r
+       {\r
+               SubStr(name,1,1)!="." ? name.=".":name:=SubStr(name,2) . ".", COM_AddRef(pdsp)\r
+       Loop,   Parse,  name, .\r
+       {\r
+       If      A_Index=1\r
+       {\r
+               name := A_LoopField\r
+               Continue\r
+       }\r
+       Else If name not contains [,(\r
+               prmn := ""\r
+       Else If InStr("])",SubStr(name,0))\r
+       Loop,   Parse,  name, [(,'")]\r
+       If      A_Index=1\r
+               name := A_LoopField\r
+       Else    prmn := A_LoopField\r
+       Else\r
+       {\r
+               name .= "." . A_LoopField\r
+               Continue\r
+       }\r
+       If      A_LoopField!=\r
+               pdsp:=  COM_Invoke(pdsp,name,prmn!="" ? prmn:"vT_NoNe")+COM_Release(pdsp)*0,name:=A_LoopField\r
+       Else    Return  COM_Invoke_(pdsp,name,typ0,prm0,typ1,prm1,typ2,prm2,typ3,prm3,typ4,prm4,typ5,prm5,typ6,prm6,typ7,prm7,typ8,prm8,typ9,prm9),COM_Release(pdsp)\r
+       }\r
+       }\r
+       sParams := "0123456789"\r
+       Loop,   Parse,  sParams\r
+               If      (typ%A_LoopField% = "")\r
+               {\r
+                       sParams := SubStr(sParams,1,A_Index-1)\r
+                       Break\r
+               }\r
+       VarSetCapacity(varg,16*nParams:=StrLen(sParams),0), VarSetCapacity(DispParams,16,0), VarSetCapacity(varResult,32,0), VarSetCapacity(ExcepInfo,32,0)\r
+       Loop,   Parse,  sParams\r
+               NumPut(typ%A_LoopField%,varg,(nParams-A_Index)*16,"Ushort"),typ%A_LoopField%&0x4000=0 ? NumPut(typ%A_LoopField%=8 ? COM_SysAllocString(prm%A_LoopField%):prm%A_LoopField%,varg,(nParams-A_Index)*16+8,typ%A_LoopField%=5||typ%A_LoopField%=7 ? "double":typ%A_LoopField%=4 ? "float":"int64"):typ%A_LoopField%=0x400C||typ%A_LoopField%=0x400E ? NumPut(prm%A_LoopField%,varg,(nParams-A_Index)*16+8):(VarSetCapacity(_ref_%A_LoopField%,8,0),NumPut(&_ref_%A_LoopField%,varg,(nParams-A_Index)*16+8),NumPut((prmx:=prm%A_LoopField%)&&typ%A_LoopField%=0x4008 ? COM_SysAllocString(%prmx%):%prmx%,_ref_%A_LoopField%,0,typ%A_LoopField%=0x4005||typ%A_LoopField%=0x4007 ? "double":typ%A_LoopField%=0x4004 ? "float":"int64"))\r
+       If      nParams\r
+               NumPut(nParams,NumPut(&varg,DispParams),4)\r
+       If      (nvk := SubStr(name,0)="=" ? 12:3)=12\r
+               name := SubStr(name,1,-1),NumPut(1,NumPut(NumPut(-3,varResult,4)-4,DispParams,4),4)\r
+       Global  COM_HR, COM_LR:=""\r
+       If      (COM_HR:=DllCall(NumGet(NumGet(1*pdsp)+20),"Uint",pdsp,"Uint",&varResult+16,"UintP",COM_Unicode4Ansi(wname,name),"Uint",1,"Uint",LCID,"intP",dispID,"Uint"))=0&&(COM_HR:=DllCall(NumGet(NumGet(1*pdsp)+24),"Uint",pdsp,"int",dispID,"Uint",&varResult+16,"Uint",LCID,"Ushort",nvk,"Uint",&DispParams,"Uint",&varResult,"Uint",&ExcepInfo,"Uint",0,"Uint"))!=0&&nParams&&nvk!=12&&(COM_LR:=DllCall(NumGet(NumGet(1*pdsp)+24),"Uint",pdsp,"int",dispID,"Uint",&varResult+16,"Uint",LCID,"Ushort",12,"Uint",NumPut(1,NumPut(NumPut(-3,varResult,4)-4,DispParams,4),4)-16,"Uint",0,"Uint",0,"Uint",0,"Uint"))=0\r
+               COM_HR:=0\r
+       Loop,   Parse,  sParams\r
+               typ%A_LoopField%&0x4000=0 ? (typ%A_LoopField%=8 ? COM_SysFreeString(NumGet(varg,(nParams-A_Index)*16+8)):""):typ%A_LoopField%=0x400C||typ%A_LoopField%=0x400E ? "":(prmx:=prm%A_LoopField%,%prmx%:=typ%A_LoopField%=0x4008 ? COM_Ansi4Unicode(prmx:=NumGet(_ref_%A_LoopField%)) . COM_SysFreeString(prmx):NumGet(_ref_%A_LoopField%,0,typ%A_LoopField%=0x4005||typ%A_LoopField%=0x4007 ? "double":typ%A_LoopField%=0x4004 ? "float":"int64"))\r
+       Global  COM_VT := NumGet(varResult,0,"Ushort")\r
+       Return  COM_HR=0 ? COM_VT>1 ? COM_VT=8||COM_VT<0x1000&&DllCall("oleaut32\VariantChangeTypeEx","Uint",&varResult,"Uint",&varResult,"Uint",LCID,"Ushort",1,"Ushort",8)=0 ? COM_Ansi4Unicode(bstr:=NumGet(varResult,8)) . COM_SysFreeString(bstr):NumGet(varResult,8):"":COM_Error(COM_HR,COM_LR,&ExcepInfo,name)\r
+}\r
+\r
+COM_DispInterface(this, prm1="", prm2="", prm3="", prm4="", prm5="", prm6="", prm7="", prm8="")\r
+{\r
+       Critical\r
+       If      A_EventInfo = 6\r
+               hr:=DllCall(NumGet(NumGet(0+p:=NumGet(this+8))+28),"Uint",p,"Uint",prm1,"UintP",pname,"Uint",1,"UintP",0), hr==0 ? (VarSetCapacity(sfn,63),DllCall("user32\wsprintfA","str",sfn,"str","%s%S","Uint",this+40,"Uint",pname,"Cdecl"),COM_SysFreeString(pname),%sfn%(prm5,this,prm6)):""\r
+       Else If A_EventInfo = 5\r
+               hr:=DllCall(NumGet(NumGet(0+p:=NumGet(this+8))+40),"Uint",p,"Uint",prm2,"Uint",prm3,"Uint",prm5)\r
+       Else If A_EventInfo = 4\r
+               NumPut(0*hr:=0x80004001,prm3+0)\r
+       Else If A_EventInfo = 3\r
+               NumPut(0,prm1+0)\r
+       Else If A_EventInfo = 2\r
+               NumPut(hr:=NumGet(this+4)-1,this+4)\r
+       Else If A_EventInfo = 1\r
+               NumPut(hr:=NumGet(this+4)+1,this+4)\r
+       Else If A_EventInfo = 0\r
+               COM_IsEqualGUID(this+24,prm1)||InStr("{00020400-0000-0000-C000-000000000046}{00000000-0000-0000-C000-000000000046}",COM_String4GUID(prm1)) ? NumPut(NumPut(NumGet(this+4)+1,this+4)-8,prm2+0):NumPut(0*hr:=0x80004002,prm2+0)\r
+       Return  hr\r
+}\r
+\r
+COM_DispGetParam(pDispParams, Position = 0, vt = 8)\r
+{\r
+       VarSetCapacity(varResult,16,0)\r
+       DllCall("oleaut32\DispGetParam", "Uint", pDispParams, "Uint", Position, "Ushort", vt, "Uint", &varResult, "UintP", nArgErr)\r
+       Return  NumGet(varResult,0,"Ushort")=8 ? COM_Ansi4Unicode(NumGet(varResult,8)) . COM_SysFreeString(NumGet(varResult,8)) : NumGet(varResult,8)\r
+}\r
+\r
+COM_DispSetParam(val, pDispParams, Position = 0, vt = 8)\r
+{\r
+       Return  NumPut(vt=8 ? COM_SysAllocString(val) : val,NumGet(NumGet(pDispParams+0)+(NumGet(pDispParams+8)-Position)*16-8),0,vt=11||vt=2 ? "short" : "int")\r
+}\r
+\r
+COM_Error(hr = "", lr = "", pei = "", name = "")\r
+{\r
+       Static  bDebug:=1\r
+       If Not  pei\r
+       {\r
+       bDebug:=hr\r
+       Global  COM_HR, COM_LR\r
+       Return  COM_HR&&COM_LR ? COM_LR<<32|COM_HR:COM_HR\r
+       }\r
+       Else If !bDebug\r
+       Return\r
+       hr ? (VarSetCapacity(sError,1023),VarSetCapacity(nError,10),DllCall("kernel32\FormatMessageA","Uint",0x1000,"Uint",0,"Uint",hr<>0x80020009 ? hr : (bExcep:=1)*(hr:=NumGet(pei+28)) ? hr : hr:=NumGet(pei+0,0,"Ushort")+0x80040200,"Uint",0,"str",sError,"Uint",1024,"Uint",0),DllCall("user32\wsprintfA","str",nError,"str","0x%08X","Uint",hr,"Cdecl")) : sError:="The COM Object may not be a valid Dispatch Object!`n`tFirst ensure that COM Library has been initialized through COM_Init().`n", lr ? (VarSetCapacity(sError2,1023),VarSetCapacity(nError2,10),DllCall("kernel32\FormatMessageA","Uint",0x1000,"Uint",0,"Uint",lr,"Uint",0,"str",sError2,"Uint",1024,"Uint",0),DllCall("user32\wsprintfA","str",nError2,"str","0x%08X","Uint",lr,"Cdecl")) : ""\r
+       MsgBox, 260, COM Error Notification, % "Function Name:`t""" . name . """`nERROR:`t" . sError . "`t(" . nError . ")" . (bExcep ? SubStr(NumGet(pei+24) ? DllCall(NumGet(pei+24),"Uint",pei) : "",1,0) . "`nPROG:`t" . COM_Ansi4Unicode(NumGet(pei+4)) . COM_SysFreeString(NumGet(pei+4)) . "`nDESC:`t" . COM_Ansi4Unicode(NumGet(pei+8)) . COM_SysFreeString(NumGet(pei+8)) . "`nHELP:`t" . COM_Ansi4Unicode(NumGet(pei+12)) . COM_SysFreeString(NumGet(pei+12)) . "," . NumGet(pei+16) : "") . (lr ? "`n`nERROR2:`t" . sError2 . "`t(" . nError2 . ")" : "") . "`n`nWill Continue?"\r
+       IfMsgBox, No, Exit\r
+}\r
+\r
+COM_CreateIDispatch()\r
+{\r
+       Static  IDispatch\r
+       If Not  VarSetCapacity(IDispatch)\r
+       {\r
+               VarSetCapacity(IDispatch,28,0),   nParams=3112469\r
+               Loop,   Parse,   nParams\r
+               NumPut(RegisterCallback("COM_DispInterface","",A_LoopField,A_Index-1),IDispatch,4*(A_Index-1))\r
+       }\r
+       Return &IDispatch\r
+}\r
+\r
+COM_GetDefaultInterface(pdisp, LCID = 0)\r
+{\r
+       DllCall(NumGet(NumGet(1*pdisp) +12), "Uint", pdisp , "UintP", ctinf)\r
+       If      ctinf\r
+       {\r
+       DllCall(NumGet(NumGet(1*pdisp)+16), "Uint", pdisp, "Uint" , 0, "Uint", LCID, "UintP", ptinf)\r
+       DllCall(NumGet(NumGet(1*ptinf)+12), "Uint", ptinf, "UintP", pattr)\r
+       DllCall(NumGet(NumGet(1*pdisp)+ 0), "Uint", pdisp, "Uint" , pattr, "UintP", ppv)\r
+       DllCall(NumGet(NumGet(1*ptinf)+76), "Uint", ptinf, "Uint" , pattr)\r
+       DllCall(NumGet(NumGet(1*ptinf)+ 8), "Uint", ptinf)\r
+       If      ppv\r
+       DllCall(NumGet(NumGet(1*pdisp)+ 8), "Uint", pdisp),     pdisp := ppv\r
+       }\r
+       Return  pdisp\r
+}\r
+\r
+COM_GetDefaultEvents(pdisp, LCID = 0)\r
+{\r
+       DllCall(NumGet(NumGet(1*pdisp)+16), "Uint", pdisp, "Uint" , 0, "Uint", LCID, "UintP", ptinf)\r
+       DllCall(NumGet(NumGet(1*ptinf)+12), "Uint", ptinf, "UintP", pattr)\r
+       VarSetCapacity(IID,16), DllCall("RtlMoveMemory", "Uint", &IID, "Uint", pattr, "Uint", 16)\r
+       DllCall(NumGet(NumGet(1*ptinf)+76), "Uint", ptinf, "Uint" , pattr)\r
+       DllCall(NumGet(NumGet(1*ptinf)+72), "Uint", ptinf, "UintP", ptlib, "UintP", idx)\r
+       DllCall(NumGet(NumGet(1*ptinf)+ 8), "Uint", ptinf)\r
+       Loop, % DllCall(NumGet(NumGet(1*ptlib)+12), "Uint", ptlib)\r
+       {\r
+               DllCall(NumGet(NumGet(1*ptlib)+20), "Uint", ptlib, "Uint", A_Index-1, "UintP", TKind)\r
+               If      TKind <> 5\r
+                       Continue\r
+               DllCall(NumGet(NumGet(1*ptlib)+16), "Uint", ptlib, "Uint", A_Index-1, "UintP", ptinf)\r
+               DllCall(NumGet(NumGet(1*ptinf)+12), "Uint", ptinf, "UintP", pattr)\r
+               nCount:=NumGet(pattr+48,0,"Ushort")\r
+               DllCall(NumGet(NumGet(1*ptinf)+76), "Uint", ptinf, "Uint" , pattr)\r
+               Loop, % nCount\r
+               {\r
+                       DllCall(NumGet(NumGet(1*ptinf)+36), "Uint", ptinf, "Uint", A_Index-1, "UintP", nFlags)\r
+                       If      !(nFlags & 1)\r
+                               Continue\r
+                       DllCall(NumGet(NumGet(1*ptinf)+32), "Uint", ptinf, "Uint", A_Index-1, "UintP", hRefType)\r
+                       DllCall(NumGet(NumGet(1*ptinf)+56), "Uint", ptinf, "Uint", hRefType , "UintP", prinf)\r
+                       DllCall(NumGet(NumGet(1*prinf)+12), "Uint", prinf, "UintP", pattr)\r
+                       nFlags & 2 ? DIID:=COM_String4GUID(pattr) : bFind:=COM_IsEqualGUID(pattr,&IID)\r
+                       DllCall(NumGet(NumGet(1*prinf)+76), "Uint", prinf, "Uint" , pattr)\r
+                       DllCall(NumGet(NumGet(1*prinf)+ 8), "Uint", prinf)\r
+               }\r
+               DllCall(NumGet(NumGet(1*ptinf)+ 8), "Uint", ptinf)\r
+               If      bFind\r
+                       Break\r
+       }\r
+       DllCall(NumGet(NumGet(1*ptlib)+ 8), "Uint", ptlib)\r
+       Return  bFind ? DIID : "{00000000-0000-0000-0000-000000000000}"\r
+}\r
+\r
+COM_GetGuidOfName(pdisp, Name, LCID = 0)\r
+{\r
+       DllCall(NumGet(NumGet(1*pdisp)+16), "Uint", pdisp, "Uint", 0, "Uint", LCID, "UintP", ptinf)\r
+       DllCall(NumGet(NumGet(1*ptinf)+72), "Uint", ptinf, "UintP", ptlib, "UintP", idx)\r
+       DllCall(NumGet(NumGet(1*ptinf)+ 8), "Uint", ptinf), ptinf:=0\r
+       DllCall(NumGet(NumGet(1*ptlib)+44), "Uint", ptlib, "Uint", COM_Unicode4Ansi(Name,Name), "Uint", 0, "UintP", ptinf, "UintP", memID, "UshortP", 1)\r
+       DllCall(NumGet(NumGet(1*ptlib)+ 8), "Uint", ptlib)\r
+       DllCall(NumGet(NumGet(1*ptinf)+12), "Uint", ptinf, "UintP", pattr)\r
+       GUID := COM_String4GUID(pattr)\r
+       DllCall(NumGet(NumGet(1*ptinf)+76), "Uint", ptinf, "Uint" , pattr)\r
+       DllCall(NumGet(NumGet(1*ptinf)+ 8), "Uint", ptinf)\r
+       Return  GUID\r
+}\r
+\r
+COM_GetTypeInfoOfGuid(pdisp, GUID, LCID = 0)\r
+{\r
+       DllCall(NumGet(NumGet(1*pdisp)+16), "Uint", pdisp, "Uint", 0, "Uint", LCID, "UintP", ptinf)\r
+       DllCall(NumGet(NumGet(1*ptinf)+72), "Uint", ptinf, "UintP", ptlib, "UintP", idx)\r
+       DllCall(NumGet(NumGet(1*ptinf)+ 8), "Uint", ptinf), ptinf := 0\r
+       DllCall(NumGet(NumGet(1*ptlib)+24), "Uint", ptlib, "Uint", COM_GUID4String(GUID,GUID), "UintP", ptinf)\r
+       DllCall(NumGet(NumGet(1*ptlib)+ 8), "Uint", ptlib)\r
+       Return  ptinf\r
+}\r
+\r
+; A Function Name including Prefix is limited to 63 bytes!\r
+COM_ConnectObject(psource, prefix = "", DIID = "")\r
+{\r
+       If Not  DIID\r
+               0+(pconn:=COM_FindConnectionPoint(psource,"{00020400-0000-0000-C000-000000000046}")) ? (DIID:=COM_GetConnectionInterface(pconn))="{00020400-0000-0000-C000-000000000046}" ? DIID:=COM_GetDefaultEvents(psource) : "" : pconn:=COM_FindConnectionPoint(psource,DIID:=COM_GetDefaultEvents(psource))\r
+       Else    pconn:=COM_FindConnectionPoint(psource,SubStr(DIID,1,1)="{" ? DIID : DIID:=COM_GetGuidOfName(psource,DIID))\r
+       If      !pconn || !ptinf:=COM_GetTypeInfoOfGuid(psource,DIID)\r
+       {\r
+               MsgBox, No Event Interface Exists!\r
+               Return\r
+       }\r
+       psink:=COM_CoTaskMemAlloc(40+StrLen(prefix)+1), NumPut(1,NumPut(COM_CreateIDispatch(),psink+0)), NumPut(psource,NumPut(ptinf,psink+8))\r
+       DllCall("RtlMoveMemory", "Uint", psink+24, "Uint", COM_GUID4String(DIID,DIID), "Uint", 16)\r
+       DllCall("RtlMoveMemory", "Uint", psink+40, "Uint", &prefix, "Uint", StrLen(prefix)+1)\r
+       NumPut(COM_Advise(pconn,psink),NumPut(pconn,psink+16))\r
+       Return  psink\r
+}\r
+\r
+COM_DisconnectObject(psink)\r
+{\r
+       Return  COM_Unadvise(NumGet(psink+16),NumGet(psink+20))=0 ? (0,COM_Release(NumGet(psink+16)),COM_Release(NumGet(psink+8)),COM_CoTaskMemFree(psink)) : 1\r
+}\r
+\r
+COM_CreateObject(CLSID, IID = "", CLSCTX = 5)\r
+{\r
+       DllCall("ole32\CoCreateInstance", "Uint", SubStr(CLSID,1,1)="{" ? COM_GUID4String(CLSID,CLSID) : COM_CLSID4ProgID(CLSID,CLSID), "Uint", 0, "Uint", CLSCTX, "Uint", COM_GUID4String(IID,IID ? IID : IID=0 ? "{00000000-0000-0000-C000-000000000046}" : "{00020400-0000-0000-C000-000000000046}"), "UintP", ppv)\r
+       Return  ppv\r
+}\r
+\r
+COM_ActiveXObject(ProgID)\r
+{\r
+       DllCall("ole32\CoCreateInstance", "Uint", SubStr(ProgID,1,1)="{" ? COM_GUID4String(ProgID,ProgID) : COM_CLSID4ProgID(ProgID,ProgID), "Uint", 0, "Uint", 5, "Uint", COM_GUID4String(IID_IDispatch,"{00020400-0000-0000-C000-000000000046}"), "UintP", pdisp)\r
+       Return  COM_GetDefaultInterface(pdisp)\r
+}\r
+\r
+COM_GetObject(Moniker)\r
+{\r
+       DllCall("ole32\CoGetObject", "Uint", COM_Unicode4Ansi(Moniker,Moniker), "Uint", 0, "Uint", COM_GUID4String(IID_IDispatch,"{00020400-0000-0000-C000-000000000046}"), "UintP", pdisp)\r
+       Return  COM_GetDefaultInterface(pdisp)\r
+}\r
+\r
+COM_GetActiveObject(ProgID)\r
+{\r
+       DllCall("oleaut32\GetActiveObject", "Uint", SubStr(ProgID,1,1)="{" ? COM_GUID4String(ProgID,ProgID) : COM_CLSID4ProgID(ProgID,ProgID), "Uint", 0, "UintP", punk)\r
+       DllCall(NumGet(NumGet(1*punk)+0), "Uint", punk, "Uint", COM_GUID4String(IID_IDispatch,"{00020400-0000-0000-C000-000000000046}"), "UintP", pdisp)\r
+       DllCall(NumGet(NumGet(1*punk)+8), "Uint", punk)\r
+       Return  COM_GetDefaultInterface(pdisp)\r
+}\r
+\r
+COM_CLSID4ProgID(ByRef CLSID, ProgID)\r
+{\r
+       VarSetCapacity(CLSID, 16)\r
+       DllCall("ole32\CLSIDFromProgID", "Uint", COM_Unicode4Ansi(ProgID,ProgID), "Uint", &CLSID)\r
+       Return  &CLSID\r
+}\r
+\r
+COM_GUID4String(ByRef CLSID, String)\r
+{\r
+       VarSetCapacity(CLSID, 16)\r
+       DllCall("ole32\CLSIDFromString", "Uint", COM_Unicode4Ansi(String,String,38), "Uint", &CLSID)\r
+       Return  &CLSID\r
+}\r
+\r
+COM_ProgID4CLSID(pCLSID)\r
+{\r
+       DllCall("ole32\ProgIDFromCLSID", "Uint", pCLSID, "UintP", pProgID)\r
+       Return  COM_Ansi4Unicode(pProgID) . COM_CoTaskMemFree(pProgID)\r
+}\r
+\r
+COM_String4GUID(pGUID)\r
+{\r
+       VarSetCapacity(String, 38 * 2 + 1)\r
+       DllCall("ole32\StringFromGUID2", "Uint", pGUID, "Uint", &String, "int", 39)\r
+       Return  COM_Ansi4Unicode(&String, 38)\r
+}\r
+\r
+COM_IsEqualGUID(pGUID1, pGUID2)\r
+{\r
+       Return  DllCall("ole32\IsEqualGUID", "Uint", pGUID1, "Uint", pGUID2)\r
+}\r
+\r
+COM_CoCreateGuid()\r
+{\r
+       VarSetCapacity(GUID, 16, 0)\r
+       DllCall("ole32\CoCreateGuid", "Uint", &GUID)\r
+       Return  COM_String4GUID(&GUID)\r
+}\r
+\r
+COM_CoTaskMemAlloc(cb)\r
+{\r
+       Return  DllCall("ole32\CoTaskMemAlloc", "Uint", cb)\r
+}\r
+\r
+COM_CoTaskMemFree(pv)\r
+{\r
+               DllCall("ole32\CoTaskMemFree", "Uint", pv)\r
+}\r
+\r
+COM_CoInitialize()\r
+{\r
+       Return  DllCall("ole32\CoInitialize", "Uint", 0)\r
+}\r
+\r
+COM_CoUninitialize()\r
+{\r
+               DllCall("ole32\CoUninitialize")\r
+}\r
+\r
+COM_SysAllocString(sString)\r
+{\r
+       Return  DllCall("oleaut32\SysAllocString", "Uint", COM_Ansi2Unicode(sString,wString))\r
+}\r
+\r
+COM_SysFreeString(bstr)\r
+{\r
+               DllCall("oleaut32\SysFreeString", "Uint", bstr)\r
+}\r
+\r
+COM_SysStringLen(bstr)\r
+{\r
+       Return  DllCall("oleaut32\SysStringLen", "Uint", bstr)\r
+}\r
+\r
+COM_SafeArrayDestroy(psa)\r
+{\r
+       Return  DllCall("oleaut32\SafeArrayDestroy", "Uint", psa)\r
+}\r
+\r
+COM_VariantClear(pvarg)\r
+{\r
+       Return  DllCall("oleaut32\VariantClear", "Uint", pvarg)\r
+}\r
+\r
+COM_AccInit()\r
+{\r
+       COM_Init()\r
+       If Not  DllCall("GetModuleHandle", "str", "oleacc")\r
+       Return  DllCall("LoadLibrary", "str", "oleacc")\r
+}\r
+\r
+COM_AccTerm()\r
+{\r
+       COM_Term()\r
+       If h:=  DllCall("GetModuleHandle", "str", "oleacc")\r
+       Return  DllCall("FreeLibrary", "Uint", h)\r
+}\r
+\r
+COM_AccessibleChildren(pacc, cChildren, ByRef varChildren)\r
+{\r
+       VarSetCapacity(varChildren,cChildren*16,0)\r
+       If      DllCall("oleacc\AccessibleChildren", "Uint", pacc, "Uint", 0, "Uint", cChildren+0, "Uint", &varChildren, "UintP", cChildren:=0)=0\r
+       Return  cChildren\r
+}\r
+\r
+COM_AccessibleObjectFromEvent(hWnd, idObject, idChild, ByRef _idChild_="")\r
+{\r
+       VarSetCapacity(varChild,16,0)\r
+       If      DllCall("oleacc\AccessibleObjectFromEvent", "Uint", hWnd, "Uint", idObject, "Uint", idChild, "UintP", pacc, "Uint", &varChild)=0\r
+       Return  pacc, _idChild_:=NumGet(varChild,8)\r
+}\r
+\r
+COM_AccessibleObjectFromPoint(x, y, ByRef _idChild_="")\r
+{\r
+       VarSetCapacity(varChild,16,0)\r
+       If      DllCall("oleacc\AccessibleObjectFromPoint", "int", x, "int", y, "UintP", pacc, "Uint", &varChild)=0\r
+       Return  pacc, _idChild_:=NumGet(varChild,8)\r
+}\r
+\r
+COM_AccessibleObjectFromWindow(hWnd, idObject=-4, IID = "")\r
+{\r
+       If      DllCall("oleacc\AccessibleObjectFromWindow", "Uint", hWnd, "Uint", idObject, "Uint", COM_GUID4String(IID, IID ? IID : idObject&0xFFFFFFFF==0xFFFFFFF0 ? "{00020400-0000-0000-C000-000000000046}":"{618736E0-3C3D-11CF-810C-00AA00389B71}"), "UintP", pacc)=0\r
+       Return  pacc\r
+}\r
+\r
+COM_WindowFromAccessibleObject(pacc)\r
+{\r
+       If      DllCall("oleacc\WindowFromAccessibleObject", "Uint", pacc, "UintP", hWnd)=0\r
+       Return  hWnd\r
+}\r
+\r
+COM_GetRoleText(nRole)\r
+{\r
+       nSize:= DllCall("oleacc\GetRoleTextA", "Uint", nRole, "Uint", 0, "Uint", 0)\r
+       VarSetCapacity(sRole,nSize)\r
+       If      DllCall("oleacc\GetRoleTextA", "Uint", nRole, "str", sRole, "Uint", nSize+1)\r
+       Return  sRole\r
+}\r
+\r
+COM_GetStateText(nState)\r
+{\r
+       nSize:= DllCall("oleacc\GetStateTextA", "Uint", nState, "Uint", 0, "Uint", 0)\r
+       VarSetCapacity(sState,nSize)\r
+       If      DllCall("oleacc\GetStateTextA", "Uint", nState, "str", sState, "Uint", nSize+1)\r
+       Return  sState\r
+}\r
+\r
+COM_AtlAxWinInit(Version = "")\r
+{\r
+       COM_Init()\r
+       If Not  DllCall("GetModuleHandle", "str", "atl" . Version)\r
+               DllCall("LoadLibrary", "str", "atl" . Version)\r
+       Return  DllCall("atl" . Version . "\AtlAxWinInit")\r
+}\r
+\r
+COM_AtlAxWinTerm(Version = "")\r
+{\r
+       COM_Term()\r
+       If h:=  DllCall("GetModuleHandle", "str", "atl" . Version)\r
+       Return  DllCall("FreeLibrary", "Uint", h)\r
+}\r
+\r
+COM_AtlAxAttachControl(pdsp, hWnd, Version = "")\r
+{\r
+       Return  DllCall("atl" . Version . "\AtlAxAttachControl", "Uint", punk:=COM_QueryInterface(pdsp,0), "Uint", hWnd, "Uint", 0), COM_Release(punk)\r
+}\r
+\r
+COM_AtlAxCreateControl(hWnd, Name, Version = "")\r
+{\r
+       If      DllCall("atl" . Version . "\AtlAxCreateControl", "Uint", COM_Unicode4Ansi(Name,Name), "Uint", hWnd, "Uint", 0, "Uint", 0)=0\r
+       Return  COM_AtlAxGetControl(hWnd, Version)\r
+}\r
+\r
+COM_AtlAxGetControl(hWnd, Version = "")\r
+{\r
+       If      DllCall("atl" . Version . "\AtlAxGetControl", "Uint", hWnd, "UintP", punk)=0\r
+               pdsp:=COM_QueryInterface(punk), COM_Release(punk)\r
+       Return  pdsp\r
+}\r
+\r
+COM_AtlAxGetHost(hWnd, Version = "")\r
+{\r
+       If      DllCall("atl" . Version . "\AtlAxGetHost", "Uint", hWnd, "UintP", punk)=0\r
+               pdsp:=COM_QueryInterface(punk), COM_Release(punk)\r
+       Return  pdsp\r
+}\r
+\r
+COM_AtlAxCreateContainer(hWnd, l, t, w, h, Name = "", Version = "")\r
+{\r
+       Return  DllCall("CreateWindowEx", "Uint",0x200, "str", "AtlAxWin" . Version, "Uint", Name ? &Name : 0, "Uint", 0x54000000, "int", l, "int", t, "int", w, "int", h, "Uint", hWnd, "Uint", 0, "Uint", 0, "Uint", 0)\r
+}\r
+\r
+COM_AtlAxGetContainer(pdsp, bCtrl = "")\r
+{\r
+       DllCall(NumGet(NumGet(1*pdsp)+ 0), "Uint", pdsp, "Uint", COM_GUID4String(IID_IOleWindow,"{00000114-0000-0000-C000-000000000046}"), "UintP", pwin)\r
+       DllCall(NumGet(NumGet(1*pwin)+12), "Uint", pwin, "UintP", hCtrl)\r
+       DllCall(NumGet(NumGet(1*pwin)+ 8), "Uint", pwin)\r
+       Return  bCtrl ? hCtrl : DllCall("GetParent", "Uint", hCtrl)\r
+}\r
+\r
+COM_Ansi4Unicode(pString, nSize = "")\r
+{\r
+       If (nSize = "")\r
+           nSize:=DllCall("kernel32\WideCharToMultiByte", "Uint", 0, "Uint", 0, "Uint", pString, "int", -1, "Uint", 0, "int",  0, "Uint", 0, "Uint", 0)\r
+       VarSetCapacity(sString, nSize)\r
+       DllCall("kernel32\WideCharToMultiByte", "Uint", 0, "Uint", 0, "Uint", pString, "int", -1, "str", sString, "int", nSize + 1, "Uint", 0, "Uint", 0)\r
+       Return  sString\r
+}\r
+\r
+COM_Unicode4Ansi(ByRef wString, sString, nSize = "")\r
+{\r
+       If (nSize = "")\r
+           nSize:=DllCall("kernel32\MultiByteToWideChar", "Uint", 0, "Uint", 0, "Uint", &sString, "int", -1, "Uint", 0, "int", 0)\r
+       VarSetCapacity(wString, nSize * 2 + 1)\r
+       DllCall("kernel32\MultiByteToWideChar", "Uint", 0, "Uint", 0, "Uint", &sString, "int", -1, "Uint", &wString, "int", nSize + 1)\r
+       Return  &wString\r
+}\r
+\r
+COM_Ansi2Unicode(ByRef sString, ByRef wString, nSize = "")\r
+{\r
+       If (nSize = "")\r
+           nSize:=DllCall("kernel32\MultiByteToWideChar", "Uint", 0, "Uint", 0, "Uint", &sString, "int", -1, "Uint", 0, "int", 0)\r
+       VarSetCapacity(wString, nSize * 2 + 1)\r
+       DllCall("kernel32\MultiByteToWideChar", "Uint", 0, "Uint", 0, "Uint", &sString, "int", -1, "Uint", &wString, "int", nSize + 1)\r
+       Return  &wString\r
+}\r
+\r
+COM_Unicode2Ansi(ByRef wString, ByRef sString, nSize = "")\r
+{\r
+       pString := wString + 0 > 65535 ? wString : &wString\r
+       If (nSize = "")\r
+           nSize:=DllCall("kernel32\WideCharToMultiByte", "Uint", 0, "Uint", 0, "Uint", pString, "int", -1, "Uint", 0, "int",  0, "Uint", 0, "Uint", 0)\r
+       VarSetCapacity(sString, nSize)\r
+       DllCall("kernel32\WideCharToMultiByte", "Uint", 0, "Uint", 0, "Uint", pString, "int", -1, "str", sString, "int", nSize + 1, "Uint", 0, "Uint", 0)\r
+       Return  &sString\r
+}\r
+\r
+COM_ScriptControl(sCode, sLang = "", bEval = False, sFunc = "", sName = "", pdisp = 0, bGlobal = False)\r
+{\r
+       COM_Init()\r
+       psc  := COM_CreateObject("MSScriptControl.ScriptControl")\r
+               COM_Invoke(psc, "Language", sLang ? sLang : "VBScript")\r
+       sName ? COM_Invoke(psc, "AddObject", sName, "+" . pdisp, bGlobal) : ""\r
+       sFunc ? COM_Invoke(psc, "AddCode", sCode) : ""\r
+       ret  := COM_Invoke(psc, bEval ? "Eval" : "ExecuteStatement", sFunc ? sFunc : sCode)\r
+       COM_Release(psc)\r
+       COM_Term()\r
+       Return  ret\r
+}\r
diff --git a/Lib/VA.ahk b/Lib/VA.ahk
new file mode 100644 (file)
index 0000000..e3c8f8f
--- /dev/null
@@ -0,0 +1,659 @@
+;\r
+; MASTER CONTROLS\r
+;\r
+\r
+VA_GetMasterVolume(channel="", device_desc="playback")\r
+{\r
+    aev := VA_GetAudioEndpointVolume(device_desc)\r
+    if channel =\r
+        VA_IAudioEndpointVolume_GetMasterVolumeLevelScalar(aev, vol)\r
+    else\r
+        VA_IAudioEndpointVolume_GetChannelVolumeLevelScalar(aev, channel-1, vol)\r
+    COM_Release(aev)\r
+    return vol*100\r
+}\r
+\r
+VA_SetMasterVolume(vol, channel="", device_desc="playback")\r
+{\r
+    vol := vol>100 ? 100 : vol<0 ? 0 : vol\r
+    aev := VA_GetAudioEndpointVolume(device_desc)\r
+    if channel =\r
+        VA_IAudioEndpointVolume_SetMasterVolumeLevelScalar(aev, vol/100)\r
+    else\r
+        VA_IAudioEndpointVolume_SetChannelVolumeLevelScalar(aev, channel-1, vol/100)\r
+    COM_Release(aev)\r
+}\r
+\r
+VA_GetMasterChannelCount(device_desc="playback")\r
+{\r
+    aev := VA_GetAudioEndpointVolume(device_desc)\r
+    VA_IAudioEndpointVolume_GetChannelCount(aev, count)\r
+    COM_Release(aev)\r
+    return count\r
+}\r
+\r
+VA_SetMasterMute(mute, device_desc="playback")\r
+{\r
+    aev := VA_GetAudioEndpointVolume(device_desc)\r
+    VA_IAudioEndpointVolume_SetMute(aev, mute)\r
+    COM_Release(aev)\r
+}\r
+\r
+VA_GetMasterMute(device_desc="playback")\r
+{\r
+    aev := VA_GetAudioEndpointVolume(device_desc)\r
+    VA_IAudioEndpointVolume_GetMute(aev, mute)\r
+    COM_Release(aev)\r
+    return mute\r
+}\r
+\r
+;\r
+; SUBUNIT CONTROLS\r
+;\r
+\r
+VA_GetVolume(subunit_desc="1", channel="", device_desc="playback")\r
+{\r
+    avl := VA_GetDeviceSubunit(device_desc, subunit_desc, "{7FB7B48F-531D-44A2-BCB3-5AD5A134B3DC}")\r
+    if !avl\r
+        return\r
+    VA_IPerChannelDbLevel_GetChannelCount(avl, channel_count)\r
+    if channel =\r
+    {\r
+        vol = 0\r
+        \r
+        Loop, %channel_count%\r
+        {\r
+            VA_IPerChannelDbLevel_GetLevelRange(avl, A_Index-1, min_dB, max_dB, step_dB)\r
+            VA_IPerChannelDbLevel_GetLevel(avl, A_Index-1, this_vol)\r
+            this_vol := VA_dB2Scalar(this_vol, min_dB, max_dB)\r
+            \r
+            ; "Speakers Properties" reports the highest channel as the volume.\r
+            if (this_vol > vol)\r
+                vol := this_vol\r
+        }\r
+    }\r
+    else if channel between 1 and channel_count\r
+    {\r
+        channel -= 1\r
+        VA_IPerChannelDbLevel_GetLevelRange(avl, channel, min_dB, max_dB, step_dB)\r
+        VA_IPerChannelDbLevel_GetLevel(avl, channel, vol)\r
+        vol := VA_dB2Scalar(vol, min_dB, max_dB)\r
+    }\r
+    COM_Release(avl)\r
+    return vol\r
+}\r
+\r
+VA_SetVolume(vol, subunit_desc="1", channel="", device_desc="playback")\r
+{\r
+    avl := VA_GetDeviceSubunit(device_desc, subunit_desc, "{7FB7B48F-531D-44A2-BCB3-5AD5A134B3DC}")\r
+    if !avl\r
+        return\r
+    \r
+    vol := vol<0 ? 0 : vol>100 ? 100 : vol\r
+    \r
+    VA_IPerChannelDbLevel_GetChannelCount(avl, channel_count)\r
+    \r
+    if channel =\r
+    {\r
+        ; Simple method -- resets balance to "center":\r
+        ;VA_IPerChannelDbLevel_SetLevelUniform(avl, vol)\r
+        \r
+        vol_max = 0\r
+        \r
+        Loop, %channel_count%\r
+        {\r
+            VA_IPerChannelDbLevel_GetLevelRange(avl, A_Index-1, min_dB, max_dB, step_dB)\r
+            VA_IPerChannelDbLevel_GetLevel(avl, A_Index-1, this_vol)\r
+            this_vol := VA_dB2Scalar(this_vol, min_dB, max_dB)\r
+            \r
+            channel%A_Index%vol := this_vol\r
+            channel%A_Index%min := min_dB\r
+            channel%A_Index%max := max_dB\r
+            \r
+            ; Scale all channels relative to the loudest channel.\r
+            ; (This is how Vista's "Speakers Properties" dialog seems to work.)\r
+            if (this_vol > vol_max)\r
+                vol_max := this_vol\r
+        }\r
+        \r
+        Loop, %channel_count%\r
+        {\r
+            this_vol := channel%A_Index%vol / vol_max * vol\r
+            this_vol := VA_Scalar2dB(this_vol/100, channel%A_Index%min, channel%A_Index%max)            \r
+            VA_IPerChannelDbLevel_SetLevel(avl, A_Index-1, this_vol)\r
+        }\r
+    }\r
+    else if channel between 1 and %channel_count%\r
+    {\r
+        channel -= 1\r
+        VA_IPerChannelDbLevel_GetLevelRange(avl, channel, min_dB, max_dB, step_dB)\r
+        VA_IPerChannelDbLevel_SetLevel(avl, channel, VA_Scalar2dB(vol/100, min_dB, max_dB))\r
+    }\r
+    COM_Release(avl)\r
+}\r
+\r
+VA_GetChannelCount(subunit_desc="1", device_desc="playback")\r
+{\r
+    avl := VA_GetDeviceSubunit(device_desc, subunit_desc, "{7FB7B48F-531D-44A2-BCB3-5AD5A134B3DC}")\r
+    if !avl\r
+        return\r
+    VA_IPerChannelDbLevel_GetChannelCount(avl, channel_count)\r
+    COM_Release(avl)\r
+    return channel_count\r
+}\r
+\r
+VA_SetMute(mute, subunit_desc="1", device_desc="playback")\r
+{\r
+    amute := VA_GetDeviceSubunit(device_desc, subunit_desc, "{DF45AEEA-B74A-4B6B-AFAD-2366B6AA012E}")\r
+    if !amute\r
+        return\r
+    VA_IAudioMute_SetMute(amute, mute)\r
+    COM_Release(amute)\r
+}\r
+\r
+VA_GetMute(subunit_desc="1", device_desc="playback")\r
+{\r
+    amute := VA_GetDeviceSubunit(device_desc, subunit_desc, "{DF45AEEA-B74A-4B6B-AFAD-2366B6AA012E}")\r
+    if !amute\r
+        return\r
+    VA_IAudioMute_GetMute(amute, muted)\r
+    COM_Release(amute)\r
+    return muted\r
+}\r
+\r
+;\r
+; AUDIO METERING\r
+;\r
+\r
+VA_GetAudioMeter(device_desc="playback")\r
+{\r
+    if ! device := VA_GetDevice(device_desc)\r
+        return 0\r
+    VA_IMMDevice_Activate(device, "{C02216F6-8C67-4B5B-9D00-D008E73E0064}", 7, 0, audioMeter)\r
+    return audioMeter\r
+}\r
+\r
+VA_GetDevicePeriod(device_desc, ByRef default_period, ByRef minimum_period="")\r
+{\r
+    defaultPeriod := minimumPeriod := 0\r
+    if ! device := VA_GetDevice(device_desc)\r
+        return false\r
+    VA_IMMDevice_Activate(device, "{1CB9AD4C-DBFA-4c32-B178-C2F568A703B2}", 7, 0, audioClient)\r
+    COM_Release(device)\r
+    ; IAudioClient::GetDevicePeriod\r
+    DllCall(NumGet(NumGet(audioClient+0)+36), "uint",audioClient, "int64*",default_period, "int64*",minimum_period)\r
+    ; Convert 100-nanosecond units to milliseconds.\r
+    default_period /= 10000\r
+    minimum_period /= 10000    \r
+    COM_Release(audioClient)\r
+    return true\r
+}\r
+\r
+\r
+/* IID\r
+    COM_GUID4String(IID_IAudioEndpointVolume,"{5CDF2C82-841E-4546-9722-0CF74078229A}")\r
+    COM_GUID4String(IID_IAudioVolumeLevel,"{7FB7B48F-531D-44A2-BCB3-5AD5A134B3DC}")\r
+    COM_GUID4String(IID_IAudioMute,"{DF45AEEA-B74A-4B6B-AFAD-2366B6AA012E}")\r
+    COM_GUID4String(IID_IAudioAutoGainControl,"{85401FD4-6DE4-4b9d-9869-2D6753A82F3C}")\r
+*/\r
+\r
+VA_GetAudioEndpointVolume(device_desc="playback")\r
+{\r
+    if ! device := VA_GetDevice(device_desc)\r
+        return 0\r
+    VA_IMMDevice_Activate(device, "{5CDF2C82-841E-4546-9722-0CF74078229A}", 7, 0, endpointVolume)\r
+    COM_Release(device)\r
+    return endpointVolume\r
+}\r
+\r
+VA_GetDeviceSubunit(device_desc, subunit_desc, subunit_iid)\r
+{\r
+    device := VA_GetDevice(device_desc)\r
+    if !device\r
+        return 0\r
+    subunit := VA_FindSubunit(device, subunit_desc, subunit_iid)\r
+    COM_Release(device)\r
+    return subunit\r
+}\r
+\r
+VA_FindSubunit(device, target_desc, target_iid)\r
+{\r
+    if target_desc is integer\r
+        target_index := target_desc\r
+    else\r
+        RegExMatch(target_desc, "(?<_name>.*?)(?::(?<_index>\d+))?$", target)\r
+    ; v2.01: Since target_name is now a regular expression, default to case-insensitive mode if no options are specified.\r
+    if !RegExMatch(target_name,"[imsxADJUXPS`n`r`a ]+\)")\r
+        target_name := "i)" target_name\r
+    ; cbinfo:\r
+    ;   @0  target_index\r
+    ;   @4  current_index\r
+    VarSetCapacity(cbinfo, 8, 0)\r
+    NumPut(target_index ? target_index : 1, cbinfo, 0)\r
+    r := VA_EnumSubunits(device, "VA_FindSubunitCallback", target_name, target_iid, &cbinfo)\r
+    DllCall("GlobalFree", "uint", callback)\r
+    return r\r
+}\r
+\r
+VA_FindSubunitCallback(part, interface, prm)\r
+{\r
+    NumPut(index := 1 + NumGet(prm+4), prm+4)\r
+    if NumGet(prm+0) = index\r
+    {\r
+        COM_AddRef(interface)\r
+        return interface\r
+    }\r
+}\r
+\r
+VA_EnumSubunits(device, callback, target_name="", target_iid="", callback_param="")\r
+{\r
+    VA_IMMDevice_Activate(device, "{2A07407E-6497-4A18-9787-32F79BD0D98F}", 7, 0, deviceTopology)\r
+    VA_IDeviceTopology_GetConnector(deviceTopology, 0, conn)\r
+    COM_Release(deviceTopology)\r
+    VA_IConnector_GetConnectedTo(conn, conn_to)\r
+    VA_IConnector_GetDataFlow(conn, data_flow)\r
+    COM_Release(conn)\r
+    if !conn_to\r
+        return ; blank to indicate error\r
+    part := COM_QueryInterface(conn_to, "{AE2DE0E4-5BCA-4F2D-AA46-5D13F8FDB3A9}")\r
+    COM_Release(conn_to)\r
+    r := VA_EnumSubunitsEx(part, data_flow, callback, target_name, target_iid, callback_param)\r
+    COM_Release(part)\r
+    return r ; value returned by callback, or zero.\r
+}\r
+\r
+VA_EnumSubunitsEx(part, data_flow, callback, target_name="", target_iid="", callback_param="")\r
+{\r
+    r := 0\r
+    \r
+    VA_IPart_GetPartType(part, type)\r
+    \r
+    if type = 1 ; Subunit\r
+    {\r
+        VA_IPart_GetName(part, name)\r
+        \r
+        ; v2.01: target_name is now a regular expression.\r
+        if RegExMatch(name, target_name)\r
+        {\r
+            if target_iid =\r
+                r := %callback%(part, 0, callback_param)\r
+            else\r
+                if VA_IPart_Activate(part, 7, target_iid, interface) = 0\r
+                {\r
+                    r := %callback%(part, interface, callback_param)\r
+                    ; The callback is responsible for calling COM_AddRef()\r
+                    ; if it intends to keep the interface pointer.\r
+                    COM_Release(interface)\r
+                }\r
+\r
+            if r\r
+                return r ; early termination\r
+        }\r
+    }\r
+    \r
+    if data_flow = 0\r
+        VA_IPart_EnumPartsIncoming(part, parts)\r
+    else\r
+        VA_IPart_EnumPartsOutgoing(part, parts)\r
+    \r
+    VA_IPartsList_GetCount(parts, count)\r
+    Loop %count%\r
+    {\r
+        VA_IPartsList_GetPart(parts, A_Index-1, subpart)        \r
+        r := VA_EnumSubunitsEx(subpart, data_flow, callback, target_name, target_iid, callback_param)\r
+        COM_Release(subpart)\r
+        if r\r
+            break ; early termination\r
+    }\r
+    COM_Release(parts)\r
+    return r ; continue/finished enumeration\r
+}\r
+\r
+; device_desc = device_id\r
+;               | ( friendly_name | 'playback' | 'capture' ) [ ':' index ]\r
+VA_GetDevice(device_desc="playback")\r
+{\r
+    if ! deviceEnumerator := COM_CreateObject("{BCDE0395-E52F-467C-8E3D-C4579291692E}","{A95664D2-9614-4F35-A746-DE8DB63617E6}")\r
+        return 0\r
+\r
+    device := 0\r
+    \r
+    ; deviceEnumerator->GetDevice(device_id, [out] device)\r
+    if DllCall(NumGet(NumGet(deviceEnumerator+0)+20), "uint",deviceEnumerator, "uint",COM_Unicode4Ansi(wstr, device_desc), "uint*",device) = 0\r
+        goto VA_GetDevice_Return\r
+    \r
+    if device_desc is integer\r
+        m2 := device_desc\r
+    else\r
+        RegExMatch(device_desc, "(.*?)\s*(?::(\d+))?$", m)\r
+    \r
+    if m1 in playback,p\r
+        m1 := "", flow := 0 ; eRender\r
+    else if m1 in capture,c\r
+        m1 := "", flow := 1 ; eCapture\r
+    else if (m1 . m2) = ""  ; no name or number specified\r
+        m1 := "", flow := 0 ; eRender (default)\r
+    else\r
+        flow := 2 ; eAll\r
+    \r
+    if (m1 . m2) = ""   ; no name or number (maybe "playback" or "capture")\r
+    {   ; deviceEnumerator->GetDefaultAudioEndpoint(dataFlow, role, [out] device)\r
+        DllCall(NumGet(NumGet(deviceEnumerator+0)+16), "uint",deviceEnumerator, "uint",flow, "uint",0, "uint*",device)\r
+        goto VA_GetDevice_Return\r
+    }\r
+\r
+    ; deviceEnumerator->EnumAudioEndpoints(dataFlow, stateMask, [out] devices)\r
+    DllCall(NumGet(NumGet(deviceEnumerator+0)+12), "uint",deviceEnumerator, "uint",flow, "uint",1, "uint*",devices)\r
+    \r
+    ; devices->GetCount([out] count)\r
+    DllCall(NumGet(NumGet(devices+0)+12), "uint",devices, "uint*",count)\r
+    \r
+    if m1 =\r
+    {   ; devices->Item(m2-1, [out] device)\r
+        DllCall(NumGet(NumGet(devices+0)+16), "uint",devices, "uint",m2-1, "uint*",device)\r
+        goto VA_GetDevice_Return\r
+    }\r
+    \r
+    index := 0\r
+    Loop % count\r
+        ; devices->Item(A_Index-1, [out] device)\r
+        if DllCall(NumGet(NumGet(devices+0)+16), "uint",devices, "uint",A_Index-1, "uint*",device) = 0\r
+            if InStr(VA_GetDeviceName(device), m1) && (m2 = "" || ++index = m2)\r
+                goto VA_GetDevice_Return\r
+            else\r
+                COM_Release(device), device:=0\r
+\r
+VA_GetDevice_Return:\r
+    COM_Release(deviceEnumerator)\r
+    if devices\r
+        COM_Release(devices)\r
+    \r
+    return device ; may be 0\r
+}\r
+\r
+VA_GetDeviceName(device)\r
+{\r
+    static PKEY_Device_FriendlyName\r
+    if !VarSetCapacity(PKEY_Device_FriendlyName)\r
+        VarSetCapacity(PKEY_Device_FriendlyName, 20)\r
+        ,COM_GUID4String(PKEY_Device_FriendlyName, "{A45C254E-DF1C-4EFD-8020-67D146A850E0}")\r
+        ,NumPut(14, PKEY_Device_FriendlyName, 16)\r
+    VarSetCapacity(prop, 16)\r
+    VA_IMMDevice_OpenPropertyStore(device, 0, store)\r
+    ; store->GetValue(.., [out] prop)\r
+    DllCall(NumGet(NumGet(store+0)+20), "uint",store, "uint",&PKEY_Device_FriendlyName, "uint",&prop)\r
+    COM_Release(store)\r
+    return COM_Ansi4Unicode(NumGet(prop,8)), COM_CoTaskMemFree(NumGet(prop,8))\r
+}\r
+\r
+\r
+VA_dB2Scalar(dB, min_dB, max_dB) {\r
+    min_s := 10**(min_dB/20), max_s := 10**(max_dB/20)\r
+    return ((10**(dB/20))-min_s)/(max_s-min_s)*100\r
+}\r
+\r
+VA_Scalar2dB(s, min_dB, max_dB) {\r
+    min_s := 10**(min_dB/20), max_s := 10**(max_dB/20)\r
+    return log((max_s-min_s)*s+min_s)*20\r
+}\r
+\r
+\r
+;\r
+; INTERFACE WRAPPERS\r
+;   Reference: Core Audio APIs in Windows Vista -- Programming Reference\r
+;       http://msdn2.microsoft.com/en-us/library/ms679156(VS.85).aspx\r
+;\r
+\r
+;\r
+; IMMDevice\r
+;\r
+VA_IMMDevice_Activate(this, iid, ClsCtx, ActivationParams, ByRef Interface) {\r
+    return DllCall(NumGet(NumGet(this+0)+12), "uint", this, "uint", COM_GUID4String(iid,iid), "uint", ClsCtx, "uint", ActivationParams, "uint*", Interface)\r
+}\r
+VA_IMMDevice_OpenPropertyStore(this, Access, ByRef Properties) {\r
+    return DllCall(NumGet(NumGet(this+0)+16), "uint", this, "uint", Access, "uint*", Properties)\r
+}\r
+VA_IMMDevice_GetId(this, ByRef Id) {\r
+    hr := DllCall(NumGet(NumGet(this+0)+20), "uint", this, "uint*", Id)\r
+    Id := (COM_Ansi4Unicode(Id),COM_CoTaskMemFree(Id))\r
+    return hr\r
+}\r
+VA_IMMDevice_GetState(this, ByRef State) {\r
+    return DllCall(NumGet(NumGet(this+0)+24), "uint", this, "uint*", State)\r
+}\r
+\r
+;\r
+; IDeviceTopology\r
+;\r
+VA_IDeviceTopology_GetConnectorCount(this, ByRef Count) {\r
+    return DllCall(NumGet(NumGet(this+0)+12), "uint", this, "uint*", Count)\r
+}\r
+VA_IDeviceTopology_GetConnector(this, Index, ByRef Connector) {\r
+    return DllCall(NumGet(NumGet(this+0)+16), "uint", this, "uint", Index, "uint*", Connector)\r
+}\r
+VA_IDeviceTopology_GetSubunitCount(this, ByRef Count) {\r
+    return DllCall(NumGet(NumGet(this+0)+20), "uint", this, "uint*", Count)\r
+}\r
+VA_IDeviceTopology_GetSubunit(this, Index, ByRef Subunit) {\r
+    return DllCall(NumGet(NumGet(this+0)+24), "uint", this, "uint", Index, "uint*", Subunit)\r
+}\r
+VA_IDeviceTopology_GetPartById(this, Id, ByRef Part) {\r
+    return DllCall(NumGet(NumGet(this+0)+28), "uint", this, "uint", Id, "uint*", Part)\r
+}\r
+VA_IDeviceTopology_GetDeviceId(this, ByRef DeviceId) {\r
+    hr := DllCall(NumGet(NumGet(this+0)+32), "uint", this, "uint*", DeviceId)\r
+    DeviceId := (COM_Ansi4Unicode(DeviceId),COM_CoTaskMemFree(DeviceId))\r
+    return hr\r
+}\r
+VA_IDeviceTopology_GetSignalPath(this, PartFrom, PartTo, RejectMixedPaths, ByRef Parts) {\r
+    return DllCall(NumGet(NumGet(this+0)+36), "uint", this, "uint", PartFrom, "uint", PartTo, "int", RejectMixedPaths, "uint*", Parts)\r
+}\r
+\r
+;\r
+; IConnector\r
+;\r
+VA_IConnector_GetType(this, ByRef Type) {\r
+    return DllCall(NumGet(NumGet(this+0)+12), "uint", this, "int*", Type)\r
+}\r
+VA_IConnector_GetDataFlow(this, ByRef Flow) {\r
+    return DllCall(NumGet(NumGet(this+0)+16), "uint", this, "int*", Flow)\r
+}\r
+VA_IConnector_ConnectTo(this, ConnectTo) {\r
+    return DllCall(NumGet(NumGet(this+0)+20), "uint", this, "uint", ConnectTo)\r
+}\r
+VA_IConnector_Disconnect(this) {\r
+    return DllCall(NumGet(NumGet(this+0)+24), "uint", this)\r
+}\r
+VA_IConnector_IsConnected(this, ByRef Connected) {\r
+    return DllCall(NumGet(NumGet(this+0)+28), "uint", this, "int*", Connected)\r
+}\r
+VA_IConnector_GetConnectedTo(this, ByRef ConTo) {\r
+    return DllCall(NumGet(NumGet(this+0)+32), "uint", this, "uint*", ConTo)\r
+}\r
+VA_IConnector_GetConnectorIdConnectedTo(this, ByRef ConnectorId) {\r
+    hr := DllCall(NumGet(NumGet(this+0)+36), "uint", this, "uint*", ConnectorId)\r
+    ConnectorId := (COM_Ansi4Unicode(ConnectorId),COM_CoTaskMemFree(ConnectorId))\r
+    return hr\r
+}\r
+VA_IConnector_GetDeviceIdConnectedTo(this, ByRef DeviceId) {\r
+    hr := DllCall(NumGet(NumGet(this+0)+40), "uint", this, "uint*", DeviceId)\r
+    DeviceId := (COM_Ansi4Unicode(DeviceId),COM_CoTaskMemFree(DeviceId))\r
+    return hr\r
+}\r
+\r
+;\r
+; IPart\r
+;\r
+VA_IPart_GetName(this, ByRef Name) {\r
+    hr := DllCall(NumGet(NumGet(this+0)+12), "uint", this, "uint*", Name)\r
+    Name := (COM_Ansi4Unicode(Name),COM_CoTaskMemFree(Name))\r
+    return hr\r
+}\r
+VA_IPart_GetLocalId(this, ByRef Id) {\r
+    return DllCall(NumGet(NumGet(this+0)+16), "uint", this, "uint*", Id)\r
+}\r
+VA_IPart_GetGlobalId(this, ByRef GlobalId) {\r
+    hr := DllCall(NumGet(NumGet(this+0)+20), "uint", this, "uint*", GlobalId)\r
+    GlobalId := (COM_Ansi4Unicode(GlobalId),COM_CoTaskMemFree(GlobalId))\r
+    return hr\r
+}\r
+VA_IPart_GetPartType(this, ByRef PartType) {\r
+    return DllCall(NumGet(NumGet(this+0)+24), "uint", this, "int*", PartType)\r
+}\r
+VA_IPart_GetSubType(this, ByRef SubType) {\r
+    VarSetCapacity(SubType,16,0)\r
+    hr := DllCall(NumGet(NumGet(this+0)+28), "uint", this, "uint", &SubType)\r
+    SubType := COM_String4GUID(&SubType)\r
+    return hr\r
+}\r
+VA_IPart_GetControlInterfaceCount(this, ByRef Count) {\r
+    return DllCall(NumGet(NumGet(this+0)+32), "uint", this, "uint*", Count)\r
+}\r
+VA_IPart_GetControlInterface(this, Index, ByRef InterfaceDesc) {\r
+    return DllCall(NumGet(NumGet(this+0)+36), "uint", this, "uint", Index, "uint*", InterfaceDesc)\r
+}\r
+VA_IPart_EnumPartsIncoming(this, ByRef Parts) {\r
+    return DllCall(NumGet(NumGet(this+0)+40), "uint", this, "uint*", Parts)\r
+}\r
+VA_IPart_EnumPartsOutgoing(this, ByRef Parts) {\r
+    return DllCall(NumGet(NumGet(this+0)+44), "uint", this, "uint*", Parts)\r
+}\r
+VA_IPart_GetTopologyObject(this, ByRef Topology) {\r
+    return DllCall(NumGet(NumGet(this+0)+48), "uint", this, "uint*", Topology)\r
+}\r
+VA_IPart_Activate(this, ClsContext, iid, ByRef Object) {\r
+    return DllCall(NumGet(NumGet(this+0)+52), "uint", this, "uint", ClsContext, "uint", COM_GUID4String(iid,iid), "uint*", Object)\r
+}\r
+VA_IPart_RegisterControlChangeCallback(this, iid, Notify) {\r
+    return DllCall(NumGet(NumGet(this+0)+56), "uint", this, "uint", COM_GUID4String(iid,iid), "uint", Notify)\r
+}\r
+VA_IPart_UnregisterControlChangeCallback(this, Notify) {\r
+    return DllCall(NumGet(NumGet(this+0)+60), "uint", this, "uint", Notify)\r
+}\r
+\r
+;\r
+; IPartsList\r
+;\r
+VA_IPartsList_GetCount(this, ByRef Count) {\r
+    return DllCall(NumGet(NumGet(this+0)+12), "uint", this, "uint*", Count)\r
+}\r
+VA_IPartsList_GetPart(this, INdex, ByRef Part) {\r
+    return DllCall(NumGet(NumGet(this+0)+16), "uint", this, "uint", INdex, "uint*", Part)\r
+}\r
+\r
+;\r
+; IAudioEndpointVolume\r
+;\r
+VA_IAudioEndpointVolume_RegisterControlChangeNotify(this, Notify) {\r
+    return DllCall(NumGet(NumGet(this+0)+12), "uint", this, "uint", Notify)\r
+}\r
+VA_IAudioEndpointVolume_UnregisterControlChangeNotify(this, Notify) {\r
+    return DllCall(NumGet(NumGet(this+0)+16), "uint", this, "uint", Notify)\r
+}\r
+VA_IAudioEndpointVolume_GetChannelCount(this, ByRef ChannelCount) {\r
+    return DllCall(NumGet(NumGet(this+0)+20), "uint", this, "uint*", ChannelCount)\r
+}\r
+VA_IAudioEndpointVolume_SetMasterVolumeLevel(this, LevelDB, GuidEventContext="") {\r
+    return DllCall(NumGet(NumGet(this+0)+24), "uint", this, "float", LevelDB, "uint", GuidEventContext ? COM_GUID4String(GuidEventContext,GuidEventContext) : 0)\r
+}\r
+VA_IAudioEndpointVolume_SetMasterVolumeLevelScalar(this, Level, GuidEventContext="") {\r
+    return DllCall(NumGet(NumGet(this+0)+28), "uint", this, "float", Level, "uint", GuidEventContext ? COM_GUID4String(GuidEventContext,GuidEventContext) : 0)\r
+}\r
+VA_IAudioEndpointVolume_GetMasterVolumeLevel(this, ByRef LevelDB) {\r
+    return DllCall(NumGet(NumGet(this+0)+32), "uint", this, "float*", LevelDB)\r
+}\r
+VA_IAudioEndpointVolume_GetMasterVolumeLevelScalar(this, ByRef Level) {\r
+    return DllCall(NumGet(NumGet(this+0)+36), "uint", this, "float*", Level)\r
+}\r
+VA_IAudioEndpointVolume_SetChannelVolumeLevel(this, Channel, LevelDB, GuidEventContext="") {\r
+    return DllCall(NumGet(NumGet(this+0)+40), "uint", this, "uint", Channel, "float", LevelDB, "uint", GuidEventContext ? COM_GUID4String(GuidEventContext,GuidEventContext) : 0)\r
+}\r
+VA_IAudioEndpointVolume_SetChannelVolumeLevelScalar(this, Channel, Level, GuidEventContext="") {\r
+    return DllCall(NumGet(NumGet(this+0)+44), "uint", this, "uint", Channel, "float", Level, "uint", GuidEventContext ? COM_GUID4String(GuidEventContext,GuidEventContext) : 0)\r
+}\r
+VA_IAudioEndpointVolume_GetChannelVolumeLevel(this, Channel, ByRef LevelDB) {\r
+    return DllCall(NumGet(NumGet(this+0)+48), "uint", this, "uint", Channel, "float*", LevelDB)\r
+}\r
+VA_IAudioEndpointVolume_GetChannelVolumeLevelScalar(this, Channel, ByRef Level) {\r
+    return DllCall(NumGet(NumGet(this+0)+52), "uint", this, "uint", Channel, "float*", Level)\r
+}\r
+VA_IAudioEndpointVolume_SetMute(this, Mute, GuidEventContext="") {\r
+    return DllCall(NumGet(NumGet(this+0)+56), "uint", this, "int", Mute, "uint", GuidEventContext ? COM_GUID4String(GuidEventContext,GuidEventContext) : 0)\r
+}\r
+VA_IAudioEndpointVolume_GetMute(this, ByRef Mute) {\r
+    return DllCall(NumGet(NumGet(this+0)+60), "uint", this, "int*", Mute)\r
+}\r
+VA_IAudioEndpointVolume_GetVolumeStepInfo(this, ByRef Step, ByRef StepCount) {\r
+    return DllCall(NumGet(NumGet(this+0)+64), "uint", this, "uint*", Step, "uint*", StepCount)\r
+}\r
+VA_IAudioEndpointVolume_VolumeStepUp(this, GuidEventContext="") {\r
+    return DllCall(NumGet(NumGet(this+0)+68), "uint", this, "uint", GuidEventContext ? COM_GUID4String(GuidEventContext,GuidEventContext) : 0)\r
+}\r
+VA_IAudioEndpointVolume_VolumeStepDown(this, GuidEventContext="") {\r
+    return DllCall(NumGet(NumGet(this+0)+72), "uint", this, "uint", GuidEventContext ? COM_GUID4String(GuidEventContext,GuidEventContext) : 0)\r
+}\r
+VA_IAudioEndpointVolume_QueryHardwareSupport(this, ByRef HardwareSupportMask) {\r
+    return DllCall(NumGet(NumGet(this+0)+76), "uint", this, "uint*", HardwareSupportMask)\r
+}\r
+VA_IAudioEndpointVolume_GetVolumeRange(this, ByRef MinDB, ByRef MaxDB, ByRef IncrementDB) {\r
+    return DllCall(NumGet(NumGet(this+0)+80), "uint", this, "float*", MinDB, "float*", MaxDB, "float*", IncrementDB)\r
+}\r
+\r
+;\r
+; IPerChannelDbLevel\r
+;   Applies to IAudioVolumeLevel, IAudioBass, IAudioMidrange and IAudioTreble.\r
+;\r
+VA_IPerChannelDbLevel_GetChannelCount(this, ByRef Channels) {\r
+    return DllCall(NumGet(NumGet(this+0)+12), "uint", this, "uint*", Channels)\r
+}\r
+VA_IPerChannelDbLevel_GetLevelRange(this, Channel, ByRef MinLevelDB, ByRef MaxLevelDB, ByRef Stepping) {\r
+    return DllCall(NumGet(NumGet(this+0)+16), "uint", this, "uint", Channel, "float*", MinLevelDB, "float*", MaxLevelDB, "float*", Stepping)\r
+}\r
+VA_IPerChannelDbLevel_GetLevel(this, Channel, ByRef LevelDB) {\r
+    return DllCall(NumGet(NumGet(this+0)+20), "uint", this, "uint", Channel, "float*", LevelDB)\r
+}\r
+VA_IPerChannelDbLevel_SetLevel(this, Channel, LevelDB, GuidEventContext="") {\r
+    return DllCall(NumGet(NumGet(this+0)+24), "uint", this, "uint", Channel, "float", LevelDB, "uint", GuidEventContext ? COM_GUID4String(GuidEventContext,GuidEventContext) : 0)\r
+}\r
+VA_IPerChannelDbLevel_SetLevelUniform(this, LevelDB, GuidEventContext="") {\r
+    return DllCall(NumGet(NumGet(this+0)+28), "uint", this, "float", LevelDB, "uint", GuidEventContext ? COM_GUID4String(GuidEventContext,GuidEventContext) : 0)\r
+}\r
+VA_IPerChannelDbLevel_SetLevelAllChannels(this, LevelsDB, ChannelCount, GuidEventContext="") {\r
+    return DllCall(NumGet(NumGet(this+0)+32), "uint", this, "uint", LevelsDB, "uint", ChannelCount, "uint", GuidEventContext ? COM_GUID4String(GuidEventContext,GuidEventContext) : 0)\r
+}\r
+\r
+;\r
+; IAudioMute\r
+;\r
+VA_IAudioMute_SetMute(this, Muted, GuidEventContext="") {\r
+    return DllCall(NumGet(NumGet(this+0)+12), "uint", this, "int", Muted, "uint", GuidEventContext ? COM_GUID4String(GuidEventContext,GuidEventContext) : 0)\r
+}\r
+VA_IAudioMute_GetMute(this, ByRef Muted) {\r
+    return DllCall(NumGet(NumGet(this+0)+16), "uint", this, "int*", Muted)\r
+}\r
+\r
+;\r
+; IAudioAutoGainControl\r
+;\r
+VA_IAudioAutoGainControl_GetEnabled(this, ByRef Enabled) {\r
+    return DllCall(NumGet(NumGet(this+0)+12), "uint", this, "int*", Enabled)\r
+}\r
+VA_IAudioAutoGainControl_SetEnabled(this, Enable, GuidEventContext="") {\r
+    return DllCall(NumGet(NumGet(this+0)+16), "uint", this, "int", Enable, "uint", GuidEventContext ? COM_GUID4String(GuidEventContext,GuidEventContext) : 0)\r
+}\r
+\r
+;\r
+; IAudioMeterInformation\r
+;\r
+VA_IAudioMeterInformation_GetPeakValue(this, ByRef Peak) {\r
+    return DllCall(NumGet(NumGet(this+0)+12), "uint", this, "float*", Peak)\r
+}\r
+VA_IAudioMeterInformation_GetMeteringChannelCount(this, ByRef ChannelCount) {\r
+    return DllCall(NumGet(NumGet(this+0)+16), "uint", this, "uint*", ChannelCount)\r
+}\r
+VA_IAudioMeterInformation_GetChannelsPeakValues(this, ChannelCount, PeakValues) {\r
+    return DllCall(NumGet(NumGet(this+0)+20), "uint", this, "uint", ChannelCount, "uint", PeakValues)\r
+}\r
+VA_IAudioMeterInformation_QueryHardwareSupport(this, ByRef HardwareSupportMask) {\r
+    return DllCall(NumGet(NumGet(this+0)+24), "uint", this, "uint*", HardwareSupportMask)\r
+}\r
diff --git a/VolumeOSD.ahk b/VolumeOSD.ahk
new file mode 100644 (file)
index 0000000..ab83276
--- /dev/null
@@ -0,0 +1,107 @@
+; Volume On-Screen-Display (OSD) -- by Rajat\r
+; http://www.autohotkey.com\r
+; This script assigns hotkeys of your choice to raise and lower the\r
+; master and/or wave volume.  Both volumes are displayed as different\r
+; color bar graphs.\r
+\r
+;_________________________________________________ \r
+;_______User Settings_____________________________ \r
+\r
+; Make customisation only in this area or hotkey area only!!\r
+\r
+; The percentage by which to raise or lower the volume each time:\r
+vol_Step = 4\r
+\r
+; How long to display the volume level bar graphs:\r
+vol_DisplayTime = 2000\r
+\r
+; Master Volume Bar color (see the help file to use more\r
+; precise shades):\r
+vol_CBM = Lime\r
+\r
+; Background color; for transparent, set to 111111\r
+vol_CW = 111111\r
+\r
+; Bar's screen position.  Use -1 to center the bar in that dimension:\r
+vol_PosX = -1\r
+vol_PosY = 600\r
+vol_Width = 400  ; width of bar\r
+vol_Thick = 20   ; thickness of bar\r
+\r
+; If your keyboard has multimedia buttons for Volume, you can\r
+; try changing the below hotkeys to use them by specifying\r
+; Volume_Up, ^Volume_Up, Volume_Down, and ^Volume_Down:\r
+;HotKey, Volume_Up, vol_MasterUp\r
+;HotKey, Volume_Down, vol_MasterDown\r
+\r
+HotKey, #Up, vol_MasterUp        ; Win+UpArrow\r
+HotKey, #Down, vol_MasterDown\r
+HotKey, ^!Up, vol_MasterUp       ; Ctrl+Alt+UpArrow\r
+HotKey, ^!Down, vol_MasterDown\r
+\r
+\r
+;___________________________________________\r
+;_____Auto Execute Section__________________\r
+\r
+; DON'T CHANGE ANYTHING HERE (unless you know what you're doing).\r
+\r
+COM_Init()\r
+\r
+vol_BarOptionsMaster = 1 ZH%vol_Thick% ZX0 ZY0 W%vol_Width% CB%vol_CBM% CW%vol_CW%\r
+;vol_BarOptionsMaster = 1 ZH%vol_Thick% ZX0 ZY0 W%vol_Width%\r
+\r
+; If the X position has been specified, add it to the options.\r
+; Otherwise, omit it to center the bar horizontally:\r
+if vol_PosX >= 0\r
+{\r
+    vol_BarOptionsMaster = %vol_BarOptionsMaster% X%vol_PosX%\r
+}\r
+\r
+; If the Y position has been specified, add it to the options.\r
+; Otherwise, omit it to have it calculated later:\r
+if vol_PosY >= 0\r
+{\r
+    vol_BarOptionsMaster = %vol_BarOptionsMaster% Y%vol_PosY%\r
+}\r
+\r
+#SingleInstance\r
+SetBatchLines, 10ms\r
+Return\r
+\r
+\r
+;___________________________________________\r
+\r
+vol_MasterUp:\r
+vol_tmp := VA_GetMasterVolume()\r
+vol_Master := (vol_tmp + vol_Step)\r
+VA_SetMasterVolume(vol_Master)\r
+Gosub, vol_ShowBars\r
+return\r
+\r
+vol_MasterDown:\r
+vol_tmp := VA_GetMasterVolume()\r
+vol_Master := (vol_tmp - vol_Step)\r
+VA_SetMasterVolume(vol_Master)\r
+Gosub, vol_ShowBars\r
+return\r
+\r
+vol_ShowBars:\r
+; To prevent the "flashing" effect, only create the bar window if it\r
+; doesn't already exist:\r
+IfWinNotExist, vol_Progress\r
+{\r
+    ; Calculate position here in case screen resolution changes while\r
+    ; the script is running:\r
+    Progress, %vol_BarOptionsMaster%, , , vol_Progress\r
+    ;WinSet, TransColor, 111111, vol_Progress\r
+}\r
+; Get the volume in case the user or an external program changed them:\r
+vol_Master := VA_GetMasterVolume()\r
+Progress, 1:%vol_Master%\r
+SetTimer, vol_BarOff, %vol_DisplayTime%\r
+return\r
+\r
+vol_BarOff:\r
+SetTimer, vol_BarOff, off\r
+Progress, 1:Off\r
+return
\ No newline at end of file
diff --git a/Winamp.ahk b/Winamp.ahk
new file mode 100644 (file)
index 0000000..c83b282
--- /dev/null
@@ -0,0 +1,85 @@
+;##############
+;### WINAMP ###
+; http://www.autohotkey.com/docs/misc/Winamp.htm
+; http://www.autohotkey.com/forum/topic155.html
+; http://www.autohotkey.com/forum/topic126.html
+; Ctrl+Alt+Z/X/C/V/B/Up/Down/Left/Right = Control Winamp
+^!z::
+IfWinNotExist ahk_class Winamp v1.x
+  return
+; Otherwise, the above has set the "last found" window for use below.
+;ControlSend, ahk_parent, z  ; Previous Track 
+PostMessage, 0x111, 40044, , ,ahk_class Winamp v1.x  ; Previous Track
+return
+
+^!x::
+IfWinNotExist ahk_class Winamp v1.x
+  return
+; Otherwise, the above has set the "last found" window for use below.
+;ControlSend, ahk_parent, x  ; Play/Restart/UnPause
+PostMessage, 0x111, 40045, , ,ahk_class Winamp v1.x  ; Play/Restart/UnPause
+return
+
+^!c::
+IfWinNotExist ahk_class Winamp v1.x
+  return
+; Otherwise, the above has set the "last found" window for use below.
+;ControlSend, ahk_parent, c  ; Pause/UnPause
+PostMessage, 0x111, 40046, , ,ahk_class Winamp v1.x  ; Pause/UnPause
+return
+
+^!v::
+IfWinNotExist ahk_class Winamp v1.x
+  return
+; Otherwise, the above has set the "last found" window for use below.
+;ControlSend, ahk_parent, v  ; Stop
+PostMessage, 0x111, 40047, , ,ahk_class Winamp v1.x  ; Stop
+return
+
+^!b::
+IfWinNotExist ahk_class Winamp v1.x
+  return
+; Otherwise, the above has set the "last found" window for use below.
+;ControlSend, ahk_parent, b  ; Next Track
+PostMessage, 0x111, 40048, , ,ahk_class Winamp v1.x  ; Next Track
+return
+
+;^!Up::
+;IfWinNotExist ahk_class Winamp v1.x
+;  return
+;; Otherwise, the above has set the "last found" window for use below.
+;;ControlSend, ahk_parent, b  ; Next Track
+;PostMessage, 0x111, 40058 , , ,ahk_class Winamp v1.x  ; Raise Volume
+;PostMessage, 0x111, 40058 , , ,ahk_class Winamp v1.x  ; Raise Volume
+;PostMessage, 0x111, 40058 , , ,ahk_class Winamp v1.x  ; Raise Volume
+;PostMessage, 0x111, 40058 , , ,ahk_class Winamp v1.x  ; Raise Volume
+;PostMessage, 0x111, 40058 , , ,ahk_class Winamp v1.x  ; Raise Volume
+;return
+
+;^!Down::
+;IfWinNotExist ahk_class Winamp v1.x
+;  return
+;; Otherwise, the above has set the "last found" window for use below.
+;;ControlSend, ahk_parent, b  ; Next Track
+;PostMessage, 0x111, 40059 , , ,ahk_class Winamp v1.x  ; Lower Volume
+;PostMessage, 0x111, 40059 , , ,ahk_class Winamp v1.x  ; Lower Volume
+;PostMessage, 0x111, 40059 , , ,ahk_class Winamp v1.x  ; Lower Volume
+;PostMessage, 0x111, 40059 , , ,ahk_class Winamp v1.x  ; Lower Volume
+;PostMessage, 0x111, 40059 , , ,ahk_class Winamp v1.x  ; Lower Volume
+;return
+
+^!Left::
+IfWinNotExist ahk_class Winamp v1.x
+  return
+; Otherwise, the above has set the "last found" window for use below.
+;ControlSend, ahk_parent, z  ; Previous Track 
+PostMessage, 0x111, 40044, , ,ahk_class Winamp v1.x  ; Previous Track
+return
+
+^!Right::
+IfWinNotExist ahk_class Winamp v1.x
+  return
+; Otherwise, the above has set the "last found" window for use below.
+;ControlSend, ahk_parent, b  ; Next Track
+PostMessage, 0x111, 40048, , ,ahk_class Winamp v1.x  ; Next Track
+return