RunWait 명령어의 기능을 확장 했습니다.



RunWait , Target [, WorkingDir, option, OutVarPID, OutVarStdOut, OutVarStdOutSize]

 

[추가 변수]

OutVarStdOut : 실행시킨 프로세스가 종료되기 전까지의 표준출력 데이터가 저장되는 변수

OutVarStdOutSize : OutVarStdOut 변수에 저장된 데이터의 크기

 

[기존옵션]

Max|Min|Hide|UseErrorLevel


[추가옵션]
TimeoverN : 타임오버시 실행시킨 프로세스 강제종료, N 값은 초단위 숫자

- adb.exe 같은 콘솔프로그램을 실행시킬 경우 대부분 짧은시간내에 종료되지만 오류등으로 종료가 되지 않는 경우가 있습니다. 이럴때 timveover3 옵션을 사용해주면 3초가 초과될시 강제종료가 됩니다.(되도록 강제종료되는 상황이 안생겨야 정상이겠지요)

 

[결과값] - UseErrorLevel 옵션 있을시에만 유효

ErrorLevel = 0 : 실행시킨 프로세스가 정상종료
ErrorLevel = 1 : 프로세스 실행실패
ErrorLevel = 2 : 실행시킨 프로세스가 타임오버로 강제종료됨
ErrorLevel = 3 : 실행시킨 프로세스의 표준출력데이터 읽기 실패 (OutVarStdOut 변수가 있을시에만 유효)

 

 


 

Timeover 옵션 사용 예

 

;5초내에 실행된 메모장이 종료되지 않을시 강제종료

tick := A_TickCount

RunWait, Notepad.exe,, min timeover5
MsgBox % A_TickCount - tick "ms"

 

 

 

Posted by 와이로
,

ImageList 명령어는 서브커맨드에 따라 이미지리스트에 이미지를 추가하거나 가져오거나 설정하는 명령어입니다. ImageListSearch 에 사용하는 이미지리스트를 만들때 사용하면 유용합니다.



ImageList , sub-command, hBmpListVar, hBmpVar, [option]

 

[결과값]
ErrorLevel = 0: 명령어수행 완료
ErrorLevel = 1: 명령어수행 실패
ErrorLevel = 2: 이미지리스트 오류 (Get,Set 에서만 사용하며 필수옵션이 없어도 발생)

 

[변수]
hBmpListVar : 이미지리스트 비트맵 핸들용 변수
hBmpVar : 파트이미지 비트맵 핸들용 변수

 

[서브커맨드]
Add : 이미지리스트에 파트이미지를 추가합니다.

(출력변수 : hBmpListVar ,  입력변수 : hBmpVar)

Get : 이미지리스트에서 선택한 파트이미지를 가져옵니다.

(출력변수 : hBmpVar     ,  입력변수 : hBmpListVar)

Set : 이미지리스트의 파트이미지를 교체합니다.

(출력변수 : hBmpListVar ,  입력변수 : hBmpListVar, hBmpVar)

 

[Add 서브커맨드 옵션]
*WidthList : 가로이미지리스트 일때 사용

*SrcNotDel : 명령어 사용후 'hBmpVar' 변수의 비트맵핸들을 초기화 하지 않음
*BackgroundN : N값은 컬러명 또는 RGB 값

 (ex. *BackgroundBlack, *BackgroundWhite, *Background0xFFFFAA)

 

[Get 서브커맨드 옵션]
*ListMaxNN : 필수옵션, NN값은 이미지리스트상의 파트이미지 총개수
*SelectNN : 필수옵션, NN값은 1부터 시작하는 파트이미지 인덱스
*WidthList : 가로이미지리스트 일때 사용
*ListNotDel : 명령어 사용후'hBmpListVar' 변수의 비트맵핸들을 초기화 하지 않음

*UseZeroIndex : 이미지리스트의 시작인덱스를 1이 아닌 0을 사용


[Set 서브커맨드 옵션]
*ListMaxNN : 필수옵션, NN값은 이미지리스트상의 파트이미지 총개수
*SelectNN : 필수옵션, NN값은 1부터 시작하는 파트이미지 인덱스
*WidthList : 가로이미지리스트 일때 사용
*ListNotDel : 명령어 사용후 'hBmpListVar' 변수로 입력받은 비트맵핸들을 초기화 하지 않음

*SrcNotDel : 명령어 사용후 'hBmpVar' 변수의 비트맵핸들을 초기화 하지 않음

*UseZeroIndex : 이미지리스트의 시작인덱스를 1이 아닌 0을 사용

[주의]

 - 출력변수로 받은 HBITMAP 핸들은 사용이 끝난 후 초기화 해주세요. (ex. DllCall("DeleteObject", Ptr,hBitmap)

 - ImageListSearch 명령어에 사용할 이미지리스트를 만들때는 *WidthList 옵션을 넣지 마세요.

 


 

아래 샘플스크립트는 F1 키로 마우스 위치의 이미지를 캡춰 한후 이미지리스트에 계속 추가 할 수 있으며 F2 키로 이미지리스트를 비트맵파일로 저장하는 스크립트 입니다.

 

 

Test.ahk 파일을 다운로드한  'Ahk+ 전용 AutoHotkey.exe 파일'  위에 드래그해서 실행하세요.

ImageList명령어_테스트.zip

 

 

<테스트 스크립트중 일부>

 

CoordMode, Mouse, Screen
CoordMode, Pixel, Screen
captureWidth  := 20
captureHeight := 20

 

RectWindow:
  Gui 2: +LastFound
  Gui 2: -Caption +AlwaysOnTop
  Gui 2: Color, EEAA99
  Gui 2: Add, Text, w%captureWidth% h%captureHeight% Border vBorder hwndhwndBorder
  Gui 2: Show
  WinSet, TransColor, EEAA99 255
  hwndRectWin := WinExist()
  WinGetPos, borderx,bordery,,, ahk_id %hwndBorder%
  WinGetPos, rectwinx,rectwiny,,, ahk_id %hwndRectWin%
  gapx := borderx-rectwinx  ,  gapy := bordery-rectwiny
  Loop
  {
    MouseGetPos, capx,capy
    capx -= gapx  ,  capy -= gapy+captureHeight
    WinMove, ahk_id %hwndRectWin%,, capx, capy
    Tooltip, F1:이미지리스트추가
    sleep, 10
  }
return


;현재 영역 캡춰 후 이미지리스트에 추가
F1::
  WinGetPos, x,y,w,h, ahk_id %hwndBorder%
  ImageGet, hBitmap, x+1,y+1,w-2,h-2,, *WH
  ImageList, Add, hImageList, hBitmap   ;hBitmap 핸들은 ImageList 명령어 사용 후 초기화 됩니다.
  sleep, 300

return


;이미지리스트 파일로 저장 후 스크립트 종료
F2::
  if hImageList
  {
    SaveHBITMAPToFile(hImageList, imgListFile := "캡춰이미지리스트.bmp")
    DllCall("DeleteObject", Ptr,hImageList)
    hImageList =
    MsgBox, 캡춰한 이미지리스트를 %imgListFile%에 저장했습니다.
  }
  ExitApp
return

 

 

 

Posted by 와이로
,

ZipToVar 과 UnzipToVar 명령어는 입력변수의 데이터를 zip 포맷으로 압축하거나 zip 포맷의 압축데이터에서 특정데이터를 추출하는 명령어입니다. 이 명령어를 추가한 이유는 스마트집 같은 간편한 압축관련 스크립트가 있지만 파일을 거치지 않고 메모리에서 압축하거나 압축해제해서 쓸 수 있는 필요성이 생겨서입니다.

 

이 명령어를 추가하는데 사용한 zip unzip c++ 소스의 출처입니다.  많은 감사를 표합니다.

http://www.info-zip.org/

http://www.codeproject.com/Articles/7530/Zip-Utils-clean-elegant-simple-C-Win

 

 

ZipToVar , OutZipVar, OutZipSize, srcVar, srcSize [, insideName, password]

 

zip 포멧으로 압축합니다.
압축된 데이터를 파일로 저장하려면 파일오브젝트의 RawWrite() 함수를 사용해야 합니다.

 

[결과값]
ErrorLevel = 0 : 압축 성공
ErrorLevel = 1 : 소스데이터가 존재하지 않거나 ClipBoard 변수가 지정된 경우
ErrorLevel = 2 : 압축데이터 생성 실패
ErrorLevel = 3 : 압축데이터 추가 실패

 

[변수]

insideName : 압축데이터 내에 설정될 데이터 식별명(압축파일내의 파일이름)

password : 패스워드

 

[참고]

ZipToVar 명령어는 아직 기존 압축데이터에 새 데이터 추가를 지원 하지 않습니다. 추후 업데이트 예정입니다.

 

 


 

 

UnzipToVar , OutUnzipVar, OutUnzipSize, srcZipVar, srcZipSize [, insideName, password]

 

zip 포멧으로 압축된 데이터를 해제합니다.

 

[결과값]
ErrorLevel = 0 : 압축해제 성공
ErrorLevel = 1 : 소스데이터가 존재하지 않거나 ClipBoard 변수가 지정된 경우
ErrorLevel = 2 : 압축데이터 열기 실패(또는 패스워드 오류)
ErrorLevel = 3 : 압축데이터 내에서 'insideName' 식별명을 가진 데이터 찾기 실패
ErrorLevel = 4 : 압축해제 실패

 

[변수]

insideName : 압축데이터에서 해제할 데이터의 식별명(압축파일내의 파일이름)

password : 패스워드

 

[주의]

해결되지 않은 문제점이 있습니다. 50바이트 내의 특정 데이터를 압축한 경우 압축 해제시에 오류가 발생하는 경우가 있습니다. 원인을 찾는데 시간이 걸릴것 같습니다.

 

 


 

Test.ahk 파일을 다운로드한  'Ahk+ 전용 AutoHotkey.exe 파일'  위에 드래그해서 실행하세요.

ZipToVar테스트_소스.zip

 

 

 

<테스트 스크립트>

 

F1::
  imageFile = sample.bmp
  FileRead, srcData, *c %imageFile% ;*c 옵션은 파일을 그대로 읽어오는 옵션
  FileGetSize, srcSize, %imageFile%
  ;이미지 데이터를 압축
  ZipToVar, zipData, zipSize, srcData, srcSize, abcd.bmp
  ;이진데이터를 BASE64 문자열 변환
  BinToHex, base64Str, zipData, zipSize, *Base64
  ;텍스트 파일로 저장
  FileAppend, % base64Str, sample_base64.txt
  MsgBox, 압축이미지데이터를 BASE64 문자열로 변환 후 텍스트 파일로 저장완료!
return


F2::
  ;F1 키를 눌러 만들어진 BASE64 문자열 텍스트파일 내용을 복사해서 붙여넣었습니다.
  imageData = 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

  ;BASE64 문자열을 압축 이진데이터로 변환
  HexToBin, binData, binSize, imageData, *Base64
  ;압축데이터에서 이미지데이터 추출
  UnzipToVar, memBmp, memBmpSize, binData, binSize, abcd.bmp
  hBitmap := CreateHBitmapFromVar(memBmp)
  
  ;윈도우에 이미지 출력
  Gui, Add, Picture, w100 h100 hwndhwndPic 0xE
  SetImage(hwndPic, hBitmap)
  Gui, Show
return

 

GuiClose:
ExitApp


;----------------------------------------------------------------------------------
;윈도우에 비트맵 출력
SetImage(hwnd, hBitmap)
{
  SendMessage, 0x172, 0x0, hBitmap,, ahk_id %hwnd%
  E := ErrorLevel
  DllCall("DeleteObject", Ptr,E)
  return E
}

 

;----------------------------------------------------------------------------------
;메모리에 로딩된 BMP파일을 읽어 HBitmap핸들로 반환
CreateHBitmapFromVar(ByRef bmpVar)
{
  WinGet, hwnd, ID, ahk_class Progman
  hDC := DllCall("USER32\GetDC", Ptr,hwnd, Ptr)
  hBMP := DllCall( "CreateDIBitmap", UInt,hDC, UInt,(bmiHAddr:=&bmpVar+14)
       ,UInt,(CBM_INIT:=4), UInt,&bmpVar+NumGet(&bmpVar,10), UInt,&bmpVar+14, UInt,(DIB_PAL_COLORS:=1) )
  DllCall("ReleaseDC", Ptr,hwnd, Ptr,hDC, Uint)
  return hBMP
}

 

 

Posted by 와이로
,

'디컴방지 컴파일러'가 설치된 경우는 아래 파일을 다운로드해 사용할 필요가 없습니다.


AutoHotkey.zip

업데이트 : 2019-11-26

Autohotkey.zip 파일만 단독으로 받아 사용시 목표 스크립트를 AutoHotkey.exe 에 매번 드래그앤드롭해 실행하는 것이 번거롭다면 AutoHotkey.exe 이름을 목표 ahk 스크립트 파일 이름과 동일하게 바꾸고 목표 스크립트가 위치한 폴더에 넣고 실행하면 드래그앤드롭 없이 바로 실행 가능합니다.


 -> 오토핫키 플러스 명령어 목록 바로가기



Posted by 와이로
,

BinToHex 와 HexToBin 명령어는 이진데이터와  HEX문자열(BASE64문자열)간 변환 명령어 입니다. 오토핫키 명령어로 구현 가능하지만 편하고 빠르게 쓰려고 추가한 명령어로 두 명령어 모두 성공시 ErrorLevel 값은 0 실패시 1을 반환합니다.

 

 

BinToHex , OutHexStringVar, binDataVar, binDataSize, [*Base64]

 

binDataVar 변수에 저장된 데이터를 HEX 문자열로 변환시켜 줍니다.

 

[변수]

OutHexStringVar : 변환된 HEX 문자열 출력 변수

binDataVar : 이진데이터가 저장된 입력 변수

binDataSize : 변환시킬 바이트 수

 

[옵션]
*Base64 : 이 옵션 사용시 BASE64 문자열로 변환

 


 

HexToBin , OutBinDataVar, OutBinDataSize, hexStringVar, [*Base64]

 

hexStringVar 변수에 저장된 HEX 문자열을 이진데이터로 변환시켜줍니다.

 

[변수]

OutBinDataVar : 변환된 이진데이터 출력 변수

OutBinDataSize : 변환된 이진데이터 사이즈 출력 변수

hexStringVar : HEX 문자열 입력 변수

 

[옵션]
*Base64 : BASE64 문자열을 이진데이터로 변환시킬때 사용

 

 


 

Test.ahk 파일을 다운로드한  'Ahk+ 전용 AutoHotkey.exe 파일'  위에 드래그해서 실행하세요.

BinToHex테스트_소스.zip

 

 

 

<테스트 스크립트>


imageFile = sample.bmp
FileRead, srcData, *c %imageFile%  ;*c 옵션은 파일내용을 그대로 읽어오는 옵션
FileGetSize, srcSize, %imageFile%


;이미지데이터를 HEX 문자열 변환 후 다시 이미지데이터 변환
BinToHex, hexStr, srcData, srcSize
MsgBox,, 이미지데이터를 HEX문자열로 변환한 상태, % hexStr
HexToBin, newData, newSize, hexStr
file := FileOpen("1.HEX문자열-이미지변환.bmp", "w")
file.RawWrite(newData, newSize)
file.Close()


;이미지데이터를 BASE64 문자열 변환 후 다시 이미지데이터 변환
BinToHex, b64Str, srcData, srcSize, *Base64
MsgBox,, 이미지데이터를 BASE64문자열로 변환한 상태, % b64Str
HexToBin, newData, newSize, b64Str, *Base64
file := FileOpen("2.BASE64문자열-이미지변환.bmp", "w")
file.RawWrite(newData, newSize)
file.Close()

 

 

 

 

Posted by 와이로
,

URLDownloadToVar 명령어는 http:// 또는 https:// 로 시작하는 웹주소의 데이터를 다운로드 후 변수에 저장합니다. 다운로드한 데이터를 파일로 남기고 싶지 않을때 사용하면 좋습니다.



URLDownloadToVar , [*option] Url, DownloadVar [, DownloadSize]

 

[변수]

DownloadVar : 다운로드한 데이터가 저장되는 변수

DownloadSize : 다운로드한 데이터의 사이즈

 

[옵션]

*T : 다운로드한 데이터가 인지 가능한 문자열 인코딩인 경우 시스템 인코딩으로 자동변환

*Pnnn : 다운로드한 데이터가 문자열이고 인코딩 방식을 직접 지정할 때 사용

  ex) *P65001 : UTF-8   ,  그외 코드페이지ID 참조사이트

 

보통은 *T 옵션 만으로 자동 변환이 되야 하지만 BOM 값이 존재하지 않는 경우 *Pnnn 옵션으로 직접 인코딩 방식을 지정해 줘야 합니다. 이진 데이터인 경우는 옵션값을 비워두면 됩니다.

 

 

<테스트 스크립트>

스크립트 테스트는 다운로드한  'Ahk+ 전용 AutoHotkey.exe 파일'  위에 아래의 샘플 스크립트가 작성된 파일을 드래그해서 실행하세요.

 

1. 네이버 메인페이지는 *T 옵션을 사용한 경우 한글이 깨집니다.

URLDownloadToVar, *T http://www.naver.com, downVar, downSize
MsgBox % downVar
 

2. *P65001 옵션으로 UTF-8 인코딩을 지정한 경우 한글이 정상 출력 됩니다.

URLDownloadToVar, *P65001 http://www.naver.com, downVar, downSize
MsgBox % downVar

 

 

Posted by 와이로
,