Тема: AHK: Быстрый захват заметок (UPD)
Предназначен для быстрого занесения выделенных/скопированных фраз, цитат, адресов и т.п., вместе с заголовком и адресом окна-источника, в файл «QNotes.html».
Сочетание CapsLock + W — добавить текст, двойное нажатие — открыть файл заметок.
Кстати вопрос: как получить адресную строку из Оперы?
#SingleInstance force
CapsLock & SC011:: ;CapsLock+W
++counter
SetTimer, Choice, -400
return
Choice:
if A_ThisHotkey = CapsLock & SC011 ;CapsLock+W
{
IfEqual, counter, 1, Gosub, QNotesAdd
IfEqual, counter, 2, Gosub, QNotesRun
}
counter =
Return
QNotesAdd:
FormatTime DT,,dd.MM.yy, h:mm:ss
CoordMode, ToolTip, Screen
ToolTip, `n :-( `n,300,300
SoundPlay, %A_WinDir%\Media\ding.wav
f_ClipSaved := ClipboardAll
Send, {Ctrl Down}{SC02E}{Ctrl UP} ;c выделенное
Sleep, 200 ; в буфер
Gosub, Get_ExePath_FilePath_CurrentWin
IfNotExist, %A_ScriptDir%\QNotes.html
{
FileAppend,
(LTrim
<html>`n<head>
<title>[QNotes]</title>
<meta http-equiv="Content-Type" content="text/html; charset=windows-1251"/>
<style type="text/css">`n<!--
html, body {MARGIN:0 0 1.1em 6`%; PADDING:0; BORDER:none; BACKGROUND-COLOR:#FFFFF1;}`n
a:link,a:focus,a:hover,a:visited {TEXT-DECORATION:none;}
a:link {COLOR:#990000;}`na:hover {COLOR:blue;}`na:visited {COLOR:#990099;}`n
div.curvy {POSITION:relative; WIDTH:100`%; COLOR:#000; BACKGROUND:#BBCCBB;
MARGIN:2`% 0 2`% 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;}
#ctr, #cbr {WIDTH:0px;}`n
#ctl {TOP:0; LEFT:0;}
#cbl {BOTTOM:0; LEFT:0;}
#ctr {TOP:0; RIGHT:0;}
#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;}
#ctl b {LEFT:-8px;}
#ctr b {LEFT:-25px;}
#cbl b {LEFT:-8px; TOP:-17px;}
#cbr b {LEFT:-25px; TOP:-17px;}`n
div.numb {FONT-SIZE:30`%; COLOR:#808080;}
td.quot1, .quot2 {COLOR:#00384a; FONT-FAMILY:serif; FONT-SIZE:190`%; FONT-WEIGHT:bold;}
td.quot1 {PADDING:0 0 0 4`%;}
td.note {PADDING:1.4em 0 0 4`%; FONT-SIZE:14px; COLOR:#00384a;}
span.dt {COLOR:#728776;}`n
div.t {FONT-WEIGHT:bold; COLOR:#990000; FONT-FAMILY:Tahoma, Helvetica, Geneva;
MARGIN-LEFT:20`%; TEXT-ALIGN:left; FONT-SIZE:7.5pt; BORDER-BOTTOM:1px solid #728776;}
-->`n</style>`n`n
<SCRIPT language="JavaScript">`n<!--
function I(){
document.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>');`n}
function II(){
document.write('<td width="4`%" align="right" class="quot1">«</td>');
document.write('<td width="60`%" class="note">');`n}
function III(){
document.write('</td>');
document.write('<td width="24`%" valign="bottom" class="quot2">»</td>');
document.write('</tr></table>');
document.write('</div>');
}`n//-->`n</SCRIPT>`n
</head>`n<body bgcolor=#F5F5EA>`n`n
), %A_ScriptDir%\QNotes.html
}
IfWinActive, ahk_class HH Parent ;если был открыт через hh.exe
{
FileRead, get_htm_ttl, %File_Path%
StringLeft, get_htm_ttl, get_htm_ttl,500
StringReplace, get_htm_ttl, get_htm_ttl, `r`n,,All
if get_htm_ttl contains <title>
{
get_htm_ttl := RegExReplace(get_htm_ttl, "(?i)(.*)<title>(.*)</title>(.*)", "$2")
if get_htm_ttl contains Рµ,Р°,Рѕ ;е,а,о
{
get_htm_ttl := Utf8ToAnsi(get_htm_ttl) ; Преобразуем в ANSI
}
CurrentWin = %get_htm_ttl%
}
else IfInString, File_Path, .htm
{
SplitPath, File_Path,,,, FileNameNoExt
CurrentWin = %FileNameNoExt%
}
}
If CurrentWin = ; если заголовок окна не найден, то...
CurrentWin = ?Title?
StringReplace, Clipboard, Clipboard, %A_Space%%A_Space%%A_Space%,  `; `; `;, All
StringReplace, Clipboard, Clipboard, %A_Space%%A_Space%,  `; `;, All
StringReplace, Clipboard, Clipboard, `r`n%A_Space%, `r`n `;, All
StringReplace, Clipboard, Clipboard, <, <`;, All
StringReplace, Clipboard, Clipboard, >, >`;, All
StringReplace, Clipboard, Clipboard, `n, <br />, All
If File_Path = ; если переменная File_Path ПУСТА, то...
{
If WinEdit ; если Edit НАЙДЕН, то...
{
FileAppend,
(LTrim
<script>I()</script>
<div class="t"><a href="%WinEdit%">+%CurrentWin%</a> <span class="dt">- %DT%</span></div>`n
), %A_ScriptDir%\QNotes.html
}
Else ; если Edit НЕ найден, то...
{
FileAppend,
(LTrim
<script>I()</script>
<div class="t"><a href="%GetExePath%">++%CurrentWin%</a> <span class="dt">- %DT%</span></div>`n
), %A_ScriptDir%\QNotes.html
}
}
Else ; если переменная File_Path НЕ пуста, то...
{
If WinEdit = ; если Edit НЕ найден, то...
{
FileAppend,
(LTrim
<script>I()</script>
<div class="t"><a href="%File_Path%">*%CurrentWin%</a> <span class="dt">- %DT%</span></div>`n
), %A_ScriptDir%\QNotes.html
}
Else ; если Edit НАЙДЕН, то...
{
IfInString,File_Path,/ ; на случай если командные штучки при нем
{
FileAppend,
(LTrim
<script>I()</script>
<div class="t"><a href="%WinEdit%">**%CurrentWin%</a> <span class="dt">- %DT%</span></div>`n
), %A_ScriptDir%\QNotes.html
}
Else
{
FileAppend,
(LTrim
<script>I()</script>
<div class="t"><a href="%File_Path%">***%CurrentWin%</a> <span class="dt">- %DT%</span></div>`n
), %A_ScriptDir%\QNotes.html
}
}
}
FileAppend,
(LTrim
<script>II()</script>
%Clipboard%
<script>III()</script>`n`n
), %A_ScriptDir%\QNotes.html
Clipboard := f_ClipSaved
f_ClipSaved =
ToolTip, `n :-| `n,300,300
Sleep, 80
ToolTip, `n `;-) `n,300,300
Sleep, 200
ToolTip
Return
QNotesRun:
Run, iexplore.exe %A_ScriptDir%\QNotes.html
WinWait, [QNotes],, 2
{
WinWaitActive, [QNotes],,
Sleep, 900
Send, {End 5}
}
If ErrorLevel
Return
Return
Get_ExePath_FilePath_CurrentWin:
;------------------------------------------------------
WinGetActiveTitle, CurrentWin
WinGet, PID, PID, % "ahk_id " WinExist("A")
GetExePath := GetModuleFileNameEx( PID )
WinGetClass, CurrentWinClass, ahk_id %CurrentWinID%
ControlGetText, WinEdit, Edit1, ahk_id %CurrentWinID%
;------------------------------------------------------
ID_Wnd := WinExist( "A" ) ; получаем ID ОКНА
If Not ID_Wnd ; если ОКНО не найдено...
{
MsgBox, Окно не найдено!
Return ; конец скрипта
}
WinGet, PID_Target, PID, ahk_id %ID_Wnd% ; получаем 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 -800,, All ; вслучаееслиоткрытчерезhh.exe
If CurrentWin contains Mozilla Firefox
{
StringReplace, File_Path, File_Path, -requestPending -osint -url, file:///, All
StringReplace, File_Path, File_Path, file:///%A_Space%, file:///, All
}
If CurrentWin contains - Microsoft Internet Explorer
{
WinGetText, WinText, %CurrentWin%
StringSplit, WinTextSplit, WinText,`n
WinTextSplit= %WinTextSplit1%
StringTrimRight, WinTextSplit, WinTextSplit, 1
File_Path = %WinTextSplit%
}
File_Path = %File_Path% ; избавляемся от возможных пробелов в начале строки
;------------------------------------------------------
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'а процесса
} ; конец функции
Utf8ToAnsi(ByRef Utf8String, CodePage = 1251) ;by YMP
{
If (NumGet(Utf8String) & 0xFFFFFF) = 0xBFBBEF
BOM = 3
Else
BOM = 0
UniSize := DllCall("MultiByteToWideChar", "UInt", 65001, "UInt", 0
, "UInt", &Utf8String + BOM, "Int", -1
, "Int", 0, "Int", 0)
VarSetCapacity(UniBuf, UniSize * 2)
DllCall("MultiByteToWideChar", "UInt", 65001, "UInt", 0
, "UInt", &Utf8String + BOM, "Int", -1
, "UInt", &UniBuf, "Int", UniSize)
AnsiSize := DllCall("WideCharToMultiByte", "UInt", CodePage, "UInt", 0
, "UInt", &UniBuf, "Int", -1
, "Int", 0, "Int", 0
, "Int", 0, "Int", 0)
VarSetCapacity(AnsiString, AnsiSize)
DllCall("WideCharToMultiByte", "UInt", CodePage, "UInt", 0
, "UInt", &UniBuf, "Int", -1
, "Str", AnsiString, "Int", AnsiSize
, "Int", 0, "Int", 0)
Return AnsiString
}