2016. 3. 4.

2CH AHK스레드에서 밝힌 AHK L버전의 편리함

원래 출처는 일본의 2ch 오토핫키 스레드라고 밝힙니다.
요점은 AHK basic과 비교해, COM기능이 자체내장되어,  소스가 엄청 줄어들었다는 것입니다.

■ 표준입출력

; ---- stdout.ahk ----
stdout := FileOpen(DllCall("GetStdHandle", "int", -11, "ptr"), "h `n")
Loop, 10
    stdout.WriteLine(A_Index . "항목")
; ---- stdin.ahk ----
stdin := FileOpen(DllCall("GetStdHandle", "int", -10, "ptr"), "h `n")
While !stdin.AtEOF()
    q .= stdin.ReadLine()
MsgBox, % q

사용예) 스크립트가 위치한 디렉토리에서 cmd로 다음과 같이 실행
> set ahk="C:\Program Files\AutoHotkey\AutoHotkey.exe"
> %ahk% stdout.ahk | %ahk% stdin.ahk


■ 메뉴에 아이콘 표시 Loop, 3 {
    Menu, M1, Add, 항목%A_Index%, Dummy
    Menu, M1, Icon, 항목%A_Index%, %A_WinDir%\Explorer.exe, %A_Index% ; , 32|64
}
Menu, M1, Show
Dummy:
Return

※ 주석을 제거하고 32나 64를 지정하면 큰 아이콘도 표시 가능


■ 탐색기에서 선택중인 파일의 풀패스를 복사     COM을 사용하므로 특수 폴더가 있어도 가능

SetTitleMatchMode, RegEx
#IfWinActive, ahk_class CabinetWClass|ExploreWClass
#c::
FileList:=
For window in ComObjCreate("Shell.Application").Windows
    If (window.hwnd == WinExist()) {
        For item in window.document.SelectedItems
        FileList .= item.path "`n"
        Break
    }
Clipboard:=FileList, window:=item:=
Return


■ 활성화된 어플리케이션의 실행파일이 위치한 폴더를 열기
#z:: ; Win + z
WinGet, pid, PID, A
For process in ComObjGet("winmgmts:").ExecQuery("SELECT * FROM Win32_Process WHERE ProcessId='" pid "'")
    Run, % "explorer.exe /select`,""" . (process.ExecutablePath) . """"
process :=
Return


■ IE 자동화

ie := ComObjCreate("InternetExplorer.Application")
ie.Visible := True
ie.Navigate("http://www.google.co.kr/")
While ie.Busy()
    Sleep, 50
MsgBox, 로드 완료`n`n폼에 문자를 입력합니다.
form := ie.document.GetElementsByTagName("FORM")[0]
form.q.value := "AutoHotkey"
MsgBox, 폼 송신 완료
form.submit()
While ie.Busy()
    Sleep, 50
MsgBox, 검색결과가 표시되었습니다.`n`n종료합니다.
form:=""
ie.Quit() ; 종료시키지 않으면 iexplore.exe 프로세스가 남으므로 주의


■ AutoHotkey.dll을 이용한 멀티스레드
미리 AutoHotkey.dll를 다운로드하여, 모듈등록을 할 필요가 있음
(DLL이 있는 디렉토리에서 "regsvr32.exe AutoHotkey.dll"을 실행)

code := "#NoTrayIcon`nMsgBox, Thread #"
Loop, 10 {
    ComObjCreate("AutoHotkey.script").AhkTextDll(code . A_Index)
    Sleep, 100
}


[출처 : http://autohotkey.co.kr/b/1-960]