#Persistent
#SingleInstance Force
; ЧЁРНЫЙ СПИСОК ВИДЕО-РАСШИРЕНИЙ (ЛИШНИЕ МОЖНО УБРАТЬ)
ExtLst = .3g2,.3gp,.3gp2,.3gpp,.asf,.asx,.avi,.flv,.dif,.dv,.IVF,.m1v,.m2v,.m4e,.mkv,.mov,.mp2,.mp2v,.mp4,.mpa,.mpe,.mpeg,.mpg,.mps,.mpv,.mpv2,.ogm,.qt,.ram,.rv,.wm,.wmp,.wmv,.wmx,.wvx
; ФОРМАТ ДАТЫ
FormatTime, Cur_Date,, dd.MM.yyyy [H.mm.ss]
SetTimer, VdCtrl, 1000 ;так часто необязательно
Return
VdCtrl:
MouseGetPos, xC, yC, id, controlUnder
WinGetActiveTitle, WinTtl ;получение заголовка окна
WinGet, hWnd, PID, % "ahk_id " WinExist("A")
Exe_Path := GetModuleFileNameEx( hWnd ) ; вызываем функцию получения пути процесса ОКНА
Com_Line := GetRemoteCommandLine( hWnd ) ; вызываем функцию получения ком. строки ОКНА
If Not Com_Line ; если что-то не так...
Return
StringReplace, File_Path, Com_Line, %Exe_Path% ; удаляем из строки путь к ОКНУ
StringReplace, File_Path, File_Path, ",, All ; удаляем из строки все кавычки, если они есть
Com_Line=%Com_Line%
If controlUnder contains Video
{
Gosub, Write
Return
}
Else If Com_Line contains %ExtLst%
{
Gosub, Write
Return
}
Else If WinTtl contains %ExtLst%
{
Gosub, Write
Return
}
Return
Write:
If ( WinTtlPrevious = WinTtl )
Return
Else
{
Tooltip, Запись
FileAppend, %Cur_Date%`n%WinTtl%`n%Com_Line%`n`n, %A_ScriptDir%\VdCtrl.log
Sleep, 1000
Tooltip
WinTtlPrevious := WinTtl
}
Return
GetRemoteCommandLine( p_hWnd ) ; функция получения командной строки для процесса (по его PID'у)
{
hp_target := DllCall( "OpenProcess", "UInt", 0x10, "Int", false, "UInt", p_hWnd ) ; открываем хэндл для 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'а процесса
} ; конец функции
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
}