Тема: AHK: Захват и структурирование заметок
Предназначен для быстрого занесения текстовок разного рода, вместе с заголовком и адресом окна-источника (IE, Opera, Firefox, Word, CHM-Справка и некоторые другие, кроме страниц, оформленных фреймами), в HTML-документ «QNotes», упорядочивающий их по вкладкам в зависимости от выбора.
Сочетание Ctrl + N
— одно нажатие, — вывести окно скрипта с существующими разделами (вкладками) файла «QNotes» и добавить выделенный/скопированный или набранный в контроле Edit текст в один из нужных;
— двойное нажатие, — добавить текст напрямую (без вывода окна GUI) в таб, выбиравшийся в последний раз;
— тройное, — открыть файл заметок (с помощью IE, — ибо Opera и FF затрудняются с открытием chm-содержащих ссылок).
Имеется возможность быстрого поиска по всем вкладкам, — двойной клик в поисковом input-окне (файла «QNotes») осуществит сброс поиска, двойной клик в пределах окна документа подготовит input-окно к вводу с клавиатуры.
Добавить/убавить количество разделов можно в местах, обозначенных в скрипте такими манерами:
/* ... */
<!-- ... -->
; ...
#NoEnv
#SingleInstance,Force
SendMode Input
SetBatchLines,-1
MyIco=%A_ScriptDir%\notes.ico
IfNotExist %MyIco%
{
Gosub, CrtIco
WriteFile("notes.ico",Ico)
IconFile = %MyIco%
}
Else
IconFile = %MyIco%
Menu, Tray, Icon, %IconFile%
^SC31:: ;Ctrl + N
++counter
SetTimer, Choice, -400
return
Choice:
if A_ThisHotkey = ^SC31 ;Ctrl + N
{
IfEqual, counter, 1, Gosub, QNotesGui
IfEqual, counter, 2, Gosub, QNotesAddLast
IfEqual, counter, 3, Gosub, QNotesRun
}
counter =
Return
QNotesInstall:
IfNotExist, %A_ScriptDir%\QNotes.html
{
FileAppend,
(LTrim
<HTML>`n<HEAD>`n<TITLE>[QNotes]</TITLE>
<META http-equiv="Content-Type" content="text/html; charset=windows-1251"/>
<STYLE type="text/css">`n<!--
*html {BACKGROUND:url(null.png) fixed; FONT: 13px/1.5 "Trebuchet MS", Tahoma, Arial;
MARGIN:0 0 24px 0; PADDING-TOP:24px; BORDER:none;}
div#tabs {HEIGHT:24px; LINE-HEIGHT:20px; WIDTH:100`%; BACKGROUND-COLOR:#FFFFF1;
POSITION:fixed; TOP:0; LEFT:0; Z-INDEX:1; //POSITION:absolute;
TOP:expression(document.getElementsByTagName( 'body' )[0].scrollTop + "px");}
#elements {MARGIN:0 0 0 6`%;}`nul {FLOAT:right;}`n* html div#tabs {MARGIN:0;}
div#tabs a {COLOR:#004b4b;}
div#tabs dd {FLOAT:left; /*CLEAR:right;*/ MARGIN-RIGHT:1px; DISPLAY:inline;}
div#tabs dd a {//WIDTH:70px; TEXT-ALIGN:center; DISPLAY:block;
PADDING:0 13px 1px; MARGIN-BOTTOM:-1px; CURSOR:pointer; BACKGROUND:#D3E0CF; /*F5F5EA*/
BORDER:1px solid #AAC1AF; BORDER-BOTTOM:1px solid #DDD; POSITION:relative;
/*BORDER:solid 1px; BORDER-COLOR:#238 #238 #238 #238;*/}
* html div#tabs dd a {FLOAT:left;}`n*+html div#tabs dd a {FLOAT:left;}
div#tabs dd a:hover {COLOR:#F70; BACKGROUND:#FFFFDF; BORDER:1px solid #FFCA95;}
div#tabs dd a.current:hover, div#tabs a.current {COLOR:#00384a; BACKGROUND:#BBCCBB;
PADDING:0px 13px 2px; BORDER:1px solid #BBCCBB;}`n#elements .tab{DISPLAY:none;}
#elements.t1 .t1,#elements.t2 .t2,#elements.t3 .t3,#elements.t4 .t4,#elements.t5 .t5,
#elements.t6 .t6,#elements.t7 .t7,#elements.t8 .t8 /* ... */ {DISPLAY:block;}`n
a:link,a:focus,a:hover,a:visited {TEXT-DECORATION:none;}`na:link {COLOR:#990000;}
a:hover {COLOR:blue;}`na:visited {COLOR:#990099;}`n
div.curvy {POSITION:relative; WIDTH:100`%; COLOR:#000; BACKGROUND:#BBCCBB; /* AAC1AF 9CAF9C */
MARGIN:0 0 25px 0; PADDING:10px 0px 18px 0px; FONT-FAMILY:monospace;}`n
#ctl, #cbl, #ctr, #cbr {POSITION:absolute; WIDTH:20px; HEIGHT:20px;
COLOR:#BBCCBB; BACKGROUND:#FFFFF1; OVERFLOW:hidden; FONT-STYLE:normal; Z-INDEX:1;}
* html #cbl, #cbr {MARGIN-BOTTOM:-1px; HEIGHT:21px;} /* only for IE */
#ctr, #cbr {WIDTH:0px;}`n#ctl {TOP:0; LEFT:0;}`n#cbl {BOTTOM:0; LEFT:0;}
#ctr {TOP:0; RIGHT:0;}`n#cbr {BOTTOM:0; RIGHT:0;}
div.curvy em b {POSITION:absolute; FONT-SIZE:150px; FONT-FAMILY:Arial;
COLOR:#BBCCBB; LINE-HEIGHT:40px; FONT-WEIGHT:normal;}`n#ctl b {LEFT:-8px;}
#ctr b {LEFT:-25px;}`n#cbl b {LEFT:-8px; TOP:-17px;}`n#cbr b {LEFT:-25px; TOP:-17px;}`n
div.numb {FONT-SIZE:30`%; COLOR:#808080;}
td.quot1, .quot2 {COLOR:#004a4a; FONT-FAMILY:serif; FONT-SIZE:190`%; FONT-WEIGHT:bold;}
td.quot1 {PADDING:0 0 0 4`%;}`n/*td.quot2 {PADDING:0 0 0 0;}*/
td.note {LINE-HEIGHT:1.15em; PADDING:1.4em 0 0 4`%; FONT-SIZE:14px; COLOR:#00384a;}
font#dt {COLOR:#728776;}`ndiv#url {/*TEXT-TRANSFORM:uppercase; LETTER-SPACING:1pt;*/
FONT-WEIGHT:bold; COLOR:#990000; /* 55642E C5E2E2 */
FONT-FAMILY:Tahoma; MARGIN-LEFT:20`%; TEXT-ALIGN:left;
FONT-SIZE:7.5pt; BORDER-BOTTOM:1px solid #728776;}`n
#searchbox {WIDTH:220px; HEIGHT:22px; LINE-HEIGHT:18px; BORDER:1px #728776 solid;
BACKGROUND-COLOR:#FFFFF1;}`n.hidden {DISPLAY:none; POSITION:absolute;}
-->`n</STYLE>`n
<SCRIPT type="text/javascript">`n<!--
var keyTimerId=0;
function prevEle(e){do{e=e.previousSibling} while(e && e.nodeType != 1); return e};
function nextEle(e){do{e=e.nextSibling} while(e && e.nodeType != 1); return e};
function isVisible(e){var rows=e.rows; for(var i=0, r; r=rows[i];
i++){if(!r.className || r.className == 'visible')return true}};
function find(){var div, tb, h; var val=document.getElementById('searchbox').value.toLowerCase();
var lnks=document.getElementsByTagName('span');
for(var i=0, li; li=lnks[i]; i++){div=li.parentNode.parentNode;
div.className=((li.textContent || li.innerText).toLowerCase().indexOf(val) != -1) ? 'visible' : 'hidden';
if(!nextEle(div)){tb=div.parentNode.parentNode; h=prevEle(tb);
if(isVisible(tb)){tb.className='visible'; h.className='visible';tb.parentNode.className='curvy';}
else{tb.className='hidden'; h.className='hidden';tb.parentNode.className='hidden';};}}};
function addInfo(text){var fieldRef;if(fieldRef=document.getElementById('searchbox'))
{fieldRef.value = text;find()}return false;`n}
function I(){`ndocument.write('<div class="curvy">');
document.write('<em id="ctl"><b>•</b></em><em id="cbl"><b>•</b></em>');
document.write('<em id="ctr"><b>•</b></em><em id="cbr"><b>•</b></em>');
document.write('<table border="0" cellpadding="0" cellspacing="0" width="100`%"><tr valign=top>');
document.write('<td width="12`%" align="right">');
document.write('<noindex><div class="numb" align="right">#</div></noindex>');
document.write('</td>');`ndocument.write('<span>');`n}`nfunction II(){
document.write('<td width="4`%" align="right" class="quot1">«</td>');
document.write('<td width="60`%" class="note">');`n}
function III(){`ndocument.write('</td>');`ndocument.write('</span>');
document.write('<td width="24`%" valign="bottom" class="quot2">»</td>');
document.write('</tr></table>');`ndocument.write('</div>');`n}
function CrtTabs(){`nvar a = document.getElementById('tabs').getElementsByTagName('a');
for(i = 0; i < a.length; i++){ a[i].onclick = function(){ for(j = 0; j < a.length; j++){
a[j].className = a[j].className.replace(" current", ""); } this.className += " current";
document.getElementById('elements').className = this.rel; return false; } } }
window.onload = CrtTabs`n//-->`n</SCRIPT>`n</HEAD>`n
<BODY bgcolor=#FFFFF1 onDblClick="document.getElementById('searchbox').focus()">`n
<DIV id="tabs">`n<UL>
<DD class="t1"><a href="#" rel="t1" class=" current">Всякое</a></DD>
<DD class="t2"><a href="#" rel="t2">Memori</a></DD>
<DD class="t3"><a href="#" rel="t3">Цитаты</a></DD>
<DD class="t4"><a href="#" rel="t4">Ссылки</a></DD>
<DD class="t5"><a href="#" rel="t5">Инфо</a></DD>
<DD class="t6"><a href="#" rel="t6">Отжиг</a></DD>
<DD class="t7" title="Закладки"><a href="#" rel="t7">Ляссе</a></DD>
<DD class="t8" title="Сегодня мыслей не было..."><a href="#" rel="t8">Мысли)</a></DD>
<!-- ... -->`n
<DD><INPUT type="text" value="Быстрый поиск" id="searchbox"
onfocus="if(this.value==this.defaultValue)this.value='';"
onblur="if(!this.value)this.value=this.defaultValue;"
onkeyup="clearTimeout(keyTimerId);keyTimerId=setTimeout('find()',500);"
onDblClick="return addInfo('');"></DD>
</UL>`n</DIV>`n<DIV id="elements" class="t1">`n`n`n
), %A_ScriptDir%\QNotes.html
}
Return
QNotesGui:
f_ClipSaved := ClipboardAll
Send, {Ctrl Down}{SC02E}{Ctrl UP} ;c выделенное
Sleep, 200 ; в буфер
Gosub, Get_ExePath_FilePath_CurrentWin
IfWinExist, ahk_id %ID1%
Gosub, 1GuiClose
Gui,1:+LastFound +AlwaysOnTop -Caption -Border +Owner +OwnDialogs
Gui,1: Color,000000,323232
Gui,1: font,cFFFFFF,
WinGet, ID1
Gui,1: Add, Text, gWinMove x0 y0 w220 h9 ;+0x5
Gui,1: Add, Edit, x8 y10 w204 h64 vCurrText ,
Gui,1: Add, ListView, -Hdr -E0x200 -Multi Background323232 cD0D0D0 x3 y78 w209 h130 vSelItem HScroll gQNotesChecks AltSubmit count4000,Name
LV_Add( "", "Всякое" ) ;LV_Add( "", 1, "Всякое" )
LV_Add( "", "Memori" )
LV_Add( "", "Цитаты" )
LV_Add( "", "Ссылки" )
LV_Add( "", "Инфо" )
LV_Add( "", "Отжиг" )
LV_Add( "", "Ляссе" )
LV_Add( "", "Мысли)" )
; ...
CoordMode, Mouse, Screen
MouseMove, (A_ScreenWidth/2), (A_ScreenHeight/2)
Gui,1: Show, h210 w220, QNotesWin
ControlFocus, Edit1, QNotesWin
ControlGetText, CurrText, Edit1, QNotesWin
Return
1GuiClose:
Gui,1:Destroy
Return
WinMove:
PostMessage, WM_NCLBUTTONDOWN := 0xA1, HTCAPTION := 2
Return
QNotesChecks:
If A_GuiEvent = Normal
{
LV_GetText(RowText, A_EventInfo) ;MsgBox, Строка: %A_EventInfo%. Текст: "%RowText%"
Gui,1:Submit, Hide
Gosub, QNotesInstall
Gosub, QNotesAdd
Gui,1:Destroy
}
Return
QNotesAdd:
FormatTime DT,,dd.MM.yy, h:mm:ss
CoordMode, ToolTip, Screen
ToolTip, `n %RowText% :-| `n,300,300
Sleep, 230
SoundPlay, %A_WinDir%\Media\ding.wav
IfInString RowText, Всякое
ttab = tab t1
IfInString RowText, Memori
ttab = tab t2
IfInString RowText, Цитаты
ttab = tab t3
IfInString RowText, Ссылки
ttab = tab t4
IfInString RowText, Инфо
ttab = tab t5
IfInString RowText, Отжиг
ttab = tab t6
IfInString RowText, Ляссе
ttab = tab t7
IfInString RowText, Мысли)
ttab = tab t8
; ...
Gosub, my_Spec_ActiveWins
If CurrentWin = ; если заголовок окна пуст, то...
CurrentWin = ?Title?
If File_Path = ; если переменная File_Path ПУСТА, то...
{
If WinEdit ; если Edit НАЙДЕН, то...
{
Note_Path=%WinEdit%
CurrentWin=+%CurrentWin%
}
Else ; если Edit НЕ найден, то...
{
Note_Path=%Exe_Path%
CurrentWin=++%CurrentWin%
}
}
Else ; если переменная File_Path НЕ пуста, то...
{
If WinEdit = ; если Edit НЕ найден, то...
Note_Path=%File_Path%
Else ; если Edit НАЙДЕН, то...
{
;;IfInString,File_Path,/ ; на случай если командные штучки при нем sic!Space
;;{
;; Note_Path=%WinEdit%
;;}
;;Else
{
Note_Path=%File_Path%
CurrentWin=*%CurrentWin%
}
}
}
if CurrText =
Str = %Clipboard%
else
Str = %CurrText%
StringReplace, Str, Str, %A_Space%%A_Space%%A_Space%,  `; `; `;, All
StringReplace, Str, Str, %A_Space%%A_Space%,  `; `;, All
StringReplace, Str, Str, `r`n%A_Space%, `r`n `;, All
StringReplace, Str, Str, <, <`;, All
StringReplace, Str, Str, >, >`;, All
StringReplace, Str, Str, `n, <br>, All
if GetKeyState("Ctrl","p")
{
FileAppend,
(LTrim
<div class="%ttab%">`n<script>I()</script>`n<script>II()</script>
%Str%`n<script>III()</script>`n</div>`n`n
), %A_ScriptDir%\QNotes.html
}
else if CurrText =
{
FileAppend,
(LTrim
<div class="%ttab%">`n<script>I()</script>
<div id="url"><a target=_blank href="%Note_Path%">%CurrentWin%</a> <font id="dt">- %DT%</font></div>
<script>II()</script>`n%Str%`n<script>III()</script>`n</div>`n`n
), %A_ScriptDir%\QNotes.html
}
else
{
FileAppend,
(LTrim
<div class="%ttab%">`n<script>I()</script>`n<script>II()</script>`n
%Str%`n<script>III()</script>`n</div>`n`n
), %A_ScriptDir%\QNotes.html
}
Clipboard := f_ClipSaved
f_ClipSaved =
ToolTip, `n %RowText% :-) `n,300,300
Sleep, 110
ToolTip, `n %RowText% `;-) `n,300,300
Sleep, 400
ToolTip
Return
QNotesAddLast:
If Not RowText
Return
f_ClipSaved := ClipboardAll
Send, {Ctrl Down}{SC02E}{Ctrl UP} ;c выделенное
Sleep, 200 ; в буфер
Gosub, Get_ExePath_FilePath_CurrentWin
Gosub, QNotesInstall
Gosub, QNotesAdd
Return
QNotesRun:
Run, iexplore.exe %A_ScriptDir%\QNotes.html, , Max UseErrorLevel
WinWait, [QNotes],, 2
{
WinWaitActive, [QNotes],,
Sleep, 900
Send, {End 5}
}
If ErrorLevel
Return
Return
#IfWinActive, QNotesWin
WheelUp::
Up::
TotalRows:=LV_GetCount()
PresentRow:=LV_GetNext()
NewRow:=PresentRow - 1
if (NewRow < 1)
NewRow:=TotalRows + NewRow
LV_Modify(NewRow,"+Focus +Select Vis")
Return
WheelDown::
Down::
TotalRows:=LV_GetCount()
PresentRow:=LV_GetNext()
NewRow:=PresentRow + 1
if (NewRow > TotalRows)
NewRow:=NewRow - TotalRows
LV_Modify(NewRow,"+Focus +Select Vis")
Return
#IfWinActive
my_Spec_ActiveWins:
If WinActive("ahk_class HH Parent")
{
ControlGet, hWnd, hWnd, , Internet Explorer_Server1, ahk_class HH Parent
Gosub, GetChmTitlePath
CurrentWin = %CurrentWin% / %ttlName%
File_Path = %pthValue%
}
If WinActive("ahk_class IEFrame")
|| WinActive("ahk_class Maxthon2_Frame")
|| WinActive("Paranoia Browser")
{
CurrentWin = %ttlName%
}
If WinActive("ahk_class MozillaUIWindowClass") || WinActive("ahk_class OpWindow")
{
StringSplit, FF_Op_Ttl, sData,`n
FF_Op_Ttl = %FF_Op_Ttl2% ; заголовок
CurrentWin = %FF_Op_Ttl%
StringReplace, CurrentWin, CurrentWin, `\`", `", All
}
If WinActive("ahk_class OpWindow")
{
StringReplace, CurrentWin, CurrentWin, Opera `- `[,, All
StringTrimRight, CurrentWin, CurrentWin, 1
}
Return
GetChmTitlePath:
;see COM.ahk Standard Library by Sean http://www.autohotkey.com/forum/topic22923.html
;from: Capture Text from Read Only List
;ControlGet, hwnd, hwnd, , , ...
;MouseGetPos,,,, hWnd, 3
COM_AccInit()
If pacc := COM_AccessibleObjectFromWindow(hWnd)
{
Loop, % COM_AccessibleChildren(pacc, COM_Invoke(pacc,"accChildCount"), varChildren)
If paccChild:=NumGet(varChildren,16*A_Index-8)
ttlName :=COM_Invoke(paccChild,"accName",0)
pthValue :=COM_Invoke(paccChild,"accValue",0)
, COM_Release(paccChild)
COM_Release(pacc)
}
COM_AccTerm()
If WinActive("ahk_class OpusApp") ; Word
{
COM_Init()
Word := COM_GetActiveObject("Word.Application")
ActiveDocument := com_invoke(Word,"ActiveDocument")
pthValue := COM_Invoke(ActiveDocument, "Path") . "\" . COM_Invoke(ActiveDocument, "Name")
}
Return
;------------------------------------------------------------------------------
; COM.ahk Standard Library !FRAGMENT!
; by Sean
; http://www.autohotkey.com/forum/topic22923.html
;------------------------------------------------------------------------------
COM_Init()
{
Return DllCall("ole32\OleInitialize", "Uint", 0)
}
COM_AccInit()
{
COM_Init()
If Not DllCall("GetModuleHandle", "str", "oleacc")
Return DllCall("LoadLibrary", "str", "oleacc")
}
COM_AccessibleObjectFromWindow(hWnd, idObject=-4, IID = "")
{
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
Return pacc
}
COM_GUID4String(ByRef CLSID, String)
{
VarSetCapacity(CLSID, 16)
DllCall("ole32\CLSIDFromString", "Uint", COM_SysString(String,String), "Uint", &CLSID)
Return &CLSID
}
COM_SysString(ByRef wString, sString)
{
VarSetCapacity(wString,3+2*nLen:=1+StrLen(sString))
Return NumPut(DllCall("kernel32\MultiByteToWideChar","Uint",0,"Uint",0,"Uint",&sString,"int",nLen,"Uint",&wString+4,"int",nLen,"Uint")*2-2,wString)
}
COM_AccessibleChildren(pacc, cChildren, ByRef varChildren)
{
VarSetCapacity(varChildren,cChildren*16,0)
If DllCall("oleacc\AccessibleChildren", "Uint", pacc, "Uint", 0, "Uint", cChildren+0, "Uint", &varChildren, "UintP", cChildren:=0)=0
Return cChildren
}
COM_AddRef(ppv)
{
Return DllCall(NumGet(NumGet(1*ppv)+4), "Uint", ppv)
}
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")
{
If name=
Return COM_Release(pdsp)
If name contains .
{
SubStr(name,1,1)!="." ? name.=".":name:=SubStr(name,2) . ".",COM_AddRef(pdsp)
Loop, Parse, name, .
{
If A_Index=1
{
name := A_LoopField
Continue
}
Else If name not contains [,(
prmn := ""
Else If InStr("])",SubStr(name,0))
Loop, Parse, name, [(,'")]
If A_Index=1
name := A_LoopField
Else prmn := A_LoopField
Else
{
name .= "." . A_LoopField
Continue
}
If A_LoopField!=
pdsp:= COM_Invoke(pdsp,name,prmn!="" ? prmn:"vT_NoNe")+COM_Release(pdsp)*0,name:=A_LoopField
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)
}
}
sParams := "0123456789"
Loop, Parse, sParams
If (prm%A_LoopField% == "vT_NoNe")
{
sParams := SubStr(sParams,1,A_Index-1)
Break
}
VarSetCapacity(varg,16*nParams:=StrLen(sParams),0), VarSetCapacity(DispParams,16,0), VarSetCapacity(varResult,32,0), VarSetCapacity(ExcepInfo,32,0)
Loop, Parse, sParams
; If prm%A_LoopField%+0=="" || InStr(prm%A_LoopField%,".") || prm%A_LoopField%>=0x80000000 || prm%A_LoopField%<-0x80000000
If prm%A_LoopField% is not integer
NumPut(COM_SysString(prm%A_LoopField%,prm%A_LoopField%),NumPut(8,varg,(nParams-A_Index)*16),4)
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")
If nParams
NumPut(nParams,NumPut(&varg,DispParams),4)
If (nvk := SubStr(name,0)="=" ? 12:3)=12
name := SubStr(name,1,-1),NumPut(1,NumPut(NumPut(-3,varResult,4)-4,DispParams,4),4)
Global COM_HR, COM_LR:=""
If (COM_HR:=DllCall(NumGet(NumGet(1*pdsp)+20),"Uint",pdsp,"Uint",&varResult+16,"UintP",COM_SysString(wname,name),"Uint",1,"Uint",1024,"intP",dispID,"Uint"))=0&&(COM_HR:=DllCall(NumGet(NumGet(1*pdsp)+24),"Uint",pdsp,"int",dispID,"Uint",&varResult+16,"Uint",1024,"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",1024,"Ushort",12,"Uint",NumPut(1,NumPut(NumPut(-3,varResult,4)-4,DispParams,4),4)-16,"Uint",0,"Uint",0,"Uint",0,"Uint"))=0
COM_HR:=0
Global COM_VT := NumGet(varResult,0,"Ushort")
Return COM_HR=0 ? COM_VT>1 ? COM_VT=9||COM_VT=13 ? NumGet(varResult,8):COM_VT=8||COM_VT<0x1000&&COM_VariantChangeType(&varResult,&varResult)=0 ? COM_Ansi4Unicode(NumGet(varResult,8)) . COM_VariantClear(&varResult):NumGet(varResult,8):"":COM_Error(COM_HR,COM_LR,&ExcepInfo,name)
}
COM_Error(hr = "", lr = "", pei = "", name = "")
{
Static bDebug:=1
If Not pei
{
bDebug:=hr
Global COM_HR, COM_LR
Return COM_HR&&COM_LR ? COM_LR<<32|COM_HR:COM_HR
}
Else If !bDebug
Return
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")) : ""
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?"
IfMsgBox, No, Exit
}
COM_Ansi4Unicode(pString, nSize = "")
{
If (nSize = "")
nSize:=DllCall("kernel32\WideCharToMultiByte", "Uint", 0, "Uint", 0, "Uint", pString, "int", -1, "Uint", 0, "int", 0, "Uint", 0, "Uint", 0)
VarSetCapacity(sString, nSize)
DllCall("kernel32\WideCharToMultiByte", "Uint", 0, "Uint", 0, "Uint", pString, "int", -1, "str", sString, "int", nSize + 1, "Uint", 0, "Uint", 0)
Return sString
}
COM_SysFreeString(bstr)
{
DllCall("oleaut32\SysFreeString", "Uint", bstr)
}
COM_VariantChangeType(pvarDst, pvarSrc, vt = 8)
{
Return DllCall("oleaut32\VariantChangeTypeEx", "Uint", pvarDst, "Uint", pvarSrc, "Uint", 1024, "Ushort", 0, "Ushort", vt)
}
COM_VariantClear(pvar)
{
DllCall("oleaut32\VariantClear", "Uint", pvar)
}
COM_Release(ppv)
{
Return DllCall(NumGet(NumGet(1*ppv)+8), "Uint", ppv)
}
COM_AccTerm()
{
COM_Term()
If h:= DllCall("GetModuleHandle", "str", "oleacc")
Return DllCall("FreeLibrary", "Uint", h)
}
COM_Term()
{
Return DllCall("ole32\OleUninitialize")
}
COM_GetDefaultInterface(pdisp)
{
DllCall(NumGet(NumGet(1*pdisp) +12), "Uint", pdisp , "UintP", ctinf)
If ctinf
{
DllCall(NumGet(NumGet(1*pdisp)+16), "Uint", pdisp, "Uint" , 0, "Uint", 1024, "UintP", ptinf)
DllCall(NumGet(NumGet(1*ptinf)+12), "Uint", ptinf, "UintP", pattr)
DllCall(NumGet(NumGet(1*pdisp)+ 0), "Uint", pdisp, "Uint" , pattr, "UintP", ppv)
DllCall(NumGet(NumGet(1*ptinf)+76), "Uint", ptinf, "Uint" , pattr)
DllCall(NumGet(NumGet(1*ptinf)+ 8), "Uint", ptinf)
If ppv
DllCall(NumGet(NumGet(1*pdisp)+ 8), "Uint", pdisp), pdisp := ppv
}
Return pdisp
}
COM_GetActiveObject(ProgID)
{
DllCall("oleaut32\GetActiveObject", "Uint", SubStr(ProgID,1,1)="{" ? COM_GUID4String(ProgID,ProgID) : COM_CLSID4ProgID(ProgID,ProgID), "Uint", 0, "UintP", punk)
DllCall(NumGet(NumGet(1*punk)+0), "Uint", punk, "Uint", COM_GUID4String(IID_IDispatch,"{00020400-0000-0000-C000-000000000046}"), "UintP", pdisp)
DllCall(NumGet(NumGet(1*punk)+8), "Uint", punk)
Return COM_GetDefaultInterface(pdisp)
}
COM_CLSID4ProgID(ByRef CLSID, ProgID)
{
VarSetCapacity(CLSID, 16)
DllCall("ole32\CLSIDFromProgID", "Uint", COM_SysString(ProgID,ProgID), "Uint", &CLSID)
Return &CLSID
}
COM_SysStringLen(bstr)
{
Return DllCall("oleaut32\SysStringLen", "Uint", bstr)
}
;------------------------------------------------------------------------------
; END COM.ahk Standard Library !FRAGMENT!
;------------------------------------------------------------------------------
Get_ExePath_FilePath_CurrentWin:
;mk:@MSITStore:D:\SCRIPTS\script-coding14.chm::/web/viewtopicf546.html
;------------------------------------------------------
WinGetActiveTitle, CurrentWin
WinGet, PID_Target, PID, % "ahk_id " WinExist("A")
Exe_Path := GetModuleFileNameEx( PID_Target )
;;SetTitleMatchMode, Slow
;;WinGetTitle, CurrentWinSlow, ahk_id %CurrentWinID%
;;SetTitleMatchMode, Fast
WinGetClass, CurrentWinClass, ahk_id %CurrentWinID%
ControlGetText, WinEdit, Edit1, ahk_id %CurrentWinID%
;------------------------------------------------------
PID_Target := WinExist( "A" ) ; получаем ID ОКНА
If Not PID_Target ; если ОКНО не найдено...
{
MsgBox, Окно не найдено!
Return ; конец скрипта
}
WinGet, PID_Target, PID, ahk_id %PID_Target% ; получаем PID найденного окна ОКНА
Exe_Path := GetModuleFileNameEx( PID_Target ) ; вызываем функцию получения пути процесса ОКНА
If Not Exe_Path ; если что-то не так...
{
MsgBox, Процесс не существует, или к нему нет доступа
Return ; конец скрипта
}
Com_Line := GetRemoteCommandLine( PID_Target ) ; вызываем функцию получения ком. строки ОКНА
If Not Com_Line ; если что-то не так...
{
MsgBox, Процесс не существует, или к нему нет доступа
Return ; конец скрипта
}
StringReplace, File_Path, Com_Line, %Exe_Path% ; удаляем из строки путь к ОКНУ
StringReplace, File_Path, File_Path, ",, All ; удаляем из строки все кавычки, если они есть
StringReplace, File_Path, File_Path, hh.exe,, All ; вслучаееслиоткрытчерезhh.exe
If WinActive("ahk_class CabinetWClass")
{
hWnd := WinExist("A")
WinGetClass wClass, ahk_id %hWnd%
Res := GetWindowsExplorerPath(hWnd)
File_Path = %Res%
}
;;IfWinActive, ahk_class IEFrame
;; sServer := "iexplore" ; firefox, opera, iexplore
IfWinActive, ahk_class OpWindow
sServer := "opera" ; firefox, opera, iexplore
IfWinActive, ahk_class MozillaUIWindowClass
sServer := "firefox" ; firefox, opera, iexplore
If WinActive("ahk_class OpWindow")
|| WinActive("ahk_class MozillaUIWindowClass")
;;|| WinActive("ahk_class IEFrame")
{
Gosub, get_FF_Op_UrlTtl
StringReplace, sData, sData, `"`,`", `r`n, All
StringTrimRight, sData, sData, 1
StringTrimLeft, sData, sData, 1
StringSplit, File_Path, sData,`n
File_Path = %File_Path1%
}
If WinActive("ahk_class IEFrame")
|| WinActive("ahk_class OpusApp") ; Word
|| WinActive("ahk_class Maxthon2_Frame")
|| WinActive("Paranoia Browser")
|| WinActive("NetCaptor")
{
IfWinActive, ahk_class IEFrame
ControlGet, hwnd, hwnd, , Internet Explorer_Server1, ahk_class IEFrame
IfWinActive, ahk_class Maxthon2_Frame
ControlGet, hwnd, hwnd, , Internet Explorer_Server1, ahk_class Maxthon2_Frame
IfWinActive, Paranoia Browser
ControlGet, hwnd, hwnd, , Internet Explorer_Server1, Paranoia Browser
IfWinActive, NetCaptor
ControlGet, hwnd, hwnd, , Internet Explorer_Server1, NetCaptor
Gosub, GetChmTitlePath
File_Path = %pthValue%
}
File_Path = %File_Path% ; избавляемся от возможных пробелов в начале строки
Return
;SEE:: Retrieve AddressBar of Firefox through DDE Message
get_FF_Op_UrlTtl:
/*
XCLASS_DATA := 0x2000
XCLASS_FLAGS := 0x4000
XTYP_EXECUTE := 0x0050 | XCLASS_FLAGS
XTYP_POKE := 0x0090 | XCLASS_FLAGS
XTYP_REQUEST := 0x00B0 | XCLASS_DATA
*/
;;sServer := "opera" ; firefox, opera, iexplore
sTopic := "WWW_GetWindowInfo"
sItem := "0xFFFFFFFF"
idInst := DdeInitialize()
hServer := DdeCreateStringHandle(idInst, sServer)
hTopic := DdeCreateStringHandle(idInst, sTopic )
hItem := DdeCreateStringHandle(idInst, sItem )
hConv := DdeConnect(idInst, hServer, hTopic)
hData := DdeClientTransaction(0x20B0, hConv, hItem) ; XTYP_REQUEST
sData := DdeAccessData(hData)
DdeFreeStringHandle(idInst, hServer)
DdeFreeStringHandle(idInst, hTopic )
DdeFreeStringHandle(idInst, hItem )
DdeUnaccessData(hData)
DdeFreeDataHandle(hData)
DdeDisconnect(hConv)
DdeUninitialize(idInst)
DdeInitialize(pCallback = 0, nFlags = 0) {
DllCall("DdeInitialize", "UintP", idInst, "Uint", pCallback, "Uint", nFlags, "Uint", 0)
Return idInst
}
DdeUninitialize(idInst) {
Return DllCall("DdeUninitialize", "Uint", idInst)
}
DdeConnect(idInst, hServer, hTopic, pCC = 0) {
Return DllCall("DdeConnect", "Uint", idInst, "Uint", hServer, "Uint", hTopic, "Uint", pCC)
}
DdeDisconnect(hConv) {
Return DllCall("DdeDisconnect", "Uint", hConv)
}
DdeAccessData(hData) {
Return DllCall("DdeAccessData", "Uint", hData, "Uint", 0, "str")
}
DdeUnaccessData(hData) {
Return DllCall("DdeUnaccessData", "Uint", hData)
}
DdeFreeDataHandle(hData) {
Return DllCall("DdeFreeDataHandle", "Uint", hData)
}
DdeCreateStringHandle(idInst, sString, nCodePage = 1004) { ; CP_WINANSI = 1004
Return DllCall("DdeCreateStringHandle", "Uint", idInst, "Uint", &sString, "int", nCodePage)
}
DdeFreeStringHandle(idInst, hString) {
Return DllCall("DdeFreeStringHandle", "Uint", idInst, "Uint", hString)
}
DdeClientTransaction(nType, hConv, hItem, sData = "", nFormat = 1, nTimeOut = 10000) { ; CF_TEXT = 1
Return DllCall("DdeClientTransaction", "Uint", sData = "" ? 0 : &sData, "Uint", sData = "" ? 0 : StrLen(sData)+1, "Uint", hConv, "Uint", hItem, "Uint", nFormat, "Uint", nType, "Uint", nTimeOut, "UintP", nResult)
}
Return
GetModuleFileNameEx(PID) { ; shimanov - www.autohotkey.com/forum/viewtopic.php?p=54838#54838
hpr := DllCall( "OpenProcess", UInt,1040, Int,0, UInt,PID )
If ( ErrorLevel or !hpr )
Return
VarSetCapacity( Name,255 )
DllCall( "psapi.dll\GetModuleFileNameExA", UInt,hPr, UInt,0, Str,Name, UInt,255 )
DllCall( "CloseHandle", hPr )
Return, Name
}
GetRemoteCommandLine( p_pid_target ) ; функция получения командной строки для процесса (по его PID'у)
{
hp_target := DllCall( "OpenProcess", "UInt", 0x10, "Int", false, "UInt", p_pid_target ) ; открываем хэндл для PID процесса...
; ...с правами для чтения 0x10 = PROCESS_VM_READ (нужны для ReadProcessMemory) и без наследования хэндла
If ( ErrorLevel OR hp_target = 0 ) ; если почему-либо не удалось открыть хэндл (или он открыт для несуществующего PID'а)...
Goto, Return_2 ; перейти к закрытию хэндла и выйти из функции
hm_kernel32 := DllCall( "GetModuleHandle", "Str", "kernel32.dll" ) ; узнаем хэндл библиотеки kernel32.dll
pGetCommandLineA := DllCall( "GetProcAddress", "UInt", hm_kernel32, "Str", "GetCommandLineA" ) ; получаем указатель...
; ...на адрес функции GetCommandLineA (ANSI), содержащейся в kernel32.dll
buffer_size = 6 ; количество байт для переменной
VarSetCapacity( buffer, buffer_size ) ; обеспечиваем достаточную вместимость переменной
DllCall( "ReadProcessMemory", "UInt", hp_target, "UInt", pGetCommandLineA, "UInt", &buffer, "UInt", buffer_size, "UInt", 0 )
; для хэндла PID'а получаем перенаправление функцией GetCommandLineA на указатель на адрес командной строки...
; ...и кладем его по адресу "buffer" в памяти
Loop, 4 ; преобразовываем указатель на адрес командной строки в целое число
ppCommandLine += ( ( *( &buffer+A_Index ) ) << ( 8*( A_Index-1 ) ) ) ; создаем целое число, складывая его байты
buffer_size = 4 ; количество байт для переменной
VarSetCapacity( buffer, buffer_size, 0 ) ; обеспечиваем достаточную вместимость переменной, и очищаем её
DllCall( "ReadProcessMemory", "UInt", hp_target, "UInt", ppCommandLine, "UInt", &buffer, "UInt", buffer_size, "UInt", 0 )
; для хэндла PID'а читаем адрес командной строки, и кладем его по адресу "buffer" в памяти
Loop, 4 ; преобразовываем адрес в целое число
pCommandLine += ( ( *( &buffer+A_Index-1 ) ) << ( 8*( A_Index-1 ) ) ) ; создаем целое число, складывая его байты
; Адрес командной строки получен, теперь извлекаем его содержимое
buffer_size = 520 ; столько символов будем читать из командной строки (мне кажется, длиннее быть не может)
VarSetCapacity( result, buffer_size, 1 ) ; обеспечиваем достаточную вместимость переменной, делаем её побайтной
DllCall( "ReadProcessMemory", "UInt", hp_target, "UInt", pCommandLine, "UInt", &result, "UInt", buffer_size, "UInt", 0 )
; для хэндла PID'а читаем командную строку, и кладем её по адресу "result" в памяти (просто помещаем значение в переменную)
Return_2: ; метка перехода к закрытию хэндла
DllCall( "CloseHandle", "UInt", hp_target ) ; закрываем хэндл
Return, result ; возвращаем полную командную строку для PID'а процесса
} ; конец функции
; Определение текущего пути в окне Проводника
GetWindowsExplorerPath(_hWnd)
{
local pid, hMem, pv, pidl, pidl?, explorerPath
If (A_OSType = "WIN32_NT")
{
pid := DllCall("GetCurrentProcessId")
SendMessage 0x400 + 12 ; CWM_GETPATH = WM_USER + 12
, pid, 0, , ahk_id %_hWnd%
hMem := ErrorLevel
if (hMem != 0)
{
pv := DllCall("Shell32\SHLockShared"
, "UInt", hMem, "UInt", pid)
if (pv != 0)
{
pidl := DllCall("Shell32\ILClone", "UInt", pv)
DllCall("Shell32\SHUnlockShared", "UInt", pv)
}
DllCall("Shell32\SHFreeShared"
, "UInt", hMem, "UInt", pid)
}
}
VarSetCapacity(explorerPath, 512, 0)
DllCall("Shell32\SHGetPathFromIDList"
, "UInt", pidl, "Str", explorerPath)
Return explorerPath
}
WriteFile(file,data)
{
Handle := DllCall("CreateFile","str",file,"Uint",0x40000000
,"Uint",0,"UInt",0,"UInt",4,"Uint",0,"UInt",0)
Loop
{
if strlen(data) = 0
break
StringLeft, Hex, data, 2
StringTrimLeft, data, data, 2
Hex = 0x%Hex%
DllCall("WriteFile","UInt", Handle,"UChar *", Hex
,"UInt",1,"UInt *",UnusedVariable,"UInt",0)
}
DllCall("CloseHandle", "Uint", Handle)
return
}
CrtIco:
Ico =
( join
00000100010010100000010020006804000016000000280000001000000020000000010020
00000000000004000000000000000000000000000000000000ffccc7ffffccc7ffffccc7ff
ffccc7ffffccc7ffffccc7ffffccc7ffffccc7ffffccc7ffffccc7ffffccc7ffffccc7ffff
ccc7ffffccc7ffffccc7ffffccc7ffffccc7fffffcf5fffffcf5fffffcf5fffffcf5fffffc
f5fffffcf5fffffcf5fffffcf6fffffcf6fffffcf6fffffcf5fffffcf5fffffcf5fffffcf5
ffffccc7ffffccc7fffffcf6fffdfbf5ffd5cfc9fff6f3eefffffcf7fffffcf7fff8f5efff
c6bdb8ffd9d3cefffffdf8fffffcf6fffffcf6fffffcf5fffffcf5ffffccc7ffffccc7ffff
fdf7fff1eee9ff170705ff726663fffffdfafffffdfaffd4cdcaff120401ff140502ff5d50
4cffebe7e2fffffdf7fffffcf6fffffcf5ffffccc7ffffccc7fffff9f7fffef9f8ff6f5f5c
ff23110effdad3d1fffffbfafff9f5f4ff41312eff170805ff675956ff443331ffe3dbd9ff
fff8f7fffff8f6ffffccc7ffffccc7fffff7f2fffff8f5ffd8cbc7ff4e342fff917d78ffff
fbf8fffffaf8ffa99c9aff140504ffa19491ffb2a6a3ff837572fffff7f2fffff6f0ffffcc
c7ffffccc7ffffedebfffff0eefff6ece9ff604b46ff49302cffd4c7c4fffff5f4fffaf1ef
ff67514dff5b4540fffdf2f1fff7e8e6ffffedeaffffebe8ffffccc7ffffccc7ffffe4e1ff
ffe8e6ffffedecff97827dff37211dff6d5955fff9eceafffff1efffbdaaa6ff3f2823ffb7
a19dffffeae8ffffe5e2ffffe2dfffffccc7ffffccc7fffcddd6fffde1dbfffde7e2ffd6c5
c0ff36221eff513d39ffa7928dfffeeeebfff4e4e1ff543f3aff4f3935fff2dedafffde2db
fffcddd6ffffccc7ffffccc7fff0ccc0fff0d0c6ffebd1c9fff7e5dfff4f3c38ff4d3936ff
5c4844ffd0bdb7fff8e5dfffa6918bff281410ffa78f89fff4d8cefff1d0c5ffffccc7ffff
ccc7ffffe9e7fffbe8e6ff7f6c6affd1c4c2ffa99896ff261412ff887673ff5a4744fff4e9
e8fff2e6e5ff3b2724ff45312efff6e6e4ffffebe9ffffccc7ffffccc7fffff1edfffff3ef
ffdacdcaff473733ff9d8d89ff1d0d09ff877774ff887874ff63534ffffff9f7ff73625fff
190805ffccbebbfffff2efffffccc7ffffccc7fffff2effffff3f1fffff5f3ffc8bcbaff2a
1a17ff0c0000ff62524ffffff9f7ff746562ff453431ff281714ff170704ffd3c7c5fffff4
f2ffffccc7ffffccc7fffff3effffff3f0fffff4f1fffff5f2ffe9dfdcff9a8d8affdbd0cc
fffff6f3fffff6f3ffc5b7b4ff8a7c79ffc4b8b4fffef5f2fffff5f1ffffccc7ffffccc7ff
fff4effffff4effffff4effffff5f0fffff5f0fffff5f0fffff5f0fffff5f0fffff5f0ffff
f5f0fffff5f1fffff5f0fffff5f0fffff4efffffccc7ffffccc7ffffccc7ffffccc7ffffcc
c7ffffccc7ffffccc7ffffccc7ffffccc7ffffccc7ffffccc7ffffccc7ffffccc7ffffccc7
ffffccc7ffffccc7ffffccc7ff000000000000000000000000000000000000000000000000
00000000000000000000000000000000000000000000000000000000000000000000000000
000000
)
return