개발자는 깔끔하고 일관성있는 코드를 작성하는것이 중요합니다
규모가 큰 프로젝트를 진행중이라면 더욱 중요하죠, 코드의 상태가 프로그램의 유지보수에 많은 영향을 끼치기 때문에요

 

그래서 제가 코드를 최적화하기 위해 사용했던,하고있는 방법 몇가지를 소개하고자 합니다
많은 분들이 영감을 얻었으면 좋겠어요. 시작하겠습니다

 

01. 변수 값저장, 함수호출은 콤마로 연속해서 작성

 

변수에 값을 저장할때, 일반적으로는 아래처럼 코드를 작성합니다

 

이름 := "예지력"
성별 := "남성"
거주지 := "서울"

 

변수의 종류가 적은 경우, 위 처럼 작성해도 코드가 크게 길어지진 않지만
변수의 종류가 많은 경우에는 저장할때마다 다음줄로 넘겨주니 코드가 길어지죠


그런데 알고 계셨나요?

변수는 콤마(,)로 넘기면서 저장할 수 있습니다

 

이름 := "예지력", 성별 := "남성", 거주지 := "서울"

 

함수의 경우도 마찬가지입니다

 

함수1(), 함수2()

 

이는 깔끔한 코드를 유지할 수 있는것 뿐만 아니라 코드의 속도를 약 35% 높여줍니다

 

 

02. 비슷한 변수끼리는 오브젝트로 저장해두기

 

변수를 많이 사용하는 경우, 가끔 변수끼리 헷갈려 잘못 사용하거나 이름을 까먹는 경우가 있죠
비슷한 종류의 변수끼리는 함께 묶고싶은 경우도 있고요

 

이름1 := "예지력", 성별1 := "남성", 거주지1 := "서울"
이름2 := "독자", 성별2 := "여성", 거주지 := "서울"

 

이렇게 이름1,이름2,이름3.. 늘리며 저장하기엔 번거롭고, 나중에 변수를 사용할때도 헷갈릴 수 있습니다
이런 경우에, 변수를 오브젝트로 저장해두도록 하면 편하죠

 

시민1  := {이름: "예지력", 성별: "남성", 거주지: "서울"}
시민2 := {이름: "독자", 성별: "여성", 거주지: "서울"}
MsgBox % "시민1이름-" 시민1.이름 "`n시민1성별-" 시민1.성별 "`n시민1거주지-" 시민1.거주지

 

시민1.이름 := "변경된 이름"
시민1.성별 := "변경된 성별"
시민1.거주지 := "변경된 거주지"
MsgBox % "시민1이름-" 시민1.이름 "`n시민1성별-" 시민1.성별 "`n시민1거주지-" 시민1.거주지

 

 

03. 반복적으로 사용되는 명령어는 함수로

 

명령어...
Send, a
Send, b
Send, c

 

명령어...
Send, a
Send, b
Send, c
명령어...

 

위 코드에서 Send 부분이 반복적으로 사용되는걸 확인할 수 있습니다. 중복되는 부분은 함수로 묶어서 코드의 일관성을 높여보세요

 

명령어...
SendFunc()

 

명령어...
SendFunc()
명령어...

 

SendFunc()
{
 Send, a
 Send, b
 Send, c
}

 

 

04. 셋타이머, 핫키 라벨은 함수로 전환 (함수바인딩)

 

SetTimer, 라벨, ... 
Hotkey, F1, 라벨 ...

 

라벨:
명령어...
return

 

일반적으로 이렇게 사용하지만, 라벨의 사용은 코드의 깔끔함을 해치고, 유지보수가 힘들어집니다
오토핫키 공식도움말에서도 라벨의 사용을 권장하지 않습니다. 같은 이유로 goto 또한.

 

따라서, 함수를 사용해야겠는데... 그냥 라벨명에다가 함수이름적으면 되는게 아닙니다

 

함수를 하나의 변수(사실, 오브젝트)에 저장하고 라벨부분에 변수로 넘겨야해요

 

BindFunc := Func("함수명")     ; '함수명' 함수를 BindFunc오브젝트에 저장
SetTimer, %BindFunc%, ...       ; BindFunc 오브젝트를 라벨로써 사용
Hotkey, F1, %BindFunc% ...

 

함수명()
{
 명령어...
}

 

 

05. %변수% 를 많이 사용한다면 % 변수 로 통일

 

오토핫키에서 트레디셔널이라고 불리는 방식으로 변수를 표현할때는 %변수% 를 사용합니다
트레디셔널 방식으로  변수를 사용하려면 아래 코드처럼 적어야합니다

 

이름 := "예지력", 성별 := "남자", 거주지 := "서울"
MsgBox, %이름% %성별% %거주지%

 

히자만 익스프레션 표현식을 사용하면 이럴 필요가 없죠

 

이름 := "예지력", 성별 := "남자", 거주지 := "서울"
MsgBox, % 이름 성별 거주지

 

익스프레션에 대해 알아보려면 클릭하세요

 

06. 파일인스톨을 사용하는 경우, .zip 파일로

 

배포할 프로그램이 실행파일외에도 다른 리소스가 필요할때 파일인스톨로 함께 컴파일하곤 합니다

 

FileInstall, 1.png, %A_Temp%\1.png
FileInstall, 2.png, %A_Temp%\2.png
FileInstall, 3.png, %A_Temp%\3.png
FileInstall ... ;언제 다 적지?

 

그런데, 이렇게 코드를 작성하려면 굉장히 귀찮습니다
이 문제가 코드가 길어지고 더러워보이는거 보다 더 심각하죠

 

이런 경우에는 리소스파일을 .Zip으로 압축하고, 프로그램 실행시 .Zip의 압축을 풀면 되겠습니다
* 윈도우 네이티브 오브젝트를 이용하니 알집과 같은 외부툴이 없어도 됩니다

 

FileInstall, 리소스.zip, %A_Temp%\리소스.zip, 1  ;ZIP 파일


Zip := ComObjCreate("Shell.Application")  ;쉘 오브젝트 생성
Folder := Zip.NameSpace(A_Temp "\리소스.zip")   ; .ZIP 압축파일 지정, 여기서는 임시폴더(A_Temp)\리소스.zip
NewFolder := Zip.NameSpace(A_Temp)                ; 압축을 풀 경로 설정, 여기서는 임시폴더(A_Temp)


NewFolder.CopyHere(Folder.items, 4|16)          ; 압축해제, 임시폴더(A_Temp)에 리소스.zip 압축을 품, 항상 덮어씌움

  1. 야크모 2015.10.21 14:00 신고

    감히 여쭙습니다.
    06. 파일인스톨을 사용하는 경우 의 소스 중에
    ;;;;;;;;;;;;;;;;;
    NewFolder.CopyHere(Folder.items, 4|16) ; 압축해제, 임시폴더(A_Temp)에 리소스.zip 압축을 품, 항상 덮어씌움
    ;;;;;;;;;;;;;;;;
    이 부분을 항상 덮어 씌움이 아닌 폴더 존재시 그냥 압축해제를 하지 않는 코드가 있는지 궁금합니다.

    매번 실행시 다수의 파일을 압축해제 시키다 보니 렉이 심하네요. 처음 실행때 압축해제 되어 특정 폴더에 파일이 해제된 경우
    재차 실행시에는 기존에 폴더가 존재함을 확인하고 그냥 넘어갈 수 있을까요?

    항상 많이 배우고 갑니다. 질문 전에 이 말씀 먼저 드렸어야 했었으나 이해부탁드립니다.^^

  2. 야크모 2015.10.21 15:00 신고

    IfNotExist, 폴더경로
    NewFolder.CopyHere(Folder.items, 4|16)

    이렇게 하니 가능하네요~ 조언 정말 감사드립니다.
    생소한 CopyHere 명령어에 당황해서 사실은 [4|16] 이것이 무슨 뜻인가 계속 알아보고 있었습니다;; 엉뚱한데서 헤매고 있었네요

    • BlogIcon 예지력 2015.10.21 15:01 신고

      4는 메시지창 안뜨게하는거고
      16은 메시지창 팝업시 모두 예를 클릭하는거에요

  3. 하얀늑대 2015.10.31 16:50 신고

    예지력님.
    압축푸는것요. 암호걸린것도 풀 수 있나요?
    또한 압축 파일 이름을 랜덤으로 할 수 있나요?
    예를 들어 url로 zip파일을 다운 받는데 다운받을때 파일 이름을 randome, filename 해서
    파일이름을 랜덤으로 생성하는겁니다.
    filename 이라는것 자체가 변수가된거니까 이걸로 해서 풀 수 있나요?

    • BlogIcon 예지력 2015.10.31 20:04 신고

      암호는 안됩니다, 윈도우 zip기능을 이용하는거라서요

  4. BlogIcon 〃련이 2015.11.12 23:24 신고

    Random, Images
    FileInstall, Images.zip, %A_Temp%\%Images%.zip, 1

    Zip := ComObjCreate("Shell.Application") ;쉘 오브젝트 생성
    Folder := Zip.NameSpace(A_Temp "\%Images%.zip") ; .ZIP 압축파일 지정, 여기서는 임시폴더(A_Temp)\ZipName.zip
    NewFolder := Zip.NameSpace(A_Temp) ; 압축을 풀 경로 설정, 여기서는 임시폴더(A_Temp)
    NewFolder.CopyHere(Folder.items, 4|16)
    bSetMode := 0

    이렇게 해서 압축을 풀고 싶습니다. 위에 보시면알겠지만 Random 함수에 변수를 줘서 파일이름을 랜덤으로 압축 풀게 해놨는데
    저기 압축푸는곳 이름에다가 뭐라고 입력해야 하는지요? 저런식으로는 풀리지가 않네요 방법이 있을까요?

    • BlogIcon 예지력 2015.11.13 00:26 신고

      A_Temp . "/" . Images . ".zip"

      아니면,
      Des_Path := "/" . Images . ".zip"
      A_Temp . Des_Path

      /는 \(역슬래시) 인거 확인하시고요, 수정하세요

  5. BlogIcon Rahs 2016.01.20 20:09 신고

    이상하게 같은 글인데도 볼때마다 느낌이 다르고 깊이가 달리 느껴지네요.
    훌륭한 글 감사합니다.

  6. dww 2016.02.12 19:09 신고

    혹시 압축푸는 거 말인데요
    c드라이브 system32 에하려면어찌?

  7. BlogIcon Ralpy Na 2017.01.17 22:26 신고

    함수 바인딩 배우고 갑니다 ^^

 

  • SetFormat 커맨드 사용을 자제하세요, 속도가 느려집니다
  • 기본환경변수를 제거해, 혹시모를 변수간의 충돌을 방지하고 성능을 높이기 위해서 #NoEnv 을 사용하세요
  • 오토핫키는 자동으로 최근 실행된 코드라인을 기억합니다, ListLines, Off 로 중지하세요
  • 오토핫키는 자체적으로 키로그를 남깁니다, #KeyHistory 0 으로 중지하세요
  • 프로세스의 우선순위를 높임으로서 성능향샹을 기대할 수 있습니다, Process, Priority,, High
  • Send 보다는 SendInput 을 사용하세요. 훨씬 빠르고 안정적(실행중엔 유저키입력 차단)이랍니다
  • 오토핫키는 기본적으로 라인마다 Sleep, 10 을 수행합니다, SetBatchLines, -1 으로 Sleep 을 제거해 속도를 높이세요
  • SetWinDelaySetControlDelay 를 사용해 WinControl 관련 명령어의 속도를 높이세요
  • SetKeyDelaySetMouseDelay 를 사용해 SendMouse 관련 명령어의 속도를 높이세요
  • VarSetCapacity 를 통해 사이즈가 큰 문자열변수의 메모리를 미리 설정해 속도를 높일 수 있습니다
  • 단순 true, false를 비교하는 if, else일 경우 Ternary Operator 를 사용하는것이 더 빠릅니다
  • 초기실행이후 사용되지 않을 변수는 메모리에서 제거하세요 변수명 := "" 또는 VarSetCapacity(변수명,0)
  • 코드의 메모리가 높아 줄이고 싶다면 대기상태의 라인에 DllCall("psapi.dll\EmptyWorkingSet", "Ptr", -1) 을 추가하세요

 

Reference

http://ahkscript.org/docs/commands/_NoEnv.htm
http://ahkscript.org/docs/misc/Performance.htm
http://ahkscript.org/docs/commands/VarSetCapacity.htm

http://ahkscript.org/boards/viewtopic.php?f=6&t=6413

  1. BlogIcon 오토핫키 2015.10.09 17:44 신고

    유용한 팁 매우 감사합니다.

  2. BlogIcon Rahs 2016.01.20 20:03 신고

    감사히 잘 보고 배우고 있습니다. 감사합니다!

  3. 2016.07.13 15:03 신고

    주옥같은 정보가 많네요. 포스트 하나하나 읽어보고 있습니다.
    코드 최적화하는데 굉장한 도움이 될것 같습니다. 정말 감사합니다.

 

오토핫키에서 값을 저장하고 불러오는 목적으로 .ini 파일을 사용할 수 있습니다

근데 단점은 너무 느리다는거죠, IniWrite으로 값을 저장할때 ~10개정도까지는 그렇다해도 양이 늘어나면 많이 느리다는걸 느끼실꺼에요

또한, 문법이 길고 FileName을 계속 지정해줘야 한다는 귀찮은 문제도 있겠네요

 

이러한 기존 Ini의 문제를 해결하고자 Verdlin 이 새로운 클래스를 만들어냈었습니다, 바로 Easyini

벤치마킹의 결과를 보시면 알겠지만, 기존 IniWrite 보다 1162% 더 빠릅니다

5만개의 값을 저장하는데 Easyini 클래스는 21초, IniWrite 은 4분 4초가 걸립니다

{
 iAhkPID := DllCall("GetCurrentProcessId")
 Process, Priority, iAhkPID, H
 
 vIni := class_EasyIni("test.ini")
 
 Loop 50000
 {
  if (!vIni.AddSection(A_Index, A_Index, A_Index, sError))
   sErrors .= sError "`n"
 } ; ~ 1초
 
 vIni.Save() ; ~ 20초
 
 Loop 50000
  IniWrite, %A_Index%, IniWrite.ini, %A_Index%, %A_Index%
 ; ~ 4분 4초
 return
}

 

또한 커스텀 클래스덕분에 네이티브 오브젝트처럼 접근해 사용할 수 있습니다

 

Easyini 다운로드 \Lib 폴더에 저장하거나 #include 하세요

class_EasyIni.ahk

 

문법

; ini 오브젝트를 생성,설정하기
vIni := class_EasyIni("파일명.ini")
 
; 어레이(배열)로 받고싶을때
for section, aKeysAndVals in vIni
   for key, val in aKeysInVals
      vIni[Section][key] := 1
 

; 배열로 ini 값을 가져올때 (ini 파일을 파싱할때)
vIni[SectionName을 변수로 받음][KeyName을 변수로받음] := 값

 

; 가장 일반적인 방법, 기존 ini 문법하고 비슷하죠?
vIni.Section이름.Key이름:= 값

vIni.Section이름[Key이름 변수로받음] := 값

vIni[Section이름 변수로받음].Key이름:= 값

 

예제

MyName := "예지력"

 

; ini 파일 오브젝트 생성하기
vIni := class_EasyIni("TEST.ini")

 

vIni.Section1["키이름1"] := "설정값1"

vIni.Section1["키이름2"] := "설정값2"

 

vIni.Section2["키이름1"] := "설정값1"
vIni.Section2["키이름2"] := "설정값2"

 

vIni.Section3["이름"] := MyName

 

; 저장하기 - 스크립트 경로에서 'TEST.ini' 파일이 생성됨
vIni.Save()

 

; 확인 목적으로 ini 파일 열기
try
 Run, TEST.ini
return

  1. 요시 2015.10.21 17:58 신고

    IniWrite,%제목%,검색순위.ini,제목,제목%ANum%
    이걸 문법으로 바꾸면 어떻게 될까요?
    테스트 해보는데 잘 안되네요.

  2. 요시 2015.10.22 01:12 신고

    예제를 보고 여러 방법으로 해보고 있는데 저장이 잘 안되서요.

    • BlogIcon 예지력 2015.10.22 01:36 신고

      라이브러리 파일 추가하고 예제 실행하신거맞으시죠?
      저장은 오브젝트.Save() 로 끝내야합니다

  3. 요시 2015.10.22 01:56 신고

    시작할때
    vIni := class_EasyIni("TEST.ini")
    vIni.제목[제목"ANum"] :=제목
    vIni.Save()
    이런식인가로 했었는데 저장이 안되더라고요.

    • BlogIcon 예지력 2015.10.22 03:20 신고

      value 로 들어가는 제목 이라는 변수에 값이 없으니까요....
      예제에서 값 저장하는걸 정말 보셔야겠어요 :)

  4. 요시 2015.10.22 08:23 신고

    이건 예제에서 보고 제가 잘 처리가 안되는 부분만 적은거고요. 실제로는 코드가 길어서 다올리긴 너무 많고 gui 디자인 다 되있고 거기서 리스트 뷰쪽에 제목이 다 들어가있어요. 그래서 lv_gettext로 제목도 다 얻어왔고요.

    • BlogIcon 예지력 2015.10.22 17:40 신고

      그러면 작성하신 코드를 확인해보시죠 :(
      제가 도와드릴 방법이 없습니다

      아래는 원문 Documentation 입니다, 참고하세요

      ; To create an ini object,
      vIni := class_EasyIni("MyIni.ini")

      ; To interface with the object,
      for section, aKeysAndVals in vIni
      for key, val in aKeysInVals
      vIni[Section][key] := 1

      vIni[VariableWithSectionName][VariableWithKeyName] := val ; this is typically used when you are looping through sections and keys
      vIni.NameOfSection.NameOfKey := val ; This syntax is the easiest, but you must know the literal section name and key name to do this.
      ; It is particularly useful for handling user-defined ini variables in your applications with relative ease.
      vIni.NameOfSection[VariableWithKeyName] := val ; This is when you know the literal section name
      vIni[VariableWithSectionName].key := val ; This is when you know the literal key name

  5. 포링 2016.03.30 23:35 신고

    섹션과 섹션사이에 빈줄을 주고싶은데 class_easyini.ahk 어디에 `n을 넣으면 되나요. 알려주세요 예지력님.

    • BlogIcon 예지력 2016.05.04 16:18 신고

      ini 파일을 저장하고 파싱으로 한 줄마다 `n을 추가해보세요.
      빈 섹션 빈 값을 줄 수는 없는 걸로 알고 있습니다?

  6. 오토소장 2016.08.13 15:48 신고

    오호 이 클래스 한번 써봐야겠네용 ㅎ

  7. 궁금이 2017.06.16 16:37 신고

    제가 잘 몰라서 질문 드립니다.
    혹시 이 클래스는 쓰기 기능만 있고 읽기 기능은 없나요? 읽기 기능도 있다면 어떻게 사용 하는지 궁금합니다.
    올려 주신 강의들은 잘 보고 있습니다.
    감사합니다.

 

독자가 기본적으로 오토핫키의 이해하고 사용한다는 가정하에 작성했습니다. 아래는 따로 설명하지 않습니다.

  • ㅡ If 조건식
  • ㅡ 익스프레션 변수에 대한 이해
  • ㅡ IfInString, MsgBox 명령어
  • ㅡ 함수에 대한 이해

 

파싱이란, 특정 변수에서 문자열을 추출해는것을 의미하는데요.

배포하는 프로그램에서 실시간 공지사항이나, 최신버전의 업데이트알림이 필요할떄가 있습니다. 이런 경우에 웹상의 정보를 파싱하면 되겠죠

 

파싱을 하기위해서는 먼저, 웹의 데이터를 받아와야하는데 일반적인 방법으로는

UrlDownloadToFile 함수로 웹페이지를 다운받거나, WinHttp로 웹페이지 텍스트를 변수로 저장하는데요

혹은 윈도우 API함수를 사용해 웹페이지를 메모리로 읽어올수도 있습니다.

여기에서는 윈도우 API를 사용하여 웹페이지를 메모리로 읽는 방법을 알아보도록 하겠습니다.

가장 빠르고, UrlDownToFile처럼 파일이 남지도 않습니다.

 

사실 파싱을 위한 가장 강력한 방법은 ActiveX로 HTML파일을 각 파트별로 읽어오는 방식입니다

파싱명령어나 정규식을 쓸 필요없이 페이지 정보를 가져오는 것이 가능하죠.

하지만 이번 글에서는 문자열을 추출하기위한 파싱에 대해서만 적고, ActiveX 파싱은 나중에 따로 작성하도록 하겠습니다.

 

필요 라이브러리

 

ReadURL(URL, encoding = "utf-8") {
 static a := "AutoHotkey/" A_AhkVersion
 if (!DllCall("LoadLibrary", "str", "wininet") || !(h := DllCall("wininet\InternetOpen", "str", a, "uint", 1, "ptr", 0, "ptr", 0, "uint", 0, "ptr")))
  return 0
 c := s := 0, o := ""
 if (f := DllCall("wininet\InternetOpenUrl", "ptr", h, "str", url, "ptr", 0, "uint", 0, "uint", 0x80003000, "ptr", 0, "ptr"))
 {
  while (DllCall("wininet\InternetQueryDataAvailable", "ptr", f, "uint*", s, "uint", 0, "ptr", 0) && s > 0)
  {
   VarSetCapacity(b, s, 0)
   DllCall("wininet\InternetReadFile", "ptr", f, "ptr", &b, "uint", s, "uint*", r)
   o .= StrGet(&b, r >> (encoding = "utf-16" || encoding = "cp1200"), encoding)
  }
  DllCall("wininet\InternetCloseHandle", "ptr", f)
 }
 DllCall("wininet\InternetCloseHandle", "ptr", h)
 return o

 

ReadURL.ahk

 

알고리즘

 

1. 프로그램을 실행하면, 웹 주소로 접속해 페이지정보(블로그 글, 개인 호스팅 등)을 읽어온다

2. 정보를 비교/분석후 다음으로 진행

 

아래 예제 코드에서 사용하는 주소는 저의 GitHub 주소를 사용합니다. 여기를 클릭해 웹페이지 정보를 확인해보세요

웹페이지에는 '안녕하세요' 라는 문자열이 있네요

 

#include ReadURL.ahk             ; 라이브러리 파일을 불러온다, /Lib 폴더에 라이브러리를 저장했다면 생략가능

URL := "https://raw.githubusercontent.com/Visionary1/-/master/README.md"                        ; URL라는 변수에 웹 주소 저장
Result := ReadURL(URL)                                 ; Result 라는 변수에 웹 주소를 읽어온 결과값을 저장 (안녕하세요 가 저장되겠네요)
MsgBox % Result                                          ; Result 변수 결과 출력

 

예제1.ahk

 

적용

 

*위 예제에서 사용한것처럼 주소를 GitHub의 Raw페이지를 이용한다면 HTML의 정보에는 텍스트뿐이라서 파싱이 정말로 쉬운데

개인블로그(네이버,티스토리 등) 등의 개인홈페이지를 사용한다면, HTML에는 많은 정보가 들어 있어 원하는 부분만 따로 잘라내야합니다. 따라서, 깃허브를 사용하실줄 안다면 사용하시는걸 적극 추천합니다.

 

이제 페이지정보를 읽어오는것은 문제가 없군요,

이제 웹페이지 정보를 나눠서 원하는 값만 추출하는, 파싱을 배워보도록 하겠습니다.

 

오토핫키에는 String 관련 명령어가있지만 웹페이지(HTML)에서 문자열 추출에는 적절하지 않습니다.

간결한 코드로 파싱이 가능한 정규식 RegExMatch 에 비해서 너무나 긴 코드를 요구하기 때문이죠.

 

단순히 서버온,오프 체크만 한다면야 단순히 IfinString 만으로도 체크가 가능하지만,

버전체크, 구버전일시 자동으로 새버전 다운로드주소로 이동하는 등의 작업을 하고싶다면 정규식을 사용해야 합니다.

파싱을 위한 정규식, RegExMatch 의 구문은 아래와 같습니다.

 

RegExMatch(읽어올변수,"제거할 앞 문자열(.*?)제거할 뒷 문자열",추출값변수)

 

주의하실점은 추출값을 표현할때는 추출값변수에 1을 붙여야합니다.

아래의 예를 확인하세요.

 

읽어올변수 :="제거할 앞 문자열/이 부분이 추출됨/제거할 뒷 문자열"

RegExMatch(읽어올변수,"제거할 앞 문자열(.*?)제거할 뒷 문자열",추출값변수)
MsgBox % 추출값변수1

 

예제2.ahk

 

결과는 예상가능하듯 아래 사진과 같습니다.

 

 

이제 더 나아가 웹페이지를 메모리로 읽은다음 정보를 파싱해볼까요?

예를 위해 제 블로그 글을 파싱해보겠습니다. http://knowledgeisfree.tistory.com/1

 

 

 

시각적으로 보이는 페이지는 위 사진과 같은데, HTML은 아래 사진과 같이 복잡합니다.

 

 

이와 같은 페이지에서 ProgramVersion에서 2.6 을

Announce 에서 "이제 네이버에서 제 블로그 검색이되요!" 등을 어떻게 파싱하는지 아래 예제를 확인하세요.

 

#inclue ReadURL.ahk

URL := "http://knowledgeisfree.tistory.com/1"
Version := 2.5

Address := ReadURL(URL)
IfInString, Address, Server/is/Online ;서버가 Online 상태인지 확인한다
{
    RegExMatch(Address,"@ProgramVersion/(.*?)@",Latest)
    RegExMatch(Address,"@Announce/(.*?)@",Notice)
    if (Latest1 > Version)
        MsgBox, 4164, , % "최신버전 " Latest1 "이 존재합니다`n다운받으시겠어요?"
        IfMsgBox, Yes
        {

RegExMatch(Address,"@Update/(.*?)@",Patch)
Run, %Patch1%

 }

MsgBox, % Notice1
}

 

예제3.ahk

  1. EmP 2015.03.15 11:43 신고

    강좌 잘 보고 있읍니다. 감사합니다.

  2. 몰래온 손님 2015.03.26 17:32 신고

    아이고 몇달을 찾다가 못찾은 것들을 다 찾았네요 감사드립니다...

    앞으로도 좋은 강좌 기대하겠습니다..

    늘 건강하시고 좋은일 많이 생기길 ~~~ 바랍니다 ^^

  3. 몰래온 손님 2015.03.26 17:36 신고

    아참 그런데 " 같은 특수문자가 있으면 `" 해도 안되던데.. 오토핫키에서 어떻게 정규식을 표현해야하나요?
    <span class="title_num">1-1 / 1건</span>
    예를 들면 저 사이에 1건을 가져와야하는데. .. 쌍따옴표가.. 있어서... 해결을 못하고 있네요..ㅠㅠ

    • BlogIcon 예지력 2015.03.26 21:03 신고

      따옴표는 /C 로 처리합니다

    • 몰라무서워 2015.11.09 18:06 신고

      댓글쓰는데 왜 금칙어가 있다면서 차단됐다고 나올까요?

    • 몰라무서워 2015.11.09 18:07 신고

      \C보다 따옴표 두개( "" )가 더 정확하게 작동되는거 같습니다.

  4. 오토핫키배움이 2015.03.29 14:33 신고

    예제가 다운후 바로실행하면 안돼는게 정상인가요???

    컴파일하고 관리자로 했는데도 static a := "AutoHotkey/" A_AhkVersion 에서 오류가나네요

    • BlogIcon 예지력 2015.03.29 20:59 신고

      제가 작성하는 오토핫키 환경은 오토핫키 L 유니코드 32비트 버전입니다. 베이직이시라면 사용이 안되실꺼에요.

  5. 오토핫키배움이 2015.03.30 14:52 신고

    버전 업되니 잘되네요 ^^

    한가지 질문드립니다.

    RegExMatch( R e s u l t , f u s i o n _ 3 " ( . * ? ) > < a h r e f = " 네 이 버 블 로 그 주 소 , a )

    를 하고 싶은데 " 때문인지 잘 안돼네요. 어떻게 해야하나요?

    금칙어때문에 띄엉쓰기했습니다.

  6. 질문 2015.04.01 21:34 신고

    혹시 오토핫키에 이미치처럼 일정텍스트를 찾아서 좌표를 알수있는방법은 없나요?

    글씨체가 변경되도 그곳을 찾을수있도록이요~

    • BlogIcon 예지력 2015.04.28 11:30 신고

      웹이라면 파싱으로 가능한데, 단순 이미지라면 힘들어요
      이미지를 사용한다면 아주 작은 부분을 캡쳐해서 해당부분을 이미지서치해야겠죠?

  7. 감사합니다 2015.04.27 18:16 신고

    예제3.ahk에서
    #inclue -> #Include로 수정해주세요

    • 감사합니다 2015.04.27 18:41 신고

      그리고 /C가 아니고 역슬래시C아닌가요?

      이건 질문인데요
      @ProgramVersion/2.6@
      @Server/is/Online@
      @Announce/3월 25일 어의 패치했습니다@
      @Update/http://knowledgeisfree.tistory.com/74@

      여기서
      Online@
      @Announce/
      추출하려고 하면 어떻게 하나요?

    • BlogIcon 예지력 2015.04.28 11:39 신고

      주로 모바일로 확인하느라 pc글은 수정이 안되네요-_-;

      네 역슬래시에요. 댓글에서 w로 나오길래 /로 표기했는데 전달이 잘못된거 같군요 ㅠㅠ

      Online@ 나 @Announce/ 같은걸 파싱하시려면 정규식보다는
      StringTrimLeft, StringTrimRight 등과 같은 문자열의 왼쪽,오른쪽에서 몇칸만큼 짜르는 파싱명령어를 사용하시는게 좋을듯해요.
      위 명령어로 구글검색하시면 관련글 많이 찾아보실수있을겁니다.

  8. 인생은타이밍 2015.05.20 07:09 신고

    RegExMatch(Result, "<(.*?)>", what)
    만약에 파싱을 할때 위에 명령에서 <여기> 사이에 잇는것이 많을경우에 여러개를 가져올수 잇나요?
    예를 들어서 URL 안에 <1번> <2번> <3번> 이렇게 되어잇으면 위에 명령어를 사용하면 결과는 1번만 나올텐데 3개 모두 나오게 할수는 없나요?

    • BlogIcon 예지력 2015.05.22 23:26 신고

      처음 1번의 위치를 StringGetPos 로 찾고 자르는 과정이 필요해요.
      웹페이지라면 iwb2learner 로 html의 컨트롤값을 따서 하는게 편합니다. 관련글을 국내사이트에선 찾기힘들고 구글링으로 찾아보시면 해외포럼에 글들을 확인해보실수있을거에요

  9. 연습생 2015.08.31 14:20 신고

    죄송합니다 댓글로 연습해보았습니다.. 다 지웠습니다 감사합니다.

  10. 질문 2015.10.28 01:56 신고

    ReadURL나 UrlDownToFile 로 네이버 검색결과를 불러오려는데 검색제한 소스가 읽혀오는데 어떻게해야하나요?

    • BlogIcon 예지력 2015.10.28 07:51 신고

      네이버같은 경우에는 WinHttp를 이용해야 할 것 같네요

  11. 감사해요! 2015.11.03 22:42 신고

    강좌 올려주신게 도움이 많이 되고 있네요ㅎㅎ
    정말 감사합니다!

  12. 고맙습니다. 2015.11.30 19:07 신고

    강좌 정말 잘 보고 갑니다.
    도움이 정말 많이 되었습니다.

  13. 궁금해요 2016.03.16 12:58 신고

    ReqExMatch Function 때문인지
    Call to nonexistent Function 오류가 뜹니다. 해결방법이 없을까요?

    • BlogIcon 예지력 2016.05.04 16:19 신고

      아뇨 오토핫키 자체 내장 함수라 해당 오류는 나올 수가 없습니다
      함수명을 제대로 적었는지 확인해보세요

    • 음흠 2017.06.30 19:55 신고

      REQ가 아니라 REG

  14. 고래사과 2016.05.10 09:48 신고

    오토핫키에서 한글을 분석해서 "한글" 이라면 ㅎㅏㄴㄱㅡㄹ 로 파싱할 수 있나요?

    • 고래사과 2016.05.10 09:49 신고

      한글
      -> ㅎㅏㄴㄱㅡㄹ
      -> GKSRMF
      -> 키보드에서 쳐지는 것처럼 다시 keyCode로 글자입력

      이게 가능할까요?


이건 뭐죠?


오토핫키 반응형 강의 프로그램입니다. 왼쪽에서 강의글을 읽고 오른쪽에서는 실제로 코드를 테스트해볼수있습니다.

오토핫키가 설치되지 않은 컴퓨터에서도 사용이 가능합니다.


프로그램 자체의 기능은 대부분 완성되었습니다.

그러나 아직 시리즈강의가 전부 추가되지않았고, 강의문서를 작성하는 기능을 좀 더 보완하려고합니다.

강의글을 작성하고, 강의글을 불러올때 예제코드를 함께 불러오고싶다면

강의파일(.html)명과 강의코드의 파일이름을 동일하게 만드시면됩니다. 예) 강의.html , 강의.ahk


다운로드


오픈소스 프로젝트로 진행됩니다. 외국포럼과의 교류를 위해 GitHub를 사용하고요. 소스를 직접 컴파일하기 위해서는 오토핫키가 필요합니다.


웹 백신으로 가상화 압축한 실행파일을 돌려보니, 57백신중에서 3군데서 오진을 하네요. 정 의심스러우시면 소스코드를 직접 컴파일하셔서 사용하세요.


오토핫키 반응형 강의.zip


단축 다운로드링크


참조

강의문서, 예제코드

AutoHotkey_L

CodeQuickTester

  1. Rahs 2015.02.24 22:08 신고

    우선 v3 lite에서 오진하는거야 그렇다치는데 일단 확인 후 실행하라 하더라도 .tmp 파일들로 인해 코드 실행 시마다 차단을 하네요.
    이건 오토핫키 사용자가 아니라도 코드 실행되도록 하려면 어쩔 수 없는 부분이라는 생각이 들긴 합니다.

    음 그리고 처음부터 진행해보니 sleep에서 아래와 같이 응용 프로그램이 종료가 되어 report 드립니다~

    문제 서명:
    문제 이벤트 이름: APPCRASH
    응용 프로그램 이름: 오토핫키 반응형 강의.exe
    응용 프로그램 버전: 0.1.0.0
    응용 프로그램 타임스탬프: 54e57ed9
    오류 모듈 이름: StackHash_0a9e
    오류 모듈 버전: 0.0.0.0
    오류 모듈 타임스탬프: 00000000
    예외 코드: c0000005
    예외 오프셋: 00000000
    OS 버전: 6.1.7601.2.1.0.256.1
    로캘 ID: 1042
    추가 정보 1: 0a9e
    추가 정보 2: 0a9e372d3b4ad19135b953a78882e789
    추가 정보 3: 0a9e
    추가 정보 4: 0a9e372d3b4ad19135b953a78882e789

    온라인 개인 정보 취급 방침 읽기:
    http://go.microsoft.com/fwlink/?linkid=104288&clcid=0x0412
    온라인 개인 정보 취급 방침을 사용할 수 없으면 오프라인으로 개인 정보 취급 방침을 읽으십시오.
    C:\Windows\system32\ko-KR\erofflps.txt

    • BlogIcon 예지력 2015.02.25 00:02 신고

      오류제보 감사합니다,
      현재 코드가 많이 불안정한것같네요,
      임시파일로 메모리에서 구동시키는건데 이게 윈도우설정이랑 충돌하는듯하구요

      주말에 짬내서 개발하는거라 업데이트가 많이 느립니다ㅠ, 말씀하신 오류에 대해 금요일밤부터 분석해야겠습니다

  2. 이밤의끝 2015.03.03 19:47 신고

    안녕하세요~ 다름이아니라 궁금한게있어서요.. 제가 게임 매크로를 제작할려고하는데
    오토핫키가 안걸리더라구요 다행이,,그래서 스크립트짤라구 이렇게
    F1::
    Loop{mouseclick,x좌표,y좌표,} 이런식으로 짯는데 어쩔땐 마우스 클릭이 되구 어쩔땐 안되더라구요,,혹시 해결법 아시나여?

    • BlogIcon 예지력 2015.03.03 22:53 신고

      MouseClick, Left, x좌표, y좌표 로 해보세요
      게임에 사용하시나요? 일반적으로 보안프로그램이있는 게임은 오토핫키명령어를 차단합니다

  3. 이밤의끝 2015.03.05 08:33 신고

    아아 빨리쓰느라 제대로 못쳣네요.
    loop{mouseclick,left,x좌표,y좌표} 이렇게 치는데 클릭이 될때가 있고 안될때가 있습니다.게임내에서도 차단해서 그런건가요?
    이게임이 x트렙이란게 있는데 그걸 없앴거든요. 그래서 x트렙이없는데 그대로 클릭이 안될때가있는건가요?
    그럼어떻게 해결해야되죠??

    • BlogIcon 예지력 2015.03.05 12:04 신고

      루프안에 슬립명령어를 조금 넣어보시고, 마우스 좌표를 조금 수정하면서 클릭을 진행해보세요

  4. 이밤의끝 2015.03.12 13:39 신고

    슬립명령어를 넣어도 그렇던데..그래서 MOUSEMOVE로 좌표로이동뒤 클릭으로했는데도 안되더라구요..

    • BlogIcon 예지력 2015.03.12 22:20 신고

      소스파일 실행하지마시고 컴파일한다음에 관리자권한으로 실행해보셔서 테스트해보시겠어요?

  5. 오토핫키배움이 2015.03.29 14:35 신고

    msvcr100.dll 오류가뜨는데 왜그런건가요??

    • BlogIcon 예지력 2015.03.29 21:01 신고

      윈도우 파일이 설치되지 않으셔서 그렇습니다.
      네이버에 해당오류 검색하시면 해결방법 쉽게 찾으실수있어요.

    • BlogIcon 예지력 2016.01.19 08:37 신고

      네 h버전이라 필요한건데 무슨 말씀이시죠?!

    • 지나는이 2016.01.19 08:40 신고

      주인장님 답변 보고 빵터지네요;; 오류라고 말씀하시는 자체가 오류네요 ㅎㅎ
      아니 대체 언제부터 오토핫키 실행이 msvcr100.dll 런타임 패키지랑
      관련이있었나요?? 컴에 dll 파일이 없어도 전혀 관련이 없지요ㅡ,ㅡ;;
      그 오류 메세지 보는것 자체가 오류입니다;;
      해당오류는 주인장님 자체가 백프로 오토핫키 H 버전으로 컴파일해서 그런겁니다 H 버전은 /MT 제한으로 해당 파일이 필요합니다
      오토핫키 장점이 이런 잡다한 파일이 없어도 자유롭게 실행가능한 것이 최대 장점인데 참....
      L에 비해서 H 버전은 컴파일시 바이러스 토탈에서 오진을 거의 안하니 배포하는 입장에서 보기에는 좋지요~~ 아무튼 님 오류는 오토핫키 실행과 전혀 관계가 없습니다

    • 지나는이2 2016.05.20 13:01 신고

      위에분 잘난척 하지말고 그냥 지나가던 길 지나가면 안될까요??

      무슨부심인지 모르겠는데 갑툭튀해서 고까운 말투로 지적질하니까 보기 안좋네요

  6. 질문자 2015.04.05 22:50 신고

    안녕하세요
    개인 및 지인 유포 목적으로 Edit 기능을 이용한 Gui방식의 프로그램을 하나 만들었습니다.
    그런데 컴파일 하는 과정에서 제 컴퓨터에 맞춰 64비트 컴파일링을 했으나, 32비트 컴퓨터에선 정상 작동(아예 돌아가질 않음.)
    하지 않고, 32비트 컴파일링후 64비트 컴퓨터 실행시 Edit에 한글을 출력하는 과정에서 문자가 깨져서 나옵니다.
    예지력님은 어떻게 컴파일링 하시나요??

  7. 병아리프로그래머 2015.05.19 15:45 신고

    안녕하세요?
    정말정말 감사합니다
    덕분에 많이 배우고 , 매크로도 만들어서
    잘사용하고 있습니다 감사합니다.(__)
    그리고 여쭤볼게 있는데요.
    강의 더 듣고싶은데 강의소스 다운받아서 들으면 되나요?

    • BlogIcon 예지력 2015.05.22 23:21 신고

      네 그렇게 하셔도 됩니다, 기본적인 코드이해가 되신다면 외국포럼에서 스크립트 하나하나 분석해가시면서 배우시면 될것같네요

  8. ㅎㅎㅎ 2015.07.16 20:33 신고

    오토핫키에 관심을 가지고 찾게 되었는데 매댓글마다 반응해주시는 모습이 멋지십니다. 파이팅!

  9. 저런.. 2015.07.23 17:45 신고

    코드 실행만 누르면 튕겨버리네요 해결좀 부탁드립니다..ㅠㅠ

  10. 초보 2015.07.26 15:38 신고

    안녕하세요.
    저도 코드 실행만 누르면 '오토핫키 반응형 강의의 작동이 중지되었습니다.' 이런 요류메시지와 함께 튕겨버려요..
    강의 꼭 듣고 싶은데 어떻게 해야할까요?

    • 초보 2015.07.26 15:39 신고

      아 참고로 윈7 64비트 입니다

    • BlogIcon 예지력 2015.07.26 22:45 신고

      64비트는 호환성문제때문에 작동오류가 날거에요.
      예제를 실제로 확인해볼수있는 장점이 있을뿐 불로그에 작성된 강의글과 비슷한 내용을 다루니 글을 읽어보시는 것도 좋을듯 싶네요

  11. 지나가는나그네 2015.08.12 23:03 신고

    오토핫키를 이제 막 시작하는 사람으로 이런 프로그램이 있다는 것 자체가 정말 축복이네요.
    감사하게 잘 쓰겠습니다. 꾸벅.
    살짝 궁금한 점: AHK Academy는 뭘로 만드신건가요?

  12. NaNu 2015.12.12 11:50 신고

    강의 너무 감사해요
    짧아서 아쉬워요!!

  13. 2016.04.04 17:50

    비밀댓글입니다

    • BlogIcon 예지력 2016.05.04 16:15 신고

      실수가 있었네요, 오토핫키 헬프 파일 보시면 모든 버튼을 알게 되실 거예요

  14. 초보 2016.06.09 07:44 신고

    오토핫키 폼에 가가라이브나 유챗을 넣어봤는데
    채팅에서 엔터키가 먹히지않더군요

    1.
    오토핫키도 자바스크립트를 사용할수있나요?

    2.
    유챗 또는 가가라이브 같은 채팅창에서 엔터키를 눌러도
    채팅이 되는방법.

    혹시 알고계시면 도움부탁드립니다.

 

미니 에디터

사용법이 말할것도 없을정도로 간단합니다! 명령어 적으시고 실행누르시면 소스코드(.ahk) 저장 할 필요없이 실행됩니다.

강의글에서 사용하는 예제나, 다른 흥미로운 코드를 테스트해볼떄 지저분하게 코드파일을 계속해서 저장하지 않아도 됩니다.

 

네이버가 제공하는 프로그래머용 글꼴 '나눔고딕코딩' 을 기본으로 사용합니다.

그리고 드래그드롭이 가능하니, 불러오기 할 필요없이 소스코드를 드래그드롭하시면 자동으로 파일을 불러옵니다.

 

또한, 임시코드보관함을 사용해서 수정전의 코드를 임시로 보관하거나 예제를 바꿔가며 테스트가 가능합니다!

 

 

저는 개발할때는 Scite4AutoHotkey 를 사용하고, 예제 등을 테스트할때는 이걸 사용하네요.

유용하게 쓰시길 바랍니다!

 

미니 에디터.zip

 

Credits : GeekDude, Lexikos, szujeq

Based on GeekDude's CodeQuickTester

Last Modified by Soft (2015/02/18)

  1. 그리고나 2015.05.14 19:35 신고

    드래그 앤 드롭이 안되어서 더 불편하네요;;
    본문에는 드래그 앤 드롭이 가능하다 하셨으나
    파일명에 방패마크를 보니 아마도 Compile_AHK_를 사용하여 관리자 권한 실행을 넣으셨네요
    윈도우8 사용자 계정은 관리자권한을 넣으면 드래그 앤 드롭이 안됩니다
    기본적인건데 아마도 아실텐데 잠시 깜빡 하셨나봅니다
    관리자 권한을 빼고 재 컴파일 부탁합니다
    귀찮으시면 소스 경로 좌표 좀 부탁합니다

    • BlogIcon 예지력 2015.05.14 21:55 신고

      오토핫키 소스에 권한을 올려놓고 빌드한거라 관리자권한으로 컴파일됬나보군요. 저도 윈도우8인데, 사용자권한수준을 낮춰어서 그리고나님 컴퓨터에서 그런 문제가 생길지 몰랐습니다.

      제가 현재 모바일이고, 최근에는 컴퓨터하는 시간이 아예없어서 당장은 수정버전이나 소스코드를 올려드리긴 힘들듯하네요. 여유가 생기면 바로 올려볼게요.

      급하시다면, 네이버에 윈도우8 드래그드롭 검색으로 락을 해제하는 방법을 알아보세요.
      http://housegod.tistory.com/156

오토핫키는 GUI(Graphical User Interface) 를 쉽게 사용할 수 있습니다.

단순히 입력명령어들로만 매크로를 제작할수있지만, 보다 직관적인 프로그램을 위해서는 인터페이스가 제공되어야겠죠

또한 기본 윈도우 외관에서 벗어나, 아래처럼 새로운 스킨들로 개성있는 인터페이스창을 만들수있습니다.

 

필요한 파일

ㅡ USkin.dll 파일이 필요합니다 여기를 클릭해 다운로드하세요.

ㅡ 테마(스킨)파일이 필요합니다, 위 링크에 'skin.zip' 을 다운받으세요.

ㅡ 라이브러리 함수가 필요합니다. AutoHotkey/Lib 폴더 혹은 자신의 소스코드와 동일한 경로에 두세요.

SkinForm(Param1 = "Apply", DLL = "", SkinName = ""){
    if(Param1 = Apply){
        DllCall("LoadLibrary", str, DLL)
        DllCall(DLL . "\USkinInit", Int,0, Int,0, AStr, SkinName) ; For 유니코드
        ;DllCall(DLL . "\USkinInit", Int,0, Int,0, Str, SkinName) ; For ANSI
    }else if(Param1 = 0){
        DllCall(DLL . "\USkinExit")
        }
}

SkinForm.ahk

GUI 창에 적용하기

USkin.dll 은 기본 GUI의 외관 리소스파일들을 교체함으로서, 오토핫키 문법에 아무런 영향을 주지 않습니다.

따라서, DllCall로 USkin.dll의 함수를 꺼내쓰고 기존의 코드는 수정할것이없습니다.

스크립트 최상단에 아래의 코드를 입력하세요, 모든 GUI의 리소스파일이 테마파일로 교체됩니다.

SkinForm(Apply, A_ScriptDir . "\USkin.dll", A_ScriptDir . "\스킨파일명.msstyles")

GUI창을 닫을떄, 핸들이 새는것을 막기위해 USkin.dll 을 종료해야합니다

SkinForm(0)

아래 코드는 'Milkymac.msstyles' 스킨을 사용하는 GUI 예제입니다.

#NoEnv
#SingleInstance force
SkinForm(Apply, A_ScriptDir . "\USkin.dll", A_ScriptDir . "\Milikymac.msstyles")
OnExit, GetOut
Gui, add, button,xm w100 h40, Button
Gui, add, edit, xm y+20 w100 h20, Edit
Gui, add, listbox,xm y+20, ListBox
Gui, add, checkbox,xm y+20, checkbox
Gui, add, DDL, xm y+20, DropDownList
Gui, Show, AutoSize, Test
return

GetOut:
GuiClose:
Gui, Hide
SkinForm(0)
ExitApp
return

SkinForm(Param1 = "Apply", DLL = "", SkinName = ""){
    if(Param1 = Apply){
        DllCall("LoadLibrary", str, DLL)
        DllCall(DLL . "\USkinInit", Int,0, Int,0, AStr, SkinName)
    }else if(Param1 = 0){
        DllCall(DLL . "\USkinExit")
        }
}

예제.ahk

 

스킨파일(.msstyles) 이 많아 하나하나 확인해보고싶은데 너무 귀찮으시죠? 각 스킨을 미리보기로 미리보는 '프리뷰' 프로그램을 사용하세요

USkin.dll이 있는 폴더에서 실행하세요!

프리뷰.zip

  1. BlogIcon 오토핫키 2015.09.18 14:50 신고

    이야 이런게 있는진 몰랐네요. 잘 쓰겠습니당 -0-

  2. 박지민 2016.02.11 12:35 신고

    이런기능이 있엇다니 정말.. 대단한거같습니다.
    다만 dll이랑 msstyles가 다른위치에 잇으면 스킨이 적용되지않던데

    혹시없어도 적용되는 방법이 잇을까요?

  3. 2016.07.07 17:35 신고

    진짜 설명엿같이해놨네 이걸어떻게따라하냐? 3시간따라하다가 포기한다 ㅆㅂ

  4. ㅇ1 2016.07.07 18:02 신고

    설명진짜 엿같이해놓으셨네요 이걸어떻게따라합니까 여기 다 오는사람들 초보인데 ㅡㅡ

  5. 오핫개미 2016.08.27 21:46 신고

    예지력님 안녕하세요. 오핫카페에서 활동하는 오핫개미입니다.
    예지력님 글 보고 다행히 GUI 에 스킨을 입힐 수 있게 되었습니다. 감사합니다.
    궁금사항이 있는데 타이틀바에 폰트 색을 바꾼다던가 타이틀바의 길이를 늘리는 등은 어떻게 하나요?

    • BlogIcon 예지력 2016.08.28 22:57 신고

      제가 알고 있는 한에서는 저도 모릅니다
      시스템 설정에서 관련하는 부분으로 알고 있어서요

  6. ㅇㅇ 2016.09.09 16:53 신고

    잘쓰고있다가 갑자기 어느순간부터 컴파일을하면 gui스킨이 적용되지않습니다.
    갑자기 그러는데 왜그런지 아시나요?

  7. 프로 2016.10.19 18:11 신고

    그 스킨입히고 컴파일후 더미다 패킹을하면 스킨이 몇몇부분에서 적용이 풀리던데 해결방법 아시나요ㅠ

  8. 왕초보 2017.05.15 00:36 신고

    윈도우포럼의 왕초보라고 합니다..
    좋은것을 배우고 갑니다..
    항상 좋은일만 있으세요..

  9. 궁금 2017.07.16 07:53 신고

    위에 다운스킨 말고 새로 스킨 따로만들어서 적용할 수 있나요?

    가능하다면 어떤 프로그램으로 스킨 수정이 가능한가요?

  10. dsaafds 2017.10.22 00:10 신고

    스킨적용이 안되시는분은 오토핫키 32비트버전을 이용해주세요.
    만약 아니라면 지랄마세요 64비트쓰고있는거맞으니까 닥치고 32비트깔으세요.

  11. 초보 2017.12.05 22:53 신고

    전 3일차 초보인데 이정도면 엄청 친절한 설명인거 같고요
    예제도 있고, 감사하게 잘 사용중 입니다.
    이것도 못하시는 분들은 오토핫키는 커녕
    간단한 유틸 프로그램 조차 못다루시는 분들 같은데 ㅋㅋ

  12. jk 2018.02.15 17:44 신고

    windows 10에서 실행해보고 있는데, 잘 안되네요. exe로는 제대로 보이는데..
    path도 맞고요. 아마 환경적인 문제로 보이는데..

    • jk 2018.02.15 17:56 신고

      확인해보니 64bit라서 안되나 봅니다.
      T.T

시작하기 전에

1. FileInstall 명령어를 아셔야합니다. 여기를 클릭하시면 명령어 설명으로 이동합니다

2. DllCall 명령어를 아셔야합니다. 여기를 클릭하시면 설명으로 이동합니다.

3. 외부 DLL파일이 필요합니다. 여기를 클릭해 다운로드페이지로 이동합니다

가상화 방법

bxsdk32.dll 파일을 소스코드파일과 동일한 경로에 위치시키세요.

특정 폴더를 가상화시키기 위한 코드는 아래와 같습니다.

hModule := DllCall("LoadLibrary", str, A_ScriptDir "\bxsdk32.dll") ; DLL파일을 불러온다
DllCall("bxsdk32\BoxedAppSDK_Init") ; DLL파일을 시작한다
DllCall("bxsdk32\BoxedAppSDK_CreateVirtualDirectoryA", AStr, 폴더경로, Int, 0) ; 폴더경로 를 가상화한다

가상화를 종료하고, DLL파일을 닫기 위한 코드는 아래와 같습니다.

DllCall("bxsdk32\BoxedAppSDK_Exit") ; 가상화를 종료한다
DllCall("FreeLibrary", "UInt", hModule) ; DLL파일을 닫는다
  1. 까망 2015.02.27 10:35 신고

    질문있어요
    폴더 가상화 했는데 100M정도요
    근데 '시스템 호출에 전달된 데이터 영역이 너무 작습니다' 오류 메세지가 뜨는데
    100M면 너무 큰가요?

    • BlogIcon 예지력 2015.02.27 18:04 신고

      아뇨, dll에 따른 문제는 아닐껍니다. 다른 요인때먼이라고 생각되네요
      근데100mb 정도의 파일을 가상으로 추가하고싶으시면 패커나 BinRun 라이브러리로 애초 파일에 내장해두는것이 좋을거같습니다.

  2. 용가리맨 2015.03.02 21:56 신고

    가상화 하면 장점이 먼가요

    • BlogIcon 예지력 2015.03.03 22:50 신고

      실제 디스크를 쓰지않으니, 리소스파일들을 컴퓨터에 설치할필요가없어 깔끔한 싱글 파일로 배포가 가능하겠죠?
      외장하드같은 경우에는 깨울필요가없고

  3. 요이요이 2015.04.14 00:31 신고

    안녕하세요 질문 하나만 드리고싶은데요

    혹시 L버전에서는 정상작동하는데 왜 베이직버전에선 정상작동을 안할까요? 되게하는 방법은 없나요..?
    버전별 DLLCall을 열어보았는데 특별히 다른점은없더라구용.. 답변주시면 감사하겠습니다 ^^!

    • BlogIcon 예지력 2015.04.15 22:43 신고

      문법에 조금 변경이 생기고, 기능추가가 L에서 됬으니까요
      베이직은 업데이트가 중단된지 7-8년 정도 됬습니다...

  4. 최고에요 2015.05.02 18:44 신고

    오토핫키 베이직 버전을 사용해서 가상화할수있는 방법은 없을까요?
    이미지 화일이 너무 많아 지저분하고 , 어떤 이미지를 이용하는지 노출되면 안되는 까닭에 여기까지 왔습니다 만, 제가 베이직밖에는 쓸줄몰라서 곤혹스럽네요.
    다른 방법은 없을까요...

    질문한김에 질문하나더 드려봅니다.
    텍스트문서로 만들어진 로그인정보를 불러오는 매크로를 작성했는데.. id와 password가 그대로 노출되있어서 해결책이 없을까 싶습니다.
    감사합니다.

    • BlogIcon 예지력 2015.05.04 21:37 신고

      베이직은 제가 사용을 안해서 방법을 모르겠습니다

      아이디와 패스워드가 그대로 노출된다는게 텍스트문서에 표기되어있기 때문인가요? 그렇다면 텍스트문서를 암호화하는 방법이 있겠네요

  5. 최고에요 2015.05.04 22:59 신고

    아.. 그러니까 암호화하면 되겠다는건 알겠는데.. 그 방법을 어찌해야할지 몰라서요... 너무 막연한질문인가요..

    • BlogIcon 예지력 2015.05.08 08:42 신고

      AES 암호화 등의 방법을 사용해서 텍스트파일을 암호화하고
      오토핫키에서 FileRead나 다른방법으로 텍스트파일을 읽을떄 복호화 과정을 거쳐야합니다.
      구글링으로 autohotkey encryption 찾아보면 많이 나오니까 확인해보세요. 단순히 댓글로 설명하기에는 관련 소스가 너무 많습니다.

  6. dww 2016.02.21 19:15 신고

    혹시예지력님이 올리신 gui 스킨을파일을 가상화하려고하는데
    아무리 해봐도 안되네요 ㅠㅠ 도움좀

  7. 가상화궁금증 2016.03.02 18:12 신고

    안녕하세요 테일에서도 가상화 방법보고 예문을 가지고 해봤는데요..
    hModule := DllCall("LoadLibrary", str, A_ScriptDir "\bxsdk32.dll") ; DLL파일을 불러온다
    DllCall("bxsdk32\BoxedAppSDK_Init") ; DLL파일을 시작한다
    DllCall("bxsdk32\BoxedAppSDK_CreateVirtualDirectoryA", AStr, A_Temp, Int, 0) ; 윈도우 임시폴더를 가상화
    FileInstall, test.txt, %A_Temp%\test.txt, 1 ; 임시폴더에 test.txt 파일을 설치
    Run, %A_Temp%\test.txt ; 임시폴더의 test.txt 파일 실행
    return

    이대로 실행을하면 test.txt파일을 찾을수 없습니다라고 뜹니다.

    그런데 또 동봉된 예문 jpg로된 스크립은 됩니다.. 어떤부분이 문제일가요?

 

자동화는 오토핫키가 가장 특화한 영역입니다. 많은 분들이 오토핫키에 발을 들이는 이유이기도하지요.

이 글을 읽고나면 업무자동화 등 반복적인 작업을 자동화하는 프로그램은 직접 제작하실수있습니다.

 

시작하기 전에

 

오토핫키에 아직 미숙하신 분여기를 클릭해 소스코드 생성과 컴파일방법을 확인하세요.

ㅡ 이 글은 반복적인 작업자동화 프로그램 제작 강의글입니다.

ㅡ 소스코드 작성에 필요한 모든 명령어,문법 등을 다룹니다. 따라서, 방대한 글이 될 것입니다.

ㅡ AutoHotkey_L 1.1.19.1 유니코드 버전에서 작성했습니다. 설치는 여기를 클릭하세요

ㅡ 오토핫키 공식에디터 Scite4AutoHotkey 를 사용합니다. 설치는 여기를 클릭하세요

 

 

사용할 명령어 필수인것은 '필수' 알아두면 도움이 되는것은 '옵션'으로 표기합니다

 

  • ㅡ [필수] HotKey 지정문법
  • ㅡ [필수] Send / SendPlay / SendInput / SendMode
  • ㅡ [필수] Click / MouseClick / CoordMode
  • ㅡ [필수] Sleep
  • ㅡ [필수] Loop / Break / Continue
  • ㅡ [필수] If / Else / 변수 표현식
  • ㅡ [옵션] ImageSearch / PixelSearch
  • ㅡ [옵션] ControlSend / ControlClick
  • ㅡ [옵션] Run / RunWait
  • ㅡ [옵션] SetTimer / Critical
  • ㅡ [옵션] WinActivate / WinWaitActive
  • ㅡ [옵션] Gui 문법 / MsgBox / Reload 문법
  • ㅡ [옵션] 자세한 Expression / 연산자 / 변수 문법
  • ㅡ [옵션] SingleInstance / 스크립트 설정 문법
  • ㅡ [옵션] Object / Array 문법
  • ㅡ [옵션] ActiveX 문법 / 웹 자동화

 

 

필수 명령어

 

1. HotKey 지정문법

HotKey 핫키 는 키보드 키 또는 키조합입니다. 핫키를 설정한 다음에 핫키를 누름으로써 특정액션을 취하게 설정할 수 있습니다.

 

A::
MsgBox, A키 눌렀네
Return ; 여기까지 실행하고 끝낸다

 

※ 세미콜론 ; 는 주석으로 일종의 코멘트입니다. ; 이후의 말은 코드실행에 아무런 영향을 주지않습니다.

위 소스코드를 적고, 실행해보세요. 키보드 A(한글 ㅁ)키를 누르면 "A키 눌렀네" 라는 메시지박스가 나옵니다.

 

 

HotKey 정리

따라서, 핫키를 지정하고 사용하는 방법은 아래와 같습니다.

 

핫키지정::

핫키를 눌렀을시 실행할 명령어

Return

 

추가로, 핫키지정은 'A' 처럼 단독 키뿐만아니라 컨트롤(Ctrl), 알트(Alt), 키와 조합이 가능합니다.

ㅡ 컨트롤(Ctrl) 키는 ^ 로 표현하고

ㅡ 알트(Alt) 키는 ! 로 표현합니다

 

^A::
MsgBox, 컨트롤 + A 키를 눌렀네요
Return
!A::
MsgBox, 알트 + A키를 눌렀네요
Return

 

 

2. Send / SendPlay / SendInput / SendMode

Send 는 키보드입력을 보내는 명령어입니다.

SendPlay 는 게임키입력에 최적화되어있는 Send명령어입니다. (한글입력 불가)

SendInput 은 Send보다 빠르고 안정적인 Send입니다.

 

!X::
Send, 이것이 Send명령어입니다 {Enter} ; 이것이 Send명령어입니다 입력후 엔터
SendPlay, This is SendPlay {Enter} ; This is SendPlay 입력후 엔터
SendInput, 이것은 SendInput {Enter} ; 이것은 SendInput 입력후 엔터
return

 

 

위 소스코드에서 확인할수있듯이,

엔터와 같은 키보드 자체의 키를 표현하기 위해서는 { } 괄호를 사용해야합니다.

Enter 로 적으면 엔터키가 아니라 "Enter" 라는 문자를 적겠죠.

따라서 컨트롤키는 {Ctrl}, 알트키는 {Alt}, 스페이스바는 {Space}, Esc는 {Esc}, Home 키는 {Home}, PgUp키는 {PgUp} 등으로 표시해야합니다.

 

Send와 SendPlay 그리고 SendInput 등 따로따로 적어서 사용할수도 있지만

SendMode, 사용할모드 를 적어주면 Send로도 Send사용모드 로 자동변환되어 사용할 수 있습니다.

아래 코드를 확인하죠

 

SendMode, Input  ; 모든 Send명령어를 SendInput 방식으로 변환한다
!X::
Send, {a}  ; SendInput, {a} 와 동일한 성능을 구현합니다.
Send, {A}

return

 

추가로, 위 코드의 결과에서 {a} 와 {A} 가 어떻게 다른지 확인이 가능하죠?

Send, {a} 는 소문자 a를 입력하고

Send, {A} 는 대문자 A를 입력합니다.

 

Send 정리

따라서, Send는 아래의 예처럼 사용합니다.

 

SendMode, Input  ; 모든 Send명령어를 SendInput 방식으로 변환한다
!X::
Send, 입력할 문자/문자열
Send, {입력할 키}
return

 

 

3. Click / MouseClick / CoordMode

두 명령어 둘다 마우스클릭을 합니다.그러나 Click이 MouseClick 보다 간단해서 더 자주 사용합니다.

 

Click 

현재 마우스커서 위치에서 마우스왼쪽버튼 클릭

Click 44,55 

컴퓨터화면 x좌표 44 y좌표 55 지점을 마우스 왼쪽클릭 

Click Right 44, 55

컴퓨터화면 x좌표 44 y좌표 55 지점을 마우스 오른쪽클릭 

Click 2

현재 마우스커서 위치 마우스왼쪽버튼 2번 클릭 

Click Down 

마우스 왼쪽 버튼을 누르고 있는다.

Click Up Right 

마우스 오른쪽 버튼을 뗀다.

Click %변수1%, %변수2%

컴퓨터화면 x좌표 변수1, y좌표 변수2를 마우스 왼쪽클릭 

 

Click 명령어에서 사용되는 X좌표와 Y좌표는 CoordMode 좌표설정명령어의 영향을 받습니다.

따로 CoordMode 명령어를 명시하지않을시, Screen 좌표로 설정됩니다.

가능한 Screen 좌표는 사용하지않는것이 좋습니다. 밑으로 내려가면서 이유를 설명하죠

 

Screen 좌표는 컴퓨터 전체화면에서의 좌표를 뜻합니다.

컴퓨터 해상도 1920 * 1080 의 경우 화면 왼쪽 맨위에서부터 0,0으로 좌표는 시작됩니다.

오른쪽으로 갈수록, X좌표값이 증가하고

아래로 내려갈수록, Y좌표값이 증가합니다.

그러므로, 화면 오른쪽 맨아래의 좌표는 1920, 1080 이 됩니다.

 

정확한 좌표를 확인하기 위하여 오토핫키 설치시 제공되는 프로그램을 이용해보겠습니다.

본인 컴퓨터의 오토핫키 설치폴더로 가면 'AU3_Spy.exe' 이라는 파일이 있습니다, 실행하세요.

 

 

실행하고, 바탕화면 빈공간을 클릭해보세요.

 

 

사진의 빨간색으로 표시한 부분에서

Absolute, Relative 그리고 Client 가 보이시나요?

 

Absolute 는 Screen 좌표를 뜻합니다. = 컴퓨터의 전체화면에서의 좌표

Relative 는 활성창의 좌표를 뜻합니다.= 활성창의 좌표, 현재는 활성창이 바탕화면

Client 는 활성창의 작업창(최소호,최대화,닫기)를 제외한 좌표를 뜻합니다. = 사용빈도 X

 

위에서 Screen 좌표를 사용을 최대한 지양하라 했습니다.

그 이유의 예로는,

스크린 좌표를 이용해서 프로그램 내의 특정부분을 클릭하게 만든 경우

프로그램의 위치를 이동하면 엉뚱한 부분을 클릭하기 떄문입니다.

위 사진은 활성창이 바탕화면이기 때문에 Screen좌표와 Relative 활성창좌표가 동일한것일뿐

 

따라서 무조건 프로그램 자체내의 좌표, =활성창 좌표 Relative 를 이용하는 것이 좋습니다.

활성창좌표는 창을 기준으로 (0, 0) ~ (창크기X좌표, 창크기Y좌표) 로 되어있겠네요.

 

한번 활성창좌표와 Click 을 사용하여 에디터창의 스크립트실행 버튼을 눌러보도록 하겠습니다.

 

 

에디터 Sctie4AutoHotkey 의 스크립트시작 버튼의 Relative 좌표를 확인해야겠죠?

X좌표 397, Y좌표 64이네요.

 

또한 소스코드에 Click 명령어가 클릭하는 좌표가 활성창좌표라는 것을 명시해야합니다.

CoordMode, Relative 로 적어두면 소스코드에 표기하는 모든 좌표를 활성창 기준으로 잡습니다.

 

CoordMode, Relative  ; 좌표모드를 Relative 활성창 기준으로
!X::
Click 397,64 ; 활성창 397, 64 좌표를 클릭
return

 

실행결과는 예상한대로입니다. 시작버튼을 클릭하네요!

그런데 스크립트를 실행시킨상태에서 또 다시 시작버튼을 누르면 아래와 같은 확인메시지가 출력됩니다.

 

 

이미 스크립트가 실행되고 있으므로, 새로 실행할 것인지 묻는 메시지군요

'예' 를 누르면 새로실행할것이고, '아니요'는 새로실행하지 않습니다.

위 메시지와 관련한 모든부분은 [옵션]의 SingleInstance / Reload 부분에서 다룹니다.

 

Click 정리

따라서, Click 명령어는 아래의 예처럼 사용합니다.

 

CoordMode, Relative  ; 모든 좌표를 활성창으로 설정한다
!X::
Click, x좌표, y좌표 ; 활성창 x좌표 y좌표 클릭
return

 

 

4. Sleep

키보드, 마우스입력을 했다가 잠시쉬고 다시 입력을 보내고 싶으시죠?

잠시 쉬는것이 'Sleep' 명령어입니다.

 

SendMode, Input
!X::
Send, 안  ; '안' 입력
Sleep, 3000 ; 3000 밀리세컨드 즉, 3초동안 쉰다
Send, 녕 ; '녕' 입력
return

 

밀리세컨드로 시간을 표기해야하므로, 1초는 1000 이 되고, 5.5초는 5500 이 되겠습니다.

 

Sleep 정리

따라서, Sleep 명령어는 아래의 예처럼 사용합니다.

 

핫키지정::
명령어 1
Sleep, 밀리세컨드
명령어 2
Sleep, 밀리세컨드
명령어 3
명령어 4
Sleep, 밀리세컨드
return

 

 

5. Loop / Break / Continue

Loop는 반복문입니다. Break와 Continue는 반복문을 제어하는 명령어이구요.

 

A키를 반복적으로 입력하거나, 오토마우스 처럼 한 위치를 계속해서 클릭하고 싶을때 Loop를 사용합니다.

설마 아래처럼 하시는 분은 없겠죠...

 

!X::
Send, A
Send, A
Send, A
Send, A
Send, A
return

 

Loop를 이용하면 아래처럼 소스를 작성할 수 있습니다.

 

!X::
Loop, 5   ; 괄호안의 명령어를 5번만큼 반복한다
{
 Send, A
}
return

 

Loop명령어는 폴더개수, 특정 확장자 파일의 개수와 모든이름을 구하는등 다양한 활용이 가능하지만

이 글에서는 명령어반복만을 강의하도록 하겠습니다.

 

계속해서 진행하죠

 

!X::
Loop, 5
{
 Send, 안녕하세요 {Enter}
}
MsgBox, 끝났네요
return 

 

위 코드의 실행결과가 어떨지 예상이 되시나요?

 

Loop 괄호 { } 안의 명령어를 5번만큼 반복하고, 괄호밖을 나오게되는데

괄호 밖의 MsgBox 명령어를 만나 '끝났네요' 라는 메시지를 띄우고 return을 만나 끝납니다.

 

반복할 횟수를 생략한다면 무한반복이 됩니다.

 

!X::
Loop
{
 MsgBox, 이 창은 계속 뜹니다
}
return

 

무한반복을 종료하는 방법으로 Break 를 이용합니다.

그전에 먼저 A_Index 라는 오토핫키의 반복문 내장변수에 대해 짚고 넘어가겠습니다.

 

A_index (대소문자 구별X) 은 반복문이 몇번째로 실행중인지 카운트해주는 내장변수입니다.

내장변수 = 자체적으로 값이 설정되는 변수

 

!X::
Loop
{
 MsgBox, % A_Index
 if (A_Index = 5)
  break
}
MsgBox, 5번 실행하고 나왔네요
return

 

위 코드의 결과는 아래와 같습니다

 

 

 MsgBox % A_Index
 if (A_Index = 5)
  break

 

이 부분을 설명해보겠습니다, A_Index 는 반복문의 실행횟수를 저장하는 변수라고 했습니다.

그 변수를 메시지박스로 표현하려면 % 퍼센트 표시를 붙여줘야합니다.

% 없이 적는다면 "A_Index" 라는 글자를 보여주기 때문이죠.

% 표기를 함으로써, 문자나 숫자가 아닌 변수의 저장된 값을 불러옵니다.

 

MsgBox, A_Index  ; A_Index 라는 글자를 띄움
MsgBox, % A_Index  ; 반복문 횟수를 표현
MsgBox, %A_Index%  ; 반복문 횟수를 표현

 

% 하나와 % % 두개에 대한 자세한 설명은 이후의 [필수] 변수 표현식 에서 설명합니다.

 

다음으로 If (A_Index = 5)

If (A_Index = 5) 는 보기만해도 대충 짐작이 가시죠?

A_Index 변수의 값이 5가 될때 다음 명령어를 진행합니다.

 

다음 명령어는 Break 네요,

반복문을 탈출하는 Break는 Loop 괄호밖으로 빠져나갑니다.

Loop 괄호밖에는 '5번 실행하고 나왔네요' 라는 메시지박스가 있네요.

그러므로, 코드의 결과는 위 이미지와 동일합니다.

 

Break 명령어는 가장 가까운 Loop { } 괄호를 빠져나갑니다.

현재의 { } 괄호를 탈출하는것이죠.

무슨 말인지 다음 코드에서 확인해보세요

 

 !X::
Loop
{
    Loop
    {
        MsgBox, 처음실행
        break
    }
    MsgBox,  새끼 루프 탈출
    break
}
MsgBox, 외곽 루프 탈출
return

 

좀 복잡하신가요? ㅎㅎ

실행결과를 보시면 이해가 쉬울거에요

 

 

알고리즘을 순서대로 적어보겠습니다.

0. 알트 + X 핫키를 누르면

1. '처음실행' 메시지박스 출력

2. Break 명령어로 현재의 괄호(= 가장 가까운 Loop) 탈출

2. 괄호밖의 '새끼 루프 탈출' 메시지박스 출력

4. 2번째 Break 명령어로 현재의 괄호 (= 가장 가까운 Loop) 탈출

5. 괄호밖의 '외곽 루프 탈출' 메시지박스 출력

6. return 을 만나 종료

 

그럼 Continue 는 Break 와 다른점이 무엇일까요?

차이점은

Break는 괄호를 탈출시켜서 Loop 반복문을 끝낼수있지만

Continue 는 괄호의 끝으로 가 Loop 반복문을 다시 반복합니다. 즉, 끝나지않습니다.

 

Continue 예제를 하나 확인하겠습니다

 

!X::
Loop, 10
{
    if (A_Index < 5)
        continue
    MsgBox, % A_Index
} ; Continue 는 바로 여기로 이동
return

 

코드를 실행해보면,

메시지박스가 5,6,7,8,9,10 을 차례대로 출력됩니다.

 

A_index, 루프 반복이 5번 미만일때는 Continue 명령어때문에  } 로 이동합니다. 탈출하는것이아닙니다.

그리고 다시 A_Index 값 확인, 5미만이면 } 로 이동, 5이상이면 메시지박스 출력.

루프 횟수를 10으로 설정했으니 이러한 과정을 10번만 거치게됩니다.

 

Loop / Break / Continue 정리

따라서, 반복문과 반복문 탈출은 아래의 예처럼 합니다.

 

!X::
Loop, 횟수, 생략시 무한반복
{
    명령어
    break ;반복문 탈출
}
MsgBox, 반복문 탈출했네요
return

 

 

6. If / Else / 변수와 표현식

If 와 Else 는 조건식입니다. 위에서 간단한 예시로 확인해봤고 실제로도 쓰임은 전혀 복잡하지 않습니다.

A_Index 라는 변수에 대해서도 잠깐 훑어보았는데,

이 챕터에서 조건식과 ,변수, 그리고 이 모든것을 사용하기위한 표현식에 대해서 자세히 배워보도록 하겠습니다.

 

Age = 20     ; Age 라는 변수에 숫자 20을 저장한다
MsgBox, % Age

 

'Age = 20' 이 보이시죠?

주석의 설명대로 Age 라는 변수에 숫자 20을 저장하는겁니다.

 

오토핫키에서 변수는 자료형(데이터의 타입) 을 명시할 필요가 없습니다.

굉장히 편리하죠 C언어는 변수마다 각각 지정해줘야 하는 번거로움이 있는데 말입니다.

 

한가지 중요한점. 변수명은 오토핫키의 명령어나 내장변수(A_index 등) 으로 설정하면 안됩니다.

 

따라서, 변수는 이렇게 지정하는거군요!

 

변수명 = 변수에 저장할 값
Height = 180   ; Height 라는 변수에 숫자 180을 저장
Gender = 남자   ; Gender 라는 변수에 '남자' 라는 문자열을 저장

 

변수1에 변수2의 값을 저장하고 싶다면 어떻게 코드를 작성해야 할까요.

'변수1 = 변수2' 로 하니 '변수1'에는 변수2 라는 문자열이 저장됩니다.

아까 % 표기를 했다는것을 기억하시나요? 여기서도 동일한 문법이 적용됩니다.

 

Age1 = 20                  ; Age1 라는 변수에 숫자 20을 저장
Age2 = %Age1%        ; Age2 라는 변수에 변수 Age1(숫자20)을 대입 
Age3 = Age1             ; Age2 라는 변수에 Age1 이라는 문자 저장

 

위 변수의 표현식은 트레디셔널 이라고 부릅니다. 

표현식엔 종류가 2가지 있는데요. 한가지가 지금 설명한 트레디셔널, 두번째는 익스프레션 입니다.

 

If 조건식과 앞으로 오토핫키를 깊이있게 사용할 생각이 있으시다면,

가능한 표현식은 익스프레션으로 사용하는것이 좋습니다.

이유는 If 조건식과 대부분의 '~식'들이 익스프레션을 사용하기 때문인데요

 

그러면 익스프레션을 또 배워야 하나? 머리아픈데..

아닙니다. 트레디셔널과 정말 비슷합니다 간단해요.

 

Age1 := 20             ;Age1 에 숫자 20을 저장
Age2 := Age1         ;Age2 에 변수 Age1 을 대입
Gender := "남자"   ; Gender라는 변수에 '남자' 문자열 저장 

 

= 대신에 := 을 쓰고, 변수를 대입할 때 % % 표시를 하지않네요.

중요한점은 문자를 저장할때는 " " 따옴표처리를 해야한다는것입니다.

 

그러면 정리하겠습니다.

결국 (익스프레션) 변수는 이렇게 사용하는군요.

 

변수명 := 저장할 숫자
변수명 := "저장할 문자"
변수명 := 대입할 변수명

 

숫자변수끼리는 서로 값을 연산할수도 있습니다.

 

변수명 := 변수명1 + 변수명2       ; 변수명1 과 변수명2를 더한 값을 변수명에 저장
변수명 := 변수명1 - 변수명2       ; 뺀 값을 저장
변수명 := 변수명1 * 변수명2       ; 곱한 값을 저장
변수명 := 변수명1 / 변수명2       ; 나눈 값을 저장

 

문자변수끼리는 문자를 누적이 가능합니다.

 

Apple := "사과"              ; Apple 이라는 변수에 문자 사과 를 저장
Juice := "주스"              ; Juice 이라는 변수에 문자 주스 를 저장
Total := Apple . Juice      ; Total 이라는 변수에 변수 Apple과 변수 Juice 의 값을 누적
MsgBox % Total           ; 사과주스 라는 문자가 출력된다

 

이제 그럼 If , Else 와 연관지어 공부해보겠습니다.

 

Apple := 700
Juice := 300
내야할돈 := Apple + Juice                 ;내야할돈 이라는 변수에 Apple변수와 Juice 변수의 더한값을 저장
가진돈 := 3000
거스름돈 := 가진돈 - 내야할돈           ;거스름돈 이라는 변수에 가진돈 변수에서 내야할돈 변수의 뺸값을 저장
if (내야할돈 > 가진돈)                        ; 만약 내야할돈 변수의 값이 가진돈 변수의 값보다 크다면
    MsgBox, 가진돈보다 비쌈              ; 가진돈보다 비쌈 메시지박스 출력
else if (내야할돈 < 가진돈)                ; 만약 내야할돈 변수의 값이 가진돈 변수의 값보다 작다면
    MsgBox, 거스름돈 %거스름돈% 원 남습니다         ; 거스름돈 계산한 메시지박스 출력
else                                                                  ; 그것도 아니라면 (=가진돈과 내야할돈이 같다면)
    MsgBox, 거스름돈 0원 남겠네                          ; 거스름돈은 0원 남겠군
return

 

실행결과는 짐작할수 있듯이,

 

 

If / Else / 변수와 표현식 정리

 

변수명1 := 저장할 값 또는 변수명
변수명2 := "저장할 문자"
if (조건식)
    조건식이 참일 경우 실행할 명령어 한개
else
    조건식이 거짓일 경우 실행할 명령어 한개
return
; 실행할 명령어가 2개 이상일 경우 { } 괄호로 묶어준다.
if (조건식)
{                  ; 조건식이 참일 경우 괄호의 명령어를 수행함
    첫번째 명령어
    두번째 명령어
    N번째 명령어
}
else               ; 조건식이 거짓일 경우 괄호의 명령어를 수행함
{                       
    첫번째 명령어
    두번째 명령어
    N번째 명령어
}
return

 

 

옵션 명령어

 

1. ImageSearch / PixelSearch

ImageSearch 는 화면에서 이미지를 찾는 명령어입니다. PixelSearch 는 픽셀(점)에서 색상을 찾고요.

이미지서치는 오토핫키에서 가장 핫한 명령어가 아닐까 생각하네요.

[옵션] 으로 분류하기는 했지만 사실상 필수라고 봐도 무방할 정도로 활용도가 높습니다.

 

이미지서치 사용하기위해서는 당연히 찾을 이미지, 즉 이미지파일이 필요하겠죠?

캡쳐뜨는 프로그램은 여러가지이니 원하는거 사용하시면 되겠습니다.

저의 경우 기본적으로 윈도우에 설치되어있는 그림판 을 사용합니다.

 

예로서, 이미지서치를 사용해 내 컴퓨터의 로컬 디스크를 클릭하는 코드를 짜보겠습니다.

내 컴퓨터 창을 캡쳐한다음 로컬 디스크 부분은 잘라야겠죠?

 

 

사각으로 선택해서~

 

 

저 부분만 자르겠습니다.

따라서 이미지는 아래사진과 같겠네요.

 

 

그리고 저 이미지파일을 저장합니다, 반드시 영어이름으로 저장합니다.

저는 'MyCom.png' 로 저장하겠습니다. 소스코드와 동일한 경로에 저장해두세요.

 

이제 코드를 살펴보죠

 

A::
ImageSearch, vx, vy, 0, 0, A_ScreenWidth, A_ScreenHeight, MyCom.png
if ErrorLevel = 0         ; 만약 이미지를 찾았을 경우에는 괄호의 명령어를 수행
{
    Click %vx%, %vy%         ; 이미지찾은 위치 X좌표 Y좌표 클릭
    MsgBox, 찾음                ; 찾음 메시지박스 출력
}
else if ErrorLevel = 1           ; 만약 이미지를 못찾았을 경우에는
    MsgBox, 못찾음             ; 못찾음 메시지박스 출력
return                               ; 여기까지 수행하고 종료

 

A키를 누르면 화면에서 소스파일의 경로의 'MyCom.png' 이미지파일을 찾습니다.

 

그런데 이미지를 찾았는지 못찾았는지 확인을 해야하지않습니까?

그것을 확인할수있는것이 ErrorLevel 내장변수입니다.

이미지파일을 찾았을 경우에는 에러레벨이 0 이 되고, 못찾았을 경우에는 1 이 됩니다.

2로 될때는 이미지파일이 경로에 없어 불러들이지 못하는 경우입니다.

 

MyCom 이미지파일의 전체경로를 적어야하지만, 이미지가 소스코드파일과 같은 경로에있을경우는

앞 경로를 삭제하고 이미지파일명.확장자 만 적어줘도 무방합니다. 위 코드처럼요.

 

간략한 설명을 했으니 이제 이미지서치에 대해 자세히 알아보겠습니다.

 

ImageSearch, 찾은X위치, 찾은Y위치, 시작X, 시작Y, 지점X, 지점Y, 이미지파일경로\이미지파일명.확장자

 

찾은위치X, Y에는 이미지파일의 X,Y좌표가 저장되는 변수입니다. CoordMode 의 영향을 받습니다.

변수명X, 변수명Y 로 적어줘야합니다. 저장이 필요없다면 그냥 생략하고 , 로 넘길수있습니다.

 

시작X, Y 에는 이미지파일을 서칭을 시작할 X,Y좌표를 적습니다. CoordMode 의 영향을 받습니다.

지점X, Y 에는 이미지파일을 서칭을 끝낼 X,Y 좌표를 적습니다. CoordMode 의 영향을 받습니다.

 

시작좌표와 끝 지점좌표를 잘 명시해주면

이미지서치에 걸리는 시간과, 경우에 따라 발생하는 렉을 방지할 수 있습니다만

좌표 구하기가 귀찮기 때문에, 그냥 전체화면에서 찾는게 편합니다.

 

ImageSearch, 찾은X위치, 찾은Y위치, 0, 0, A_ScreenWidth, A_ScreenHeight, 이미지파일경로\이미지파일명.확장자

 

좌표 (0,0) 부터 (A_ScreenWidth, A_ScreenHeight) 까지가 전체화면입니다.

 

A_ScreenWidth, A_ScreenHeight 는

앞서말한 A_index 처럼 내장변수 (= 자체적으로 값이 설정되는 변수) 입니다

 

무엇으로 설정되냐구요?

A_ScreenWidth 는 컴퓨터해상도 X좌표

A_ScreenHeight 는 컴퓨터 해상도 Y좌표 가 되겠습니다.

 

해상도가 1920, 1080 인 컴퓨터의 경우에 A_ScreenWidth 는 1920, A_ScreenHeight 는 1080이 되겠네요.

 

작성중입니다.

  1. 이전 댓글 더보기
  2. 2015.12.13 00:10

    비밀댓글입니다

  3. 2015.12.13 08:25

    비밀댓글입니다

  4. 벚길 2015.12.28 16:59 신고

    저 이미지 서치 부분에서 소스코드 파일경로와 이미지 경로를 같게해도 계속 못찾음이라고 뜨는데 무슨 문제인가요?

  5. 진짜 2015.12.31 15:54 신고

    이렇게 이해하기 쉽다니 놀랍습니다.

  6. Settimer 2016.01.03 06:37 신고

     안녕하세요.

    요즘 settimer를 이용해서 프로그램을 짜고 있는데요.

    settimer 문장을 한번만 실행하고 다음부터는 실행을 하지않습니다.

    도저히 해결이 되지 않아 질문을 해볼까합니다.

    도와주시면 감사하겠습니다. ㅠ.ㅠ

    ↓밑에 소스를 간단히 적었구요.

    ━━━━━━━━━━━━━━━━━━━━━━━━━━━━




    시작:

    {








    내용~~




    goto,검색







    }

    return







    검색:

    {


    {

    시간 := 딜레이*6000
    SetTimer, 휴식, %시간%

    (return) ;;;; [return]을 넣으면 휴식이라는 문장은 잘되는데 [return]밑에 내용은 실행이 되지않습니다.

    왜그러는 걸까요?

    }




    loop

    {


    pixelgetcolor,~~~~~~~~~~

    지정한 좌표에 색값이 달라지면

    {




    goto,확인




    }







    }







    }

    return




    확인:

    {





    이미지서치 (이미지 발견 못함)

    {


    goto,검색

    }

    }

    return

    끝:

    {

    }

    return




    휴식:

    {


    내용

    }

    rerturn






















    ━━━━━━━━━━━━━━━━━━━━━━━━━━━━

    • BlogIcon 예지력 2016.01.03 09:47 신고

      return은 서브루틴(함수,goto,gosub)를 끝내는 명령어니까요

  7. 2016.01.04 12:21

    비밀댓글입니다

  8. 123213 2016.01.07 16:42 신고

    센드, 한글입력시 한글이 입력안되고 꿻뚫 이런식으로 출력되는데 무슨문제일까요

  9. 오토핫키입문자 2016.01.07 19:44 신고

    안녕하세요 예지력님 글들을 꼼꼼히 읽어봤는데요 한가지 궁금증이 듭니다.
    한 키를 꾹 누르거나 또는 한 키를 지정된 시간(1초나 2초나 1.5초 등등) 동안만 누르게 하는 명령어는 없나요?
    Sleep은 조금 다른 개념같아요.. 찾아봐도 없는것 같아 질문글 올려봅니다.
    예를 들어서 스페이스키를 1.5초동안만 누르고 싶다 라고 하면 어떤 명령어를 사용해야 할까요?

  10. 안녕로봇 2016.01.10 19:27 신고

    엔터키를 누르는 명령어인데 메모장에선 잘 실행이되나
    게임안에서 엔터키 입력이안됩니다. 게임상에서 백스페이스 입력도 되는데 엔터키 입력은 안됩니다.
    샌드플레이로도 해보고 했는데 안되네요 어떻게해야할까요.

    그리고 위 예제처럼 이것은 sendinput을 출력하려고하면
    알파벳 sendinput이 출력이안되고
    이것은 ㄴ두야ㅞㅕㅅ 이런식으로 한글로 출력해버리는데 왜이럴까요

  11. 부르르갓 2016.02.01 00:03 신고

    특정 좌표 안에서만 이미지서치하게 하는 방법은 없나요?

  12. 235 2016.02.14 00:17 신고

    감사합니다 많은 도움이 됐습니다.

  13. 예지력님최고 2016.02.15 18:16 신고

    예지력형님 정말 궁금하면서 저의 브레인 으로썬 도무지 알 수 가 없는 질문 하나만 남겨봅니다.. 답글 주셨으면 가문의 영광이겠습니다..
    텍스트 파일 맨윗줄을 불러와 어느곳에 붙여넣기하고 그 붙여넣기한 맨윗줄 하나만 삭제하는 스크립트를 짜고싶습니다
    하지만 삭제 부분에서 막혀서 답답해죽겟습니다 한줄한줄 차례로 붙여넣기는 잘되는데 붙여넣기한 맨윗줄 하나 삭제가 안됩니다..
    도와주세요 ㅠㅠ 참고로 fileread,clipboard,txt.txt 문구를 사용하였습니다

  14. 네뷸라메크로사용자 2016.02.18 13:54 신고

    오토핫키 편집프로그램 SciTE4AutoHotkey 을 다운받아서
    네뷸라 메크로를 편집하려고그러는데
    프로그램을 연후

    AdventureHeroHandler()
    {
    if(IsImagePlus(clickX, clickY, "Image\Hero\Hero.bmp", 60, 0))
    {
    if(checkHero)
    {
    Click(clickX, clickY)
    AutoStrengthenHero()
    HeroAutoSelling()
    checkHero := 0
    if(IsImagePlus(clickX, clickY, "Image\Adventure\Start.bmp", 60, 0))
    Click(clickX, clickY)
    }

    이부분을 아래처럼 추가해서

    AdventureHeroHandler()
    {
    if(IsImagePlus(clickX, clickY, "Image\Hero\Hero.bmp", 60, 0))
    {
    if(checkHero)
    {
    Click(clickX, clickY)
    if(IsImagePlus(clickX, clickY, "Image\Hero\Hero-2.bmp", 60, 0))
    {
    Click(clickX, clickY)
    AutoStrengthenHero()
    HeroAutoSelling()
    checkHero := 0
    if(IsImagePlus(clickX, clickY, "Image\Adventure\Start.bmp", 60, 0))
    Click(clickX, clickY)
    }


    이런식으로 바꾸려고하는데요

    문제는 바꿧을때 프로그램이 아예 열리지 않습니다

    찾아보니 프로그램을 정상적으로 열려면 bite수를 맞춰줘야된다고 하는데 (변환전 = 변환후)

    이쪽으로 아예 문외한이라서 어떤방식으로 접근해야되는지 전혀 모르겠네요..

  15. 2016.02.21 14:01 신고

    Error: Error opening the destination file
    이건 어떻게 해야하나요;;

  16. 송아지 2016.03.04 10:51 신고

    죄송하지만 이미지서치기능말고 텍스트 서치기능은 없나요?

  17. Dante 2016.03.15 14:15 신고

    질문 있습니다. 예를들어 몬스터 이미지를 스샷찍어서 해놓으면 그 배경까지 적용이 되는겁니까?
    사소한 바닥 균열이라던가하는 것까지 적용이 되는 것입니까?

  18. Dante 2016.03.15 14:16 신고

    그냥 몬스터 자체의 이미지만 적용이 되는 것입니까?

  19. 시몬 2017.02.25 17:59 신고

    저는 자동 물약을 만들어 볼까 하는데요 ..이미지서치로 하려면 어떻게 응용해야 될지 모르겠어요 ..
    하나가 아니라 두개니까요 .. ㅠㅠ

  20. 바다새 2017.06.20 19:40 신고

    도스 시절 foxpro하고 클리퍼라는 프로그램하고 비슷한가봐요.

  21. 빨간달팽이 2017.12.14 21:32 신고

    정말 잘 보고있고 잘 배우고있습니다.
    혹시 글 작성을 멈추신건가요? 아니면 현재 진행중인건가요?

    • BlogIcon 예지력 2017.12.14 21:33 신고

      현재 좀 바빠서 잠시 멈춘 상태입니다 ㅜ

    • 빨간달팽이 2017.12.15 03:42 신고

      아아 그렇군요!
      천천히 기다리겠습니다 ㅋㅋㅋㅋ
      오토핫키를 처음 배우고있는데 여러군데에서 정보를 얻었었는데 예지력님이 해주시는 설명이 가장 이해하기 쉽고 편해서 매일 이용하고있습니다. 화이팅이에요!

 

오토핫키 스크립트 (.ahk) 파일은 오토핫키의 명령어코드가 포함된 소스코드를 말합니다.


오토핫키 설치된 컴퓨터에서는 스크립트파일을 실행할수있지만, 설치되지 않은 컴퓨터에서는 실행이 불가능합니다.

따라서 그러한 경우에는 파일의 형태를 바꾸는 과정이 필요하고


오토핫키 언어로 된 소스파일(.ahk) 을 단독 실행파일(.exe)로 바꾸는 과정이 컴파일입니다.


한번 소스코드를 작성해 실행파일로 컴파일해볼까요?

 

1. 소스파일(.ahk) 작성하기


먼저 바탕화면이나, 폴더에서 빈공간에 마우스 오른쪽 클릭후

메뉴가 나타나면, '새로 만들기' → 'AutoHotkey Scripts' 를 선택하세요.

 

 

새 AutoHotkey Script.ahk 라는 파일이 생성될것입니다. 파일을 오른쪽클릭해, 'Edit Script'를 클릭하세요.

그러면 에디터가 열리고 아래사진과 같은 소스코드를 보게됩니다.

 

 

 

간단한 메시지를 띄워보기 위하여 소스코드를 작성해보겠습니다.

5번줄 이후에 아래 명령어를 적어보세요.

 

MsgBox, 안녕하세요 

 

그리고 실행해보기 위해서 키보드 F5 또는 아래 사진에서 빨간색으로 표시된 지점을 클릭하세요.

 

 

실행결과는 아래와 같습니다.

 

 

 

2. 소스코드 컴파일

 

한번 exe파일로 만들어볼까요?

아래 사진처럼 'Compile' 을 클릭하세요. 폴더에 '새 AutoHotkey Script.exe' 가 생성됩니다.

 

  1. soolty 2015.03.12 02:06 신고

    scite4프로그램으로 script를 편집할 때, 이 블로그에 설명된 대로
    바탕화면-> 우측 클릭 ->새로 만들기 ->AutoHotkey Script
    로 스크립트를 생성 후, 다시 그 생성된 파일을 우측 클릭 -> Edit Script
    과정을 통해 에디트 할 때는 소스코드 작성 과정에 이상이 없는데,
    왜 scite4에서 직접 새 창을 열어서 소스 코드를 작성하게 되면 이상이 생기는거죠? (특히 한글을 쓰게되는 경우)

    비주얼 스튜디오 같은 경우에는 직접 프로젝트를 열고, 거기서 파일 형식을 정하게 되므로
    이것도 그런 형식이라면 에러가 나는 것을 이해할 수 있겠는데,
    이 프로그램은 목적 자체가 AutoHotkey 를 위한 건데, 그렇다면 대부분의 소스가 ***.ahk 확장자를 목적으로
    쓰여지는 게 당연할 텐데, 이 프로그램은 왜 자체적으로 새로운 소스코드를 작성할 때 오류가 생기는 건가요?

    소스파일을 만들려면 꼭 이 바탕화면 새로만들기 과정을 거쳐야 하나요? Scite4 자체적으로 다른 방법은 없을까요?
    실질적으로 제가 궁금한건 사실 이 부분입니다.

    • BlogIcon 예지력 2015.03.12 22:15 신고

      한글은 알파벳과 바이트스가 달라서 유니코드로 인코딩하셔야합니다
      Scite로 새파일 열으셨으면 File - Encoding - UTF-8 With bom 으로 저장해주세요

  2. soolty 2015.03.13 01:23 신고

    아 역시 유니코드 문제였군요. 감사합니다.

  3. EmP 2015.03.15 11:28 신고

    강좌 잘 보고 있읍니다. 감사합니다.

  4. 사라만더 2015.04.16 02:41 신고

    잘보고 갑니다 차근차근 하나씩 배워봐야겟네요 ㅎ

  5. GG 2015.07.20 18:56 신고

    저는 오토핫키 스크립트 에딧 누르면 다른사람들처럼 오토핫키창이 안뜨고 메모장만 뜨는데 어떻게하면 다른사람과 같은 창을띄울 수 있을까요........

  6. 양능호 2015.08.24 12:09 신고

    반복메크로는 에디터실행하고 컴파일한 exe파일하고 실행속도가 차이가 크나요...
    Click과 mouseclick의 차이점 좀 알수있을까요

    • BlogIcon 예지력 2015.08.24 20:18 신고

      실행속도 차이는 없습니다.
      Click은 간단한 마우스클릭(좌)에만 사용되고 MouseClick은 오른쪽, 휠버튼 등 옵션까지 설정가능해요

오토핫키는 DllCall 명령어를 통해 dll파일 API을 사용할 수 있습니다.

막강한 Windows API는 물론이고요.

 

DllCall을 이용해 API를 사용하기전에 알아두어야 할 것이 있습니다.

1. Dll 파일의 이름과 경로 그리고 함수명

2. 함수에 필요한 자료형

3. 함수 반환값의 형태

 

추가로, DLL파일의 API는 C++ 문법으로 작성되어있으므로 오토핫키 문법으로 변환하는 작업이 필요합니다.

아래 '타입'에서 설명합니다.

 

DllCall의 신택스는 아래와 같습니다.

 

Result := DllCall("[DllFile\]Function" [, Type1, Arg1, Type2, Arg2, "Cdecl ReturnType"])
결과값 := DllCall("dll파일명\함수명", 타입1, 줄값1, 타입2, 줄값2, "Cdecl 반환자료형")

 

ㅡ Arg 줄값이 변수라면 " " 따옴표없이 작성합니다.

ㅡ 현재 변수보다 긴 값을 저장한다면, 'VarSetCapacity' 명령어를 이용해야합니다.

ㅡ 반환자료형이 INT, BOOL, 또는 없으면 생략이 가능합니다.

ㅡ dll파일명은 dll파일의 전체경로를 적어주셔야합니다. 하지만 아래의 Dll의 경우 생략이 가능합니다.

  • - Kernel32.dll
  • - User32.dll
  • - Comctl32.dll
  • - GDI32.dll

 

마이크로소프트 Window API 함수 리스트

 

Type 타입

 

C++ 문법 

오토핫키 문법 

CHAR

Str 

LPCTSTR 

Str 

LPTSTR 

Str* 

LPSTR 

Str 

TCHAR* 

Str* 

INT 

Int 

LONGINT 

Int 

BOOL 

Int 

HWND 

Int 

PTR 

Int 

LLPOINT 

Int 

HBRUSH 

Int 

HBITMAP 

Int 

LPDWORD 

Int* 

LPVOID 

Int* 

INT64 

Int64 

Uint 

Uint 

DWORD 

Uint 

LPDWORD 

Uint* 

RECT* 

int / int64 

WORD

uShort 

BYTE 

Char / UChar 

Float 

Float

DOUBLE 

Double 

 

예제로 확인하기

WIndow API를 이용해 메시지박스를 띄워보겠습니다.

마이크로소프트 WIndow API 함수리스트에서 확인해보니 구조는 아래와 같네요.

 

int WINAPI MessageBox(
  _In_opt_  HWND hWnd,
  _In_opt_  LPCTSTR lpText,
  _In_opt_  LPCTSTR lpCaption,
  _In_      UINT uType
);

 

오토핫키 문법으로 변환하면 이렇게 됩니다.

 

DllCall("MessageBox", int, 0, str, "메시지박스입니다!", str, "메시지박스", Uint, "0x00000000L")

 

퍼포먼스 문제

DllCall 함수 실행마다DLL(을)를 로드하고, 종료후 개방한다.
같은 함수를 단시간에 빈번히 호출하는 경우, 아래와 같이 해DLL(을)를 로드하는 처리를 자기 부담으로 기술해 두는 것으로, 퍼포먼스를 개선할 수 있다.
덧붙여User32.dll,Kernel32.dll,ComCtl32.dll,Gdi32.dll의 각DLL에 대해서는, 항상 로드 된 채로 있기 때문에, 이 처리는 필요없다

 

hModule := DllCall("LoadLibrary", str, "MyFunctions.dll")  ;Dll 파일 로드
DllCall("FreeLibrary", UInt, hModule)  ;DLL 파일을 닫는다, 메모리반환.

 

참조

http://ahkplant.tistory.com/101

http://jogamja.tistory.com/50

http://ahkscript.org/docs/commands/DllCall.htm

http://autohotkey.sabryfattah.com/category/dll-call/

  1. EmP 2015.03.15 11:26 신고

    강좌 잘 보고 있읍니다. 감사합니다.

  2. 퉁군 2015.04.24 22:22 신고

    다른 싸이트 통해서 여기와서 공부중인데 정리를 정말 잘해놓으셔서
    저처럼 처음이구 어리한사람도 이해가 잘 되네요..ㅎㅎ
    자두들러 공부하고 혹여나 막히는 부분 있으면 질문좀 살짝 해도되죠?? ㅎㅎ
    항상 감사합니다~^^

  3. 뭔소리야 2015.07.26 17:33 신고

    댓글보면 다들 이해가 잘되는거같은데 내가초보인건지 이건 뭔소린지 도통모르겄다..

  4. yuniss 2015.07.31 22:53 신고

    강좌 잘보고 있습니다... 잘 정리 되어 있네요

  5. ㄴㄹㄴㅇ 2015.08.28 06:00 신고

    한달안에 정복하고프다

스크립트 만들기

각 스크립트는 순수한 텍스트 파일로 오토핫키 명령어를 포함하고 있습니다. 또한 스크립트는 핫키(단축키) 와 핫스트링(타이핑식 단축키)를 포함하기도 합니다. 핫키와 핫스트링을 설정하지 않은 스크립트는 소스코드 윗줄부터 차례대로 실행합니다.

 

새로운 스크립트를 생성하려면,

 

1. 오토핫키를 다운로드 받고, 설치하세요.

2. 바탕화면이나, 폴더에서 빈공간에 마우스 오른쪽 클릭하세요.

3. 메뉴가 나타나면, '새로 만들기' → 'AutoHotkey Scripts' 를 선택하세요.

4. 생성된 파일의 이름을 변경하세요, 확장자는 .ahk 이라는것을 주의하세요. 예) 테스트.ahk

5. 파일에 마우스 오른쪽 클릭하시고 'Edit Script' 를 선택합니다.

6. 나타난 빈 화면에, 아래 문구를 적으세요.

#Space::Run, www.google.com

 

위 문구에서, 처음 문자 '#' 은 윈도우 키라는걸 말합니다. 따라서, #Space 는 윈도우키와 스페이스바를 함께 누르는 것을 의미하죠

그리고 이것이 핫키입니다.

 

' :: " 는 핫키가 눌렸을 시, 작동할 종속적인 명령어입니다. 위 문구대로라면, 윈도우키와 스페이스바를 동시에 눌렀을 시 구글 홈페이지가 열리게 되죠

 

위 스크립트를 실험해보기 위해서는,

 

1. 스크립트를 저장하고, 창을 닫으세요.

2. '테스트.ahk' 를 실행시키기 위해 더블클릭하세요. 새로운 아이콘이 작업표시줄 알림에 나타날껍니다.

3. 윈도우키와 스페이스바를 함께 눌러주세요. 웹페이지가 열리게됩니다.

4. 스크립트를 종료하기위해서, 작업표시줄 알림에 나타난 'H' 아이콘에 마우스 오른쪽 클릭 > 'Exit" 클릭하세요.

 

● 여러 종류의 스크립트를 동시에 실행할 수 있습니다..

● 각 스크립트에 여러 종류의 핫키와, 핫스트링을 지정할 수 있습니다.

● 컴퓨터 실행시마다 스크립트를 자동으로 실행시키려면, 시작메뉴에 스크립트 파일의 바로가기를 등록하면 됩니다.

 

  1. HHS 2015.05.01 14:49 신고

    잘 봤습니다~

  2. 아린즈파더 2015.05.13 10:23 신고

    와 ~~ 단축키 설정으로 각종 사이트들 따로 마우스 클릭해서 즐겨찾기 안해도 되겠어요 ㅋㅋ

  3. 한제헌 2015.06.08 11:46 신고

    따라 해볼려고 해도 에이키 눌르
    핫키가 지정했구 나와요 ㅜㅜ

  4. LHJ 2016.12.21 01:56 신고

    완성된 오토핫키 exe 를 .ahk 파일로 바꾸거나 혹은 편집할순 없나요?
    다른분 프로그램을 조금 연구해보고 싶은데.. 물론 연구목적으로 샀습니다

  5. AHK 2017.02.19 16:20 신고

    마스터할때까지 강의봐야겟네여..

다운로드

오토핫키를 다운받으려면 클릭

소스코드 편집기를 다운받으려면 클릭

 

오토핫키 설치하기

 

3가지 버전이 있는데 우리는 'Unicode 32-bit' 를 설치합니다.

64비트 컴퓨터여도 32비트 설치하시면됩니다. 호환되요

 

 

3가지 다 체크해주시구요 편하니까

'Install' 클릭하시면 오토핫키 설치가 완료됩니다.

 

 

소스코드(.ahk) 편집기 설치하기

 

3개 다 체크됬는지 확인하시고, 'Install' 누르시면 설치됩니다!

  1. EmP 2015.03.15 11:27 신고

    강좌 잘 보고 있읍니다. 감사합니다.

  2. PMC 2015.04.09 09:59 신고

    스크립트 공부에 도움이 되는거 같아 강좌글 잘 읽고 있습니다 :)

  3. HHS 2015.05.01 14:33 신고

    고맙습니다~!

  4. 아린즈파더 2015.05.13 08:40 신고

    요즘 오토핫키에 푹 빠져 살고 있습니다.
    많은 정보 얻어갈 수 있었으면 합니다.

    감사합니다.

  5. 예지력찬양맨 2015.07.10 17:17 신고

    저거 버전은 몇인가요 B버전 L버전 이런식으로 있던거 같은데..
    어떻게 보는거죠? 버전 넘버만 보이던데 ㅠ

    • BlogIcon 예지력 2015.07.11 10:31 신고

      ahkscript.org 에서 다운받으시면 L버전입니다. 베이직(B)버전은 업데이트가 종료된지 몇년 넘었어요

  6. 이거라도공부해 2015.07.30 23:38 신고

    감사하게 정주행하겠습니다 !

  7. 에데루스 2016.07.11 23:48 신고

    64비트로 설치해도 상관 없을까요?

오토핫키 AutoHotkey

오토핫키 (AHK)는 무료, 오픈소스 매크로 제작 소프트웨어 언어입니다. 반복적인 일의 자동화에 매우 특화되있구요. 초기 개발발향은 핫키라고도 부르는 키보드 단축키사용에 초점을 맞추었지만, 지금은 생각할 수 있는 컴퓨터언어의 모든것을 구현할 수 있는 단계까지 개발이 되었습니다.

 

'AHK 메뉴얼' 게시판에는 한 주제를 가지고 기능구현을 하는 방법을 서술할 것이고

'AHK 레퍼런스" 는 오토핫키의 명령어를 강의하는 게시판입니다!

 

오토핫키를 가볍게 배우신다면,
● 거의 모든것을 자동화 할수있습니다. 키보드입력과 마우스클릭과 같은
● 키보드와 마우스버튼 등에 기능을 추가해 컴퓨터 커스터마이징이 가능합니다.

● 단축말을 설정해 굳이 긴문장을 안써도 됩니다. 예) ㅎㅇ라 치면 자동으로 안녕하세요 변환

● 복사,붙여넣기의 컨트롤
● 소스코드파일을 하나의 exe 실행파일로 컴파일 할 수 있습니다. 모든 컴퓨터에서 사용이 가능하겠죠


컴퓨터 언어를 아시거나 깊이있게 오토핫키를 배우신다면,

● 그래픽 유저 인터페이스 (GUI) 를 만들어 사용자와 상호작용이 가능하고
● 텍스트파일을 포함한 엑셀파일 그리고 데이터베이스 파일을 읽고, 수정을 자동으로 하게 할 수 있습니다.
● 컴포넌트 오브젝트 모델 (COM) 을 사용할 수 있습니다.
● 배열 (Array)와 오브젝트 (Object) 사용이 가능합니다.
● 글로벌 변수 선언과 함수 제작 가능
● 윈도우 DLL 명령어를 호출해 다양한 기능 구현이 가능합니다

  1. BlogIcon 김경환 2015.02.18 15:08 신고

    화이팅!! 넘 멋져요!! 응원합니다 !! ^^

  2. EmP 2015.03.15 11:26 신고

    강좌 잘 보고 있읍니다. 감사합니다.

  3. 매크로 2015.03.24 23:25 신고

    키보드의 F4번이나 이런거는 펑션키라 오토핫키에서 입력으로 넣는거는 불가능한가요?

  4. 박팀 2015.05.03 18:59 신고

    감사합니다. 강좌 잘 보겠습니다.

키보드 입력과 마우스 입력하기

키입력은 'Send' 류의 명령어를 통해 윈도우 활성창(윈도우 최상단에 있는)으로 보내집니다.

다음의 예에서, 컨트롤 + 알트 + S는 '안녕하세요' 를 입력하는 핫키입니다.

 

기본형    Send, 입력할 문자

예시       ^!s::

Send, 안녕하세요, {Enter}

return

 

위 예에서 { } 표시를 하지 않은 문자는 문자입력으로 되고(Literally), {Enter} 는 엔터키를 의미합니다.

일반적으로 문자는 { } 표시없이 적고, 특수키 (엔터,스페이스바,방향키, F1, 등)은 {} 을 사용합니다.

 

그리고, 키입력은 단순히 핫키를 지정하여 보낼수있는것이 아니라 핫스트링을 사용하여 보내기가 가능합니다.

아래의 예는 사용자가 a b c 키를 순차적으로 눌렀을때, 입력된 'abc'를 'A and B and C' 로 변환합니다.

 

기본형    ::문자열::변환할 문자열

예시        ::abc:: A and B and C

 

마우스 클릭

: 마우스클릭을 하기 위해서는, 마우스클릭을 할 좌표(X좌표,Y좌표)를 적어줘야합니다. 오토핫키 설치폴더에 있는 'Window Spy' 를 이용해 마우스 좌표를 확인할 수 있습니다.

 

기본형    Click, X좌표, Y좌표

예시       Click, 400, 300

 

클릭하지 않고, 마우스 커서만 이동시키고 싶다면 'MouseMove' 명령어를

마우스를 드래그하려면 'MouseClickDrag" 를 사용하세요.

  1. EmP 2015.03.15 11:28 신고

    강좌 잘 보고 있읍니다. 감사 합니다.

  2. rechad hyun 2015.07.12 12:36 신고

    window spy 를 찾을수가 없습니다. 어디에서 찾아야 하는건가요...ㅠㅠ

+ Recent posts