Language : AutoHotkey

Author : 예지력

Feature : attach a window to another, and vice versa (see Dock Example.ahk for info)


예전에 작성하다만 코드인데, 새롭게 다시 작성했습니다

이상하게 함수를 레지스터할 때, Fast 옵션을 추가하면 콜백이 정상적으로 이루어지지 않는데.. 딱히 해당 옵션이 필요한 것도 아니라서 그냥 뺐습니다


예제(Dock Example.ahk)처럼 circular reference 가 형성되어 있다면, 반드시 관계를 끊고 클래스 Destructor 가 호출될 수 있도록 해야 합니다


'프로그래밍 > Archive' 카테고리의 다른 글

Dock - attach a window to another  (2) 2017.04.23
DynaScript - Child 프로세스로 코드 실행  (30) 2015.12.14
[Lib] Class Msgbox  (6) 2015.11.27
[Lib] CleanNotify  (4) 2015.11.21
WinWaitCreated()  (0) 2015.10.17
MS Office Style Gui 프로토타입  (4) 2015.10.09
  1. test 2017.12.31 16:10 신고

    감사합니다

  2. ㅇㅇ 2018.08.12 16:25 신고

    군주온라인 어의 업뎃좀 ㅜㅡㅜ

Language : AutoHotkey

Author : 예지력

Feature : Spawn child process using pipe


DynaScript.zip


블로그 방명록에 어떤 분이 흥미로운 댓글을 남겨주셔서 만들어보았습니다



Quasi Thread 라고 부를수도 있을라나?

코드를 현재 스레드의 자식(Child) 프로세스로 메모리에서 실행시킵니다




'프로그래밍 > Archive' 카테고리의 다른 글

Dock - attach a window to another  (2) 2017.04.23
DynaScript - Child 프로세스로 코드 실행  (30) 2015.12.14
[Lib] Class Msgbox  (6) 2015.11.27
[Lib] CleanNotify  (4) 2015.11.21
WinWaitCreated()  (0) 2015.10.17
MS Office Style Gui 프로토타입  (4) 2015.10.09
  1. 열쇠 2015.12.14 18:27 신고

    예지1에
    #NoEnv ; Recommended for performance and compatibility with future AutoHotkey releases.
    ; #Warn ; Enable warnings to assist with detecting common errors.
    SendMode Input ; Recommended for new scripts due to its superior speed and reliability.
    SetWorkingDir %A_ScriptDir% ; Ensures a consistent starting directory.

    이 문구만 있는데 따로 수정을 해야 되나요?
    간단한 예제좀 부탁드립니다.

    • BlogIcon 예지력 2015.12.14 18:41 신고

      아 파일을 잘못 올렸었어요! ㅋㅋ
      지금 수정했습니다, 다시 받아보세요
      예제1, 2 둘다 확인해보시면 될거에요
      서브 프로세스로 오토핫키가 2개가 실행되는걸 확인하실 수 있을거에요

    • 열쇠 2015.12.14 19:29 신고

      넵 어쩌다가 디컴파일 얘기로 빠졌는데..
      예지력님께서 말씀하신것도 enigma 다른 플러그인 세팅으로 메모리를 지울수가 있어서 괜찮을듯 싶습니다.

  2. 열쇠 2015.12.14 18:43 신고

    안녕하세요. 다소 난해할수 있는 질문 하나 드립니다.
    http://www.2shared.com/file/dHtQEZ62/w_online.html
    //
    #Persistent
    #SingleInstance Force
    ptr := A_PtrSize ? "ptr" : "uint"
    len := DllCall("enigma_ide.dll\EP_ProtectedStringByID", "int", 1, ptr, 0, "int", 0)
    if (len > 0)
    {
    VarSetCapacity(str, len*2, 0)
    len := DllCall("enigma_ide.dll\EP_ProtectedStringByID", "int", 1, "str", str, "int", len)
    if (len > 0)
    PW = %str%
    }
    msgbox, 괄호안에 문구는 Enigma의 변수 스트링 입니다. `n(%pw%)
    //
    해당 스크립트로 컴파일 후 enigma라는 프로그램을 이용해 pw라는 변수에 msgbox,okay를 보관하도록 하였습니다.
    이때 예지력님께서 올려주신 스크립트를 통해 변수pw의 본래 스크립트는 msgbox,okay를 실행하려면 어떻게 해야 되나요?

    • BlogIcon 예지력 2015.12.14 18:51 신고

      예제까지 적었는데 확인해보시죠!?
      제가 코드를 다 만들어드리지는 않습니다

      정말 도움을 받고 싶으시면, 저 스크립트가 뭐 하는 건지부터 설명을 해주시는 게 먼저 할 일 같습니다
      ProtectedStringByID 리턴값이 뭔가요?

    • 열쇠 2015.12.14 18:56 신고

      해당 스크립트는
      enigma protect라는 프로그램을 이용해 Protected Strings에 보관해놓은 글자를 호출하는 스크립트 입니다.
      해외에서는 오토핫키의 소스 유출을 방지하고자 ahk에 본래 스크립트를 적용하지 않고 enigma protect의 Protected strings에 본래 스크립트를 변수로 저장해 저런식으로 따로 변수를 호출해서 실행하는 방법을 사용하고 있습니다. 근데 영문 포럼인지라 쉽게 따라할수가 없어 여기에 질문을 남겨두었습니다. ProtectedSTringById는 Protected Strings를 사용하려면 Enigma protector에서 플러그인을 체크 해야되는데 아마 해당 플러그인을 콜하는 부분인것 같습니다.

    • 열쇠 2015.12.14 18:59 신고

      포럼 주소는
      https://autohotkey.com/board/topic/82590-code-protection/page-2
      입니다.

    • BlogIcon 예지력 2015.12.14 19:15 신고

      근데 디컴파일러로 바로 보이는데요?
      마지막 Uberi 포스트 확인해보세요

    • 열쇠 2015.12.14 19:21 신고

      디컴파일을 통해서 해당 오토핫키의 스크립트는 찾을수 있으나
      enigma에 저장해놓은 변수 스크립트는 찾을수 없습니다.
      중요한건 Enigma의 변수 스크립트인지라..

    • BlogIcon 예지력 2015.12.14 19:26 신고

      아뇨 str으로 받아오고 그걸 DynaScript의 어규민트로 날려야하는데
      그러면 메인 스래드의 메모리에 str이 보여요!
      @_@

    • 열쇠 2015.12.14 19:30 신고

      네 그것도 맞습니다.
      다만 enigma의 다른 플러그인으로 예지력님께서 말씀하신걸 방지가 가능한지라.. 어쩌다가 보안쪽 얘기로 빠져버렸네요;;

    • BlogIcon 예지력 2015.12.14 19:37 신고

      읽어보니 해시가 풀리면 len이 0이상으로 나온다는거 같고, 리턴값이 str으로 나오네요. 그러면 처음에 enigma에 key 값에 스크립트 적어두고 리턴 str을 DynaScript로 보내시면 될 거 같아요. 근데 이러면 서브 프로세스를 메인함수처럼 실행시킨다는건데 이러면 AutoHotkey.exe 통해 가는거라 보안상태가 없는데 @_@...enigma 로 뭐를 막으시겠다는건가요? 서브프로세스는 패킹이 안되있는건데

    • 열쇠 2015.12.14 19:44 신고

      아 autohotkey.exe를 경유해서 실행이 되는 거였네요..

    • BlogIcon 예지력 2015.12.14 19:48 신고

      오토핫키는 다 AutoHotkey.exe를 통해서 가요, 인터프리터, 스크립트 언어니까요.
      컴파일하는것은 ahk파일과 exe파일을 wrapping하는거고요, 그래서 엄밀히 말하면 컴파일이 아니죠
      그러니까 소스코드보안에 신경쓰는게 의미가 없게 되는거죠,
      패킹해봤자 메모리에 로드되면 AutoHotkey.exe 머신에서 실행되는거라 코드가 메모리에 로드되어있습니다. 디컴파일은 프로그램을 로딩하고 하는거에요. 그냥 디컴파일러로 프로그램 드래그드롭하는게 아니고요.
      오토핫키 개발자 fincs도 오토핫키의 소스코드는 절대로 보호되지 않고, 소스코드 보안글도 포럼에서 그만좀 올리라고 했습니다ㅋㅋ 아무런 의미가 없으니

      무슨 패커을 사용해도 보안에는 의미가 없어요, 올리디버거, Sylldbg로 브레이크포인트 걸면 메모리에서 코드가 다 보이는데 패킹해봤자죠

    • 열쇠 2015.12.14 19:57 신고

      정말 안타까운 사실이네요.
      그래도 이런식으로 외부 프로그램을 이용하면 메모리를 지울수도 있습니다.
      http://www.2shared.com/file/gU44Uy-k/test.html
      간단한 역분석 방지와 메모리를 커널에서 호출해서 지우도록 해보았습니다.

    • 열쇠 2015.12.14 20:01 신고

      외담입니다만 fincs는 왜이렇게 극단적으로 오픈웨어를 지향하는걸까요?
      정책에 반해서라도 따로 컴파일러를 만들어 주었으면 좋겠습니다. 아마 수많은 오토핫키 스크립터들이 바라는 사항이 아닐까 싶네요

    • BlogIcon 예지력 2015.12.14 20:26 신고

      오토핫키 시작 자체가 가장 엄격한 오픈소스를 지향하는 GNU라이선스였고, 오토핫키 베이직(B) 버전의 출발도 형제 언어인 오토잇이 오픈소스라서 가능했고요. 현재의 오토핫키(L) 가 아직까지 개발되는 이유도 6년 전에 개발이 중단됐던 오토핫키 베이직(B)이 오픈소스여서 가능한 거니까요.

      외국에는 이미 국내보다 오픈소스 정신과 오리지널 코드의 제작자를 크레딧을 해주는 문화가 발달해서 그런지, 오토핫키 정책에 불만이 사람 별로 못 본 것 같습니다, 저 자체도 오픈소스의 수혜를 많이 받으며 공부해와서 그런지 별 생각 없고요.
      다만, 몇몇 도둑(?)들 때문에 소스 보호에 신경을 쓰게 될 때가 있다는 점이 안타까워요

    • 열쇠 2015.12.14 20:49 신고

      그렇군요..오토잇처럼 최소 Obfuscation 기능이라도 있으면 좋겠지만..말씀 잘들었습니다.

  3. 박세준 2015.12.21 08:26 신고

    예전부터 생각해왔던건데 진짜로 하시는 분들이 있네요..ㅋㅋ
    오핫 스크립트 에디터같은 프로그램 만들 때 유용할 것 같습니다.
    저는 ahk2exe 컴파일러를 FileInstall로 내장시켜서 FileAppend -> ahk2exe -> run 을 생각하고 있었는데 차원이 다른 작품이 나와버렸네요~

  4. 왕진 2015.12.22 22:57 신고

    예지력님글도보고 구글사이트에 다른분의 오토핫키 강좌도 보고 해서 이미지서치를 해보는중입니다.
    실례가안된다면 몇가지 질문을 드리고싶습니다.

    Gui, ADD, Text, x30 y5 w110 h20, 매크로 프로그램
    Gui, ADD, Text, x60 y25 w50 h20 vA, 준비!!!
    Gui, ADD, Text, x60 y50 w50 h20 vB, 0회
    Gui, ADD, Button, x20 y80 w110 h20, 시작
    Gui, ADD, Button, x20 y110 w110 h20, 종료
    Gui, Show

    return

    Button시작:
    {
    CoordMode, Relative
    Gui,Submit,nohide
    GuiControl,,A, 시작

    매크로시작 := true
    클리어횟수 := 0
    Loop
    {

    ImageSearch, FoundX, FoundY, 0,0, A_Screenwidth, A_ScreenHeight, *50 %A_ScriptDir%\Image\1.png
    if(Errorlevel = 0)
    {
    send {click &FoundX& %FoundY%}
    sleep, 3000
    }
    ImageSearch, FoundX, FoundY, 0,0, A_Screenwidth, A_ScreenHeight, *50 %A_ScriptDir%\Image\2.png
    if(Errorlevel = 0)
    {
    send {click &FoundX& %FoundY%}
    sleep, 3000
    }
    ImageSearch, FoundX, FoundY, 0,0, A_Screenwidth, A_ScreenHeight, *50 %A_ScriptDir%\Image\3.png
    if(Errorlevel = 0)
    {
    send {click &FoundX& %FoundY%}
    sleep, 3000
    클리어횟수 := 클리어횟수 + 1
    Gui,Submit,nohide
    GuiControl,,B, %클리어횟수% 회
    }
    if(매크로시작 = false)
    {
    break
    }
    }
    }
    return

    Button종료:
    {
    매크로시작 := false
    ExitApp
    }
    return

    제가 이미지서치를 하려고 만든것인데..
    이미지를 못찾는건지..어떤지..다른건다되는데 이미지서치만 안됩니다...
    예지력님강좌에있는것처럼 vx,vy 좌표로해서도해보고 foundx,foundy로도해봤는데..
    도통..이미지를 못찾는것 같아요..

    질문1. 코드에 문제가 있는건가요..?
    질문2. 코드에 문제가 없다면 혹..이미지를캡쳐하는 부분에서 잘못된것일까요?
    ->캡쳐는 그림판으로해서 png,bmp파일로 했으며 캡처는 가장알아보기쉬운 부분적으로하였습니다.어느글에서보니 가장자리?하는게좋다고하여그렇게도해보고 정가운데로도 해봤지만..여전히 움직이질않네요..
    질문3. 제가 노트북을쓰는데..지금2모니터를 사용합니다. HDMI로 하나 RGV로 하나 오토핫키는 HDMI쪽 모니터를 주로 설정하여
    그곳에서하는데 혹 듀얼모니터사용하는게 문제가 될수 있을까요?
    질문4. 파일경로쪽에%A_scriptdir%\Image\1.bmp or png 이렇게 사용하는데
    파일은 바탕화면 ppp 폴더안에 스크립트가 있으며 하위폴더인 Image 폴더안에 찾고자하는 파일3개와 그파일로 캡쳐뜬 사진3개가
    있습니다 이럴때 코드 경로는 저위에 코드가 맞는건가요?

    질문이 많습니다ㅠㅠ도와주세요!!

    • 2016.01.10 22:53 신고

      너무 기초적인 내용인데 포스팅과는 맞지않는거 같네요
      킴영감님 포스팅보고 따라하신거같은데 foundx변수에
      &가 아닌 %를 주셔야합니다.

  5. 구리 2016.01.01 01:57 신고

    안녕하세요^^
    독립 프로세스로 명령을 시켰더니 잘 되는 명령어도 있고 잘 안되는 명령어도 있네요.ㅜㅜ
    msgbox,send 같은 명령은 잘 실행되는데
    Run Notepad.exe
    Winclose
    이런 명령들은 (Run 같은경우 파일을 찾을 수 없다고 나옵니다.)
    (Winclose는 반응이 없습니다.)
    잘 실행되지 않네요.ㅜㅜ

    어떻게 해야 위와 같은 명령도 잘 실행되게 할 수 있을지 모르겠습니다.
    알려주시면 정말 감사하겠습니다.

    새해 복 많이 받으세요!

    • BlogIcon 예지력 2016.01.01 18:44 신고

      저는 잘 되는데요? :(

      Code := "
      (Join`n
      Run, Notepad.exe
      )"

      Init := new DynaScript(Code)
      Init.Run()
      Return

      #Include, <DynaScript>

  6. 구리 2016.01.03 14:55 신고

    왠진 모르지만 run 이후 공백(`n)을 살려놨더니 잘 되네요.^^;;

    덕분에 좋은 스크립트도 써보고 감사합니다.!

  7. BlogIcon 비필 2016.02.15 15:51 신고

    이거 AutoHotkey_H 나 AutoHotkey.dll 로도 해결 가능합니다. 서로 변수공유도 가능하고요

  8. BlogIcon 1466005116 2016.06.16 00:38 신고

    알찬 정보 좋네요~

  9. 2016.09.16 20:11

    비밀댓글입니다

  10. 2018.04.20 17:43

    비밀댓글입니다

    • BlogIcon 예지력 2018.04.22 13:06 신고

      아 그런가요? 직접 해본적이 없어서 모르겠는데 메모리에서 보이지않는다면 아마 말씀하신대로일것같습니다

  11. BlogIcon AidenKim. 2018.05.04 01:54 신고

    안녕하세요 예지력님,

    위에 올려주신 동영상 보니까 , 맥에서도 오토핫키 구동하고 테스트하시는데, 어떻게 하신건지 알수 있을까요?

    집에서는 맥 사용하고, 회사에서는 오토핫키를 사용하는데.. 좋은 정보가 될것 같습니다.

Language : AutoHotkey

Author : 예지력

Feature : MSDN TaskDialog function implement, written in AHK


Class MsgBox.zip





'프로그래밍 > Archive' 카테고리의 다른 글

Dock - attach a window to another  (2) 2017.04.23
DynaScript - Child 프로세스로 코드 실행  (30) 2015.12.14
[Lib] Class Msgbox  (6) 2015.11.27
[Lib] CleanNotify  (4) 2015.11.21
WinWaitCreated()  (0) 2015.10.17
MS Office Style Gui 프로토타입  (4) 2015.10.09
  1. 혜나토리 2015.11.27 22:57 신고

    오늘부터 연습하는데 정말 큰 도움됩니다 감사합니다^^

  2. 세준 2015.12.11 11:04 신고

    이제 스타일 변경 없이도 깔쌈한 메세지박스가 가능하겠네요~! 완전 맘에드네요 ㅋㅋ

  3. 불탄집문서 2015.12.19 15:35 신고

    오오 .. 감사합니다 이제 이쁜 msgbox를 만들수 있게 되었어요

  4. 왕초보 2017.05.15 09:36 신고

    오래전에 어느 고수님의 백업, 복구 프로그램에 있는것을 보고 신기하게 생각을 하였었습니다..
    오토쿨에서 보고서야..어느분께서 만드신 메세지인지 알게 되었습니다
    그리고.이제서야.활용할수 있게 되었습니다..감사합니다..

    오토쿨에서 도움을 청하는것이 아니라 이곳에서 도움을 청해게 되어서 죄송합니다.
    이 메세지를 오토잇에서도 활용을 하고 싶습니다...초보가 좋은것을 알게 되다보니 너무 욕심을 내는것 같습니다
    혹시...오토잇으로도 사용가능한지요...어떻게 작업을 해야할지 엄두가 나지를 않다보니..이렇게 도움을 청하게 되었습니다

    오토핫키 관련해서 좋은 강좌를 해주셔서 감사합니다..
    많은 도움이 되었습니다
    특히 스킨은...모양을 이쁘게하는데 잘 사용하였습니다..
    감사합니다..

    • BlogIcon 예지력 2017.05.15 09:43 신고

      안녕하세요,
      오토핫키의 기능이 아니라 윈도우 내장함수를 끌어다 쓰는 것이라(DllCall) 오토잇도 dllcall이 있는 걸로 알고 있는데 가능할 듯 싶습니다. 저는 오토잇 코드를 읽을 줄만 알지 직접 쓸 줄은 몰라서 도움은 못 드리겠어요.

  5. 왕초보 2017.05.24 09:04 신고

    댓글을 남겨 주셔서 감사합니다..

    메세지에 칼라가 있는것을 보고 너무 제 욕심만 낸것 같습니다...죄송합니다..
    친절하신 답글에 제가 자신이 민망할 정도입니다..

    오토잇으로 된것을 찾기는 하였습니다..역시..칼라가 들어가지 않았지만 저에게는 귀한 선물이 되었습니다
    메세지가 윈도우의 어떤 내장함수인지를 여기서 알게되지 않았다면...찾지 못하였을것입니다.
    --------------------------------------------------------------------------------------------------------------------------------------------------
    윈도우 백업, 복원 프로그램에 메세지를 활용하여서 사용하고 있습니다...
    초록은 복원, 백업은 노랑을 사용합니다
    칼라에 따라서 아이콘이 정해져 있다보니..조금 아쉽습니다..
    칼라가 적용되는것만 해도 특별한 것인데도 사람이 욕심이 끝이 없나 봅니다..

    아이콘을 파일로된 다른 아이콘을 적용을 하려고하면 어떻개 해야하는지요..
    초보에게는 능력 밖의 일이되어서 이렇게 또 귀찮게 해드리게 되었습니다..
    죄송스럽습니다.

    오늘도 웃음이 가득한 하루 되시길 바랍니다

Language : AutoHotkey

Author : 예지력

Function : 팝업메시지


라이브러리


예제 코드


'프로그래밍 > Archive' 카테고리의 다른 글

DynaScript - Child 프로세스로 코드 실행  (30) 2015.12.14
[Lib] Class Msgbox  (6) 2015.11.27
[Lib] CleanNotify  (4) 2015.11.21
WinWaitCreated()  (0) 2015.10.17
MS Office Style Gui 프로토타입  (4) 2015.10.09
GetActiveObjects 활성중인 객체를 불러온다  (0) 2015.03.04
  1. 2015.11.21 20:21

    비밀댓글입니다

  2. 세준 2015.12.11 11:07 신고

    깔끔한게 마음에 드네요 ^^ 이제 구린 TrayTip 말구 이걸 쓰면 이뻐질듯!!

  3. 왕초보 2017.05.23 17:59 신고

    역시..저에게는 한글 설명이 최고입니다..
    멋진 작품에 친절하신 설명에 감사드립니다..

    좋은일만 있으세요..

  4. 왕초보 2017.05.24 09:08 신고

    알려주순 멋진 메세지를 백업, 복구 프로그램에 적용을 하여 보았습니다..
    바탕색이 프로그램 색과 일치하지 않아서 색은 바꾸었습니다. 죄송합니다

    알려주신 소스에서 페이트 관련소스가 있어서 처음으로 프로그램 폼에..페이드 기능을 적용도 해볼수 있었습니다
    생각지도 않았던 기능이어서...너무 감사드립니다..

    윈도우 포럼에 사용기를 소개를 하였지만 이곳에는 사진을 올릴수 없어서 오토쿨에 강죄를 해주신곳에 사진 몇장을
    올렸습니다

    좋은 작품을 이렇게 공개를 하여 주신 덕분에 많은것을 배울수 있었습니다
    진심으로 머리숙여 감사드립니다..
    복 많이많이 받으십시요

 

요즘 바쁜 와중에도 짬 내서 구글의 Go 언어 공부하느라 더 정신은 없지만 재밌네요
하지만 아직까지도 저는 오토핫키를 가장 선호합니다, 처음 배운 언어고 가장 많이 사용하고 있어서 그런지...
인터프리터 언어의 일인자(?)인 파이썬보다도 더 자주 사용하는 거 같네요

 

클래스에 대한 글을 작성하려 했는데, 먼저 함수에 대해 충분히 알아야 할 것 같아서 이 글을 먼저 적게 되었습니다
함수를 사용하긴 하더라도, 제대로 활용하는 사람은 드문 것 같아서요

 

사실, 저도 잘 모릅니다;;
하지만, 더 배우고자 한다면 남을 가르치는 것이 도움이 된다고 했나요?
제가 함수에 대해 아는 것을 적어보려고 합니다

 

안내
- 저는 오토핫키를 포함한 다른 프로그래밍 언어를 모두 원어로 배워서, 한글 명칭을 잘 모릅니다... 대부분 영어로 적습니다
- 예제를 직접 실행해보세요, 이해에 많은 도움이 될 겁니다

 

Function 함수

 

일단 함수를 왜 사용하는지 알아야 겠죠, 함수를 사용하는 주된 이유는

  1. 코드의 유지 보수를 수월하게 하고
  2. 코드의 범용성을 높이고
  3. 생산성이 높아지기 떄문입니다

함수를 사용하는 이유가 goto, gosub 의 사용을 권장하지 않는 이유이기도 합니다
한두 개라면 몰라도 서브루틴에 대부분 goto를 사용한다면 코드가 굉장히 지저분(...) 하고
범용성이 제로에 가까워서, 새로 코드를 작성할 때 이전의 코드가 전혀 도움이 안 되죠

물론 대충 후다닥 만들때는 그냥 goto 로 만드는게 편하죠, 나중까지 생각한다면 함수로 만드는게 좋고요


Function (이하 함수)는 goto, gosub 과 같은 서브루틴(subroutine)의 기능에 추가로 파라미터(입력)을 받아 올 수 있습니다
그리고, 값 (value)을 리턴(Return) 할 수도 있죠.
아래 '더하기' 함수는 x, y 파라미터를 받아와 각각 더하고 합을 리턴합니다

 

더하기(x, y)
{
    return x + y
}

 

'더하기'는 함수 이름이고, 괄호 안에 들어가는 x 와 y는 파라미터라고 부릅니다


이렇게 함수를 만드는 것을 Function Definition (함수 정의)라고 하는데요

 

'더하기' 함수를 사용하려면 반드시 x, y 파라미터에 해당하는 각각의 값을 보내줘야 하고
리턴되는 값을 변수에 저장하려면 ' := ' 오퍼레이터를 사용해야 합니다, 아래처럼요

 

합 := 더하기(10, 5) ; '합' 변수에는 '15'가 저장됩니다

 

값을 저장하지 않고, 아래처럼 그냥 함수만 사용할 수도 있습니다

 

더하기(10, 5)

 

그런데 '더하기' 함수에는 값을 리턴하는 외의 어떠한 명령도 없기 때문에 위 코드는 아무런 의미가 없죠
하지만 명령어(Command)를 사용할 때에는 유용합니다
변수로 저장해두고 계속 사용하지 않을 거라면, 아래처럼 사용하면 되죠

 

MsgBox % "3 더하기 2 는: " . 더하기(3, 2) ; ' 3 더하기 2는: 5 '

 

함수는 파라미터를 포함해 모든 표현을 *익스프레션으로 표현합니다

익스프레션: 변수, % 변수, :=, "문자"

 

따라서, 변수를 넘길 때는 따옴표("") 처리 없이, 문자를 넘길 때는 "문자 "로 표현해야 합니다

 

함수(변수, "문자 ")

 

Parameters 파라미터

 

함수명(첫 번째 파라미터, 두 번째 파라미터, 세 번째 파라미터, ...) 과 같은 형식으로 함수를 정의합니다
파라미터는 필수가 아니에요, 생략하고 함수명()로 정의할 수도 있습니다

 

ByRef 파라미터
함수가 받아온 파라미터는 기본적으로 로컬(Local) 변수로 사용됩니다, 하지만 *ByRef 파라미터로 받아온다면 그렇지 않죠

ByRef: By Reference의 약자, 참조한다는 뜻

 

무슨 말인지 모르시겠다고요?, 아래의 예를 읽다 보면 이해가 될 거예요 :)

 

Swap(ByRef x, ByRef y)
{
    save := x
    x := y
    y := save
}

 

Swap 함수는 ByRef 파라미터의 사용으로 파라미터 x, y를 *Alias로 만듭니다

Alias: 이후에 작성할 멀티 스레드 글에서 자세히 알아보겠습니다, 지금은 그냥 이런 게 있구나 정도만 생각하세요

 

쉽게 말하면, ByRef를 사용함으로써
파라미터 x, y는 Swap 함수 내에서도, 코드 전체에 걸쳐서도 같은 데이터를 메모리에서 참조(Refer) 하게 되는 거죠
따라서 Swap 함수로 교환된 값을 함수 밖에서도 사용할 수 있습니다

 

만약에 ByRef를 사용하지 않는다면
함수 내에서는 x, y 값을 교환해서 저장하지만, 함수 밖에서는 아무런 변화가 없습니다
따라서, 코드 전체에서는 실제로 교환된 값을 사용할 수는 없습니다

 

말이 점점 어려워지네요, 역시 코드가 제일 쉽죠?

 

; ByRef 의 경우
a := 10
b := -10
MsgBox % "a : " a "`nb : " b ; a는 10, b는 -10
Swap(a, b) ;a 변수의 값은 b로, b변수의 값은 a에 저장됨

MsgBox % "a : " a "`nb : " b ; a는  -10, b는 10 로 값이 교환됨

 

Swap(ByRef x, ByRef y){
    save := x
    x := y
    y := save
}

 

; ByRef 가 없다면
a := 10
b := -10
MsgBox % "a : " a "`nb : " b ; a는 10, b는 -10
Swap(a, b)
MsgBox % "a : " a "`nb : " b ; 여전히 a는  10, b는 -10

 

Swap(x, y){
    save := x
    x := y
    y := save
}

 

읽기만으로 이해가 잘 되지 않는다면 코드를 실행해보고 결과를 확인해보세요

 

ByRef 의 장점은 여러 개의 값을 *리턴하는 효과를 가져온다는 거죠, 위 코드에서는 x, y 두 개의 값을 리턴했다고 보면 됩니다
반면에, 리턴(Return)으로는 한 개의 값만 리턴이 가능해요

리턴하는 효과?: 엄밀히 따지면, ByRef는 값을 리턴하는 게 아니라 값을 설정한다고 봐야 하기 때문

 

ByRef의 또 다른 장점으로는,
사이즈가 큰 문자열을 리턴할 때 return String 을 사용하는 것보다 속도가 빠르다는 점이 있습니다
웹페이지 소스나, json 파싱을 할 때 유용할 것 같지만,
속도 차이는 벤치마킹상이지, 사람이 체감하는 속도는 아니라서 막상 사용은 잘 안 합니다


옵션 파라미터

함수를 호출할 때마다 모든 파라미터에 값을 넘기려니 귀찮은 때가 많습니다
그럴 때, 파라미터에 기본값을 설정해두면 편하죠, 이러한 파라미터를 Optional Parameter (옵션 파라미터)라고 불러요

 

더하기(x, y, z := 0)
{
 return x + y + z
}

 

더하기 함수의 3번째 파라미터 z는 기본값이 0으로 설정된 옵션 파라미터입니다
파라미터를 받아오지 않는 경우에는 0으로 설정되고, 받아온 경우에는 받은 값을 사용합니다
따라서, 더하기(5, 5) 의 경우에는 10, 더하기(5, 5, 5) 의 경우에는 15 가 리턴됩니다

 

다시 한번: 함수는 모든 표현을 익스프레션으로 한다고 했습니다, 그래서 z = 0 이 아닌, z := 0 을 사용하죠
그럼에도 불구하고 아직까지는 베이직 버전에서 이동한 개발자를 위해 ' = ' 도 허용됩니다


Variadic 파라미터

파라미터의 개수를 유동적으로 설정하고 싶은 경우가 많습니다, 특히 연산 작업을 할 경우에는 더욱 그렇죠
파라미터 이름 뒤에 * 처리를 하면 입력받은 파라미터의 개수만큼, 파라미터가 자동으로 설정됩니다

 

MsgBox % 더하기(10) ; 10
MsgBox % 더하기(10, 10) ; 20
MsgBox % 더하기(10, 10, 10) ; 30

 

더하기(params*) {
    for i,p in params
  Sum += p
    return Sum
}

 

리턴 Return

 

위에서 잠깐 설명했듯이 함수는 리턴 값을 호출자(Caller)에게 보내거나/저장할 수 있습니다

 

Test := returnTest() ; 변수 Test에 리턴값 123 저장
MsgBox, % Test

 

returnTest() {
  return 123
}

 

return 은 한 개의 값만 리턴할 수 있는 반면에 ByRef를 사용하면 여러 개의 값을 리턴하는 효과가 있다고 했죠?
오브젝트나 배열을 생성해 리턴해도 동일한 효과를 얻을 수 있습니다

 

Test := returnArray()
MsgBox, % Test[1] "`, " Test[2] ; A , B

 

returnArray()
{
 Test := ["A", "B"]
 return Test
}

 

로컬 변수 Local Variables

 

기본적으로 함수 내에서 사용되고, 생성하는 변수는 모두 로컬 변수입니다, 오직 함수 내에서만 사용되는 거죠
함수 밖 변수, 다른 함수의 변수와는 아무런 관련이 없어서, 이름이 동일해도 상관없습니다

 

로컬변수 := 1234
Add := 더하기(5, 5)
Sub := 빼기(10, 5)
MsgBox, % "함수 밖 로컬변수 - " 로컬변수 "`n더하기(5, 5) - " Add "`n빼기(10, 5) - " Sub

 

더하기(X, Y){
 로컬변수 := X + Y
 return 로컬변수
}

 

빼기(X, Y){ ; 파라미터가 X, Y 로 동일해도 상관없음
 로컬변수 := X - Y ; 이름이 동일해도 상관없음
 return 로컬변수
}

 

글로벌 변수 Global Variables

 

함수 밖에서도 변수를 사용하려면 아까 설명한 ByRef 을 이용할 수도 있고
함수 내에서 변수의 레벨을 global로 설정하면 됩니다

 

글로벌변수 := 111
MsgBox % 글로벌변수 ; 111
Func()
MsgBox % 글로벌변수 ; 222

 

Func(){
 global 글로벌변수 ; 변수 '글로벌변수' 은 global 변수임
 글로벌변수 := 222
}

 

여러 개의 글로벌 변수를 설정하려면 global, 변수 1, 변수 2, 변수 3, ...으로
모든 변수를 글로벌 변수로 설정하려면 global 을 적어주면 됩니다

 

Func(){
 global 변수1, 변수2, 변수3, ... ; 변수1, 변수2, 변수3 을 글로벌변수로, 나머지는 로컬변수
 ...
}

 

Func(){
 global ;모두 글로벌 변수
 ...
}

 

스태틱 변수 Static Variables

 

스태틱 변수는 기본적으로 로컬 변수지만, 추가로 함수 내에서 계속해서 값이 기억된다는 점이 특징입니다
무슨 말인지 코드로 확인해볼까요?

 

일단, 로컬 변수부터 확인해보죠

 

MsgBox % 누적(1) ; 1, 누적안됨
MsgBox % 누적(10) ; 10, 누적안됨
MsgBox % 누적(100) ; 100 , 누적안됨

 

누적(X){
 aug += X
 return aug
}

 

숫자가 누적이 되지 않습니다, 위 코드에서 누적 함수의 aug 변수를 스태틱 변수로 설정하면 어떻게 될까요?

 

MsgBox % 누적(1) ; 1
MsgBox % 누적(10) ; 11
MsgBox % 누적(100) ; 111

 

누적(X)
{
 static aug ; 스태틱 설정
 aug += X
 return aug
}

 

숫자가 계속 누적돼서 나옵니다, 이처럼 스태틱 변수는 함수 내에서 값이 기억되어 사용되는 변수입니다
그래서 처음 1 이 기억되고, 거기다가 10을 더하고, 마지막으로 100을 더하는 거죠

 

여러 개의 스태틱 변수를 설정하려면 static, 변수 1, 변수 2, 변수 3, ...으로
모든 변수를 스태틱 변수 설정하려면 static 을 적어주면 됩니다

 

Func(){
 static 변수1, 변수2, 변수3, ... ; 변수1, 변수2, 변수3 을 스태틱변수로, 나머지는 로컬변수
 ...
}

 

Func(){
 static ;모두 스태틱 변수
 ...
}

 

글로벌 변수와 스태틱 변수를 구분해서 설정하려면 아래처럼 하시면 됩니다
global 글로벌 변수 1, 글로벌 변수 2, ...
static 스태틱 변수 1, 스태틱 변수 2, ..

 

함수 호출 Calling

 

함수 내에서도 함수를 호출할 수 있습니다, 예를 들어

 

ParentFunc()

 

ParentFunc(){
 return ChildFunc()
}

 

ChildFunc(){
 MsgBox, 안녕!
}

 

위 코드는 너무 간단해서 굳이 이렇게 쓸 필요는 없어 보입니다.
실제로 활용될 수 있는 아래 코드를 확인해볼까요?

 

Wait_img("img.bmp", true) ;이미지 찾을시 해당 이미지를 클릭하게한다

ClickFunc(1000, 500) ; 좌표 1000, 500 클릭

 

Wait_img(img, Click := false){
 while !ErrorLevel = 0 ; 이미지를 찾을 때까지
  ImageSearch, vX, vY, 0, 0, A_ScreenWidth, A_ScreenHeight, % A_ScriptDir . "\" img
 return ((Click == true) ? ClickFunc(vX, vY) : 0)
}

 

ClickFunc(X, Y){
 Click %X% %Y%
}

 

한 함수에 몰아넣으면 될 텐데 왜 이렇게 사용하냐고 물으신다면,
반복되는 서브루틴을 개별 함수로 나눠서, 각각의 함수의 범용성을 높이기 위해서죠. 코드도 단축되고요

 

((Click == true) ? ClickFunc(vX, vY) : 0) 가 뭐죠? c언어의 Ternary Operator 입니다, 오토핫키도 c로 작성된 언어라 모든 연산자와 표현식은 c 하고 똑같습니다
모르셨다면 if, else를 한 문장으로 축약하는 표현식이라고 알아두시면 됩니다
Click 파라미터가 true라면 이미지를 클릭하고, false 면 클릭하지 않습니다

 

함수 객체 Func Object

 

프로그래밍에 대해 관심을 가졌다면, 언젠가 객체지향언어라는 것을 들어보았을 겁니다
C++, C# 그리고 자바 등 요즘 사용되는 언어는 대부분 객체지향언어인데요
객체지향프로그래밍의 이유는 점점 프로그램의 규모가 커지고, 개인보다는 집단이 개발하는 오픈소스 소프트웨어가 많아지기 때문이기도 합니다
객체로 나눠서 작성하면 유지 보수가 수월하고, 다른 개발자가 코드 개발에 참여하기도 쉽죠

 

그리고 객체지향언어에서 객체를 동적(Dynamic)으로 컨트롤하는 언어를 프로토타입 지향 언어라고 하는데
이와 같은 언어로는 대표적으로 자바스크립트가 있고, 오토핫키가 있습니다(!!!)

이 부분은 나중에 작성할 클래스 글에서 다루도록 하고, 일단은 함수 객체로 바로 넘어가죠 사실, 지식이 바닥남

 

함수 객체 (Func Object)는 함수 참조 Func Reference로 더 많이 불리는 거 같은데, 후자가 더 의미에 가까운 것 같습니다
말 그대로, 변수가 함수를 참조할 수 있게 하는 거죠. 해당 변수는 함수로의 포인터라고 이해해도 되고요

 

fn := Func("더하기") ; fn이 더하기 함수를 참조하도록 함
MsgBox % fn.Call(10, 10) ;함수 호출

 

더하기(X, Y)
{
 return X + Y
}

 

정말 신기하지 않습니까!!!?
이를 사용하면 라벨을 기본적으로 사용하는 셋타이머가 함수를 실행하게 할 수도 있습니다

 

#Persistent
fn := Func("알림")
SetTimer, % fn, 5000 ; 5초마다 알림 함수 호출

 

알림()
{
 MsgBox, 0, , 안녕, 3
}

 

사전에 파라미터를 설정해둘 수도 있습니다

 

#Persistent
fn := Func("알림").Bind("파라미터 바인드")
SetTimer, % fn, 5000 ; 5초마다 알림 함수 호출

알림(Txt)
{
 MsgBox, 0, , % Txt, 3
}


이후에는 클래스와 멀티 스레드에 대해 알아보도록 하겠습니다, 언제 작성할지는 지금은 모르겠네요

  1. 세준 2015.12.11 11:13 신고

    항상 글 잘 보구 있습니다. 다음에 포스팅하실 클래스가 궁금하네요 ^^ 오토핫키 L 이후부터는 도움말에는 정보가 넘 적은 거 같아서 혼자 익히기 어려움니 있네요..

  2. 구리 2015.12.28 20:50 신고

    좋은 강의 항상 감사합니다. 멀티 스레드 관련한 내용이 더욱 기다려지네요.^^ 함수에 관해서 약간 어렵고 거부감 들어서 잘 사용하지 않았는데 덕분에 스크립트도 깔끔하게 유지할 수 있게 될 것 같습니다. 감사합니다.

  3. 새우깡 2016.03.31 01:57 신고

    깔끔한 강좌 잘 보고 있습니다.
    프로그램에 대해서 아무것도 모르는 상태에서 오토핫키를 배워 업무에 아주 유용하게 사용하고 있습니다.
    간단한 코드로 시작해서 함수의 사용으로 코드를 줄였고
    이번에는 클래스를 사용해서 더 효율적인 코드를 짜고 싶은데...
    제가 이해, 활용할 수 있는 강좌 찾기가 쉽지 않네요.
    시간 되실때 클래스 강좌 업데이트 해주시면 감사하겠습니다.

    알찬 강좌 기대합니다!

    • BlogIcon 예지력 2016.05.04 16:17 신고

      정말 적고 싶은데, 일상에 치여 따로 글 작성할 시간이 안 나네요 주륵..

  4. 그니 2018.07.30 21:41 신고

    static 몰라서 한참 헤맸어요 ㅎㅎ

    덕분에 많이 배워갑니다 감사합니다^^

Language : AutoHotkey_L

Author : HotKeyit

Function : Wait for a window to be created

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

 

라이브러리

'프로그래밍 > Archive' 카테고리의 다른 글

[Lib] Class Msgbox  (6) 2015.11.27
[Lib] CleanNotify  (4) 2015.11.21
WinWaitCreated()  (0) 2015.10.17
MS Office Style Gui 프로토타입  (4) 2015.10.09
GetActiveObjects 활성중인 객체를 불러온다  (0) 2015.03.04
L 유니코드32비트 1.1.19.03  (11) 2015.02.21

 

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

 

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

 

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 신고

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

  4. 2018.05.04 16:05

    비밀댓글입니다

    • 정인덕 2018.05.04 16:09 신고

      예지력님 도움 요청 드립니다.

      vip490@daum.net

      TCP/IP 통신 중 SEND 부분에서 막혀 고생중입니다.

      도움 간곡하게 부탁드리오니

      Mail 연락 주시면 자세히 요청 드리겠습니다.

      감사합니다
      010-7760-4416
      2018.5.4 금

    • BlogIcon 예지력 2018.05.04 16:11 신고

      네트워크 부분은 제가 잘 몰라서 도움이 드릴 수 없을 것 같습니다,, 프로그래밍 공부를 쉰 지도 오래되었고요

예전에 프로그램 만들때 사용했던 마이크로소프트 오피스 gui 프로토타입입니다

초기때는 이미지 사용한 버전이라, 이미지 안쓰려고 전부다 프로그레스바로 바꾼 노가다의 흔적떄문에 눈물이 나네요

 

오토핫키L의 제작자 Lexikos가 1.1.20 버전부터 새로 추가한 기능인 BoundFunc을 코드내에서 사용하니

관심이 있다면 아래 코드를 통해 사용예를 확인해보시는것도 공부에 도움이 될 듯 합니다

 

MS오피스 스타일GUI.ahk

 

코드에 주석달아서 더럽히는(...)걸 좋아하지 않아서 주석이 없지만 글작성하면서 아래에 적어두니 참고하시기 바랍니다

 

#SingleInstance, Off  ;프로그램 중복실행 허용
#NoEnv  ;내장환경변수 제거, 퍼포먼스 향샹 목적
#NoTrayIcon  ;트레이아이콘 제거
#KeyHistory;키저장기능 제거, 퍼포먼스 향샹 목적
ListLines Off  ;라인제거, 퍼포먼스 향샹 목적
SetWinDelay, 0  ;윈도우 관련 딜레이 최소한으로 설정 (-1은 딜레이X)
SetBatchLines, -1  ;코드간 자동 Sleep 삭제, 속도 향샹 목적

new OfficeGUI()
return

 

class OfficeGUI {

 

static GuiW := A_ScreenWidth * 0.3, GuiH := A_ScreenHeight * 0.6  ;시작 Static 변수 Assign

 

__New() {

 

this.Bound := []  ;오브젝트 생성
this.Bound.IconButton := this.IconButton.Bind(this)  ;이하 버튼 g라벨 초기 설정 구간
this.Bound.MinimizeButton := this.MinimizeButton.Bind(this)
this.Bound.MaximizeButton := this.MaximizeButton.Bind(this)
this.Bound.CloseButton := this.CloseButton.Bind(this)
this.Bound.MoveButton := this.MoveButton.Bind(this)
this.Color := "FFFFFF"  ;배경색 Assign

 

Gui, New, -DPIScale -Caption +Resize +hwndhMainWindow  ;구이 윈도우설정
this.hMainWindow := hMainWindow  ;클래스내 사용을위해 hwnd 설정

 

Gui, Margin, 0, 0  ;컴포넌트 간의 기본폭 삭제
Gui, Color, % this.Color  ;배경색 지정

 

; 아래는 BoundFunction 관련 코드 (도움말 http://ahkscript.org/docs/objects/Functor.htm)

Gui, Add, Text, % " x" 1 " y" 1 " w" 37 " h" 28 " +BackgroundTrans hwndhIconButton"  ; 아이콘 영역 설정
this.hIconButton := hIconButton  ;아이콘 hwnd 설정
BoundIconButton := this.Bound.IconButton  ;함수 바운드
GuiControl, +g, %hIconButton%, %BoundIconButton%  ;아이콘버튼 g라벨 바운드

 

Gui, Add, Text, % " x" this.GuiW-89 " y" 4 " w" 29 " h" 22 " +BackgroundTrans hwndhMinimizeButton" ;최소화 영역 설정
this.hMinimizeButton := hMinimizeButton  ;최소화 hwnd 설정
BoundMinimizeButton := this.Bound.MinimizeButton  ;함수 바운드
GuiControl, +g, %hMinimizeButton%, %BoundMinimizeButton%  ;최소화버튼 g라벨 바운드

 

Gui, Add, Text, % " x" this.GuiW-59 " y" 4 " w" 29 " h" 22 " +BackgroundTrans hwndhMaximizeButton"  ;최대화  영역
this.hMaximizeButton := hMaximizeButton  ;최대화 hwnd 설정
BoundMaximizeButton := this.Bound.MaximizeButton  ;함수 바운드
GuiControl, +g, %hMaximizeButton%, %BoundMaximizeButton%  ;최대화버튼 g라벨 바운드

 

Gui, Add, Text, % " x" this.GuiW-30 " y" 4 " w" 29 " h" 22 " +BackgroundTrans hwndhCloseButton"  ;종료 (X) 영역
this.hCloseButton := hCloseButton  ;종료 hwnd 설정
BoundClose := this.Bound.CloseButton  ;함수바운드
GuiControl, +g, %hCloseButton%, %BoundClose%  ;종료버튼 g라벨 바운드

 

Gui, Add, Text, % " x" 1 " y" 1 " w" this.GuiW-2 " h" 28 " +BackgroundTrans hwndhMoveButton"  ;상단바  영역
this.hMoveButton := hMoveButton  ;hwnd 설정
BoundMoveButton := this.Bound.MoveButton  ;함수바운드
GuiControl, +g, %hMoveButton%, %BoundMoveButton%  ;상단 드래그영역 g라벨 바운드

 

;이제부터는 Progrss를 이용한 버튼이미지 그리기 부분

Gui, Add, Progress, % " x" 11 " y" 4 " w" 16 " h" 16 " Background0072C6", 0  ;GUI 아이콘

Gui, Add, Progress, % " x" this.GuiW-80 " y" 10 " w" 9 " h" 2 " Background777777 hwndhMin", 0  ;GUI MINIMIZE

Gui, Add, Progress, % " x" this.GuiW-50 " y" 3 " w" 11 " h" 2 " Background777777 hwndhMaxT", 0  ;GUI 최대화 top
Gui, Add, Progress, % " x" this.GuiW-50 " y" 11 " w" 11 " h" 2 " Background777777 hwndhMaxB", 0  ;GUI 최대화 bottom
Gui, Add, Progress, % " x" this.GuiW-41 " y" 3 " w" 2 " h" 10 " Background777777 hwndhMaxR", 0  ;GUI 최대화 right
Gui, Add, Progress, % " x" this.GuiW-50 " y" 3 " w" 2 " h" 10 " Background777777 hwndhMaxL", 0  ;GUI 최대화 left
  
Gui, Add, Progress, % " x" this.GuiW-20 " y" 4 " w" 1 " h" 1 " Background777777 hwndhXTL1", 0  ;GUI CLOSE TOP-LEFT 01
Gui, Add, Progress, % " x" this.GuiW-21 " y" 5 " w" 3 " h" 1 " Background777777 hwndhXTL2", 0  ;GUI CLOSE TOP-LEFT 02
Gui, Add, Progress, % " x" this.GuiW-20 " y" 6 " w" 3 " h" 1 " Background777777 hwndhXTL3", 0  ;GUI CLOSE TOP-LEFT 03
Gui, Add, Progress, % " x" this.GuiW-13 " y" 4 " w" 1 " h" 1 " Background777777 hwndhXTR1", 0  ;GUI CLOSE TOP-RIGHT 01
Gui, Add, Progress, % " x" this.GuiW-14 " y" 5 " w" 3 " h" 1 " Background777777 hwndhXTR2", 0  ;GUI CLOSE TOP-RIGHT 02
Gui, Add, Progress, % " x" this.GuiW-15 " y" 6 " w" 3 " h" 1 " Background777777 hwndhXTR3", 0  ;GUI CLOSE TOP-RIGHT 03
Gui, Add, Progress, % " x" this.GuiW-19 " y" 7 " w" 6 " h" 1 " Background777777 hwndhXC1", 0  ;GUI CLOSE CENTER 01
Gui, Add, Progress, % " x" this.GuiW-18 " y" 8 " w" 4 " h" 1 " Background777777 hwndhXC2", 0  ;GUI CLOSE CENTER 02
Gui, Add, Progress, % " x" this.GuiW-18 " y" 9 " w" 4 " h" 1 " Background777777 hwndhXC3", 0  ;GUI CLOSE CENTER 03
Gui, Add, Progress, % " x" this.GuiW-19 " y" 10 " w" 6 " h" 1 " Background777777 hwndhXC4", 0  ;GUI CLOSE CENTER 04
Gui, Add, Progress, % " x" this.GuiW-20 " y" 11 " w" 3 " h" 1 " Background777777 hwndhCBL1", 0  ;GUI CLOSE BOTTOM-LEFT 01
Gui, Add, Progress, % " x" this.GuiW-21 " y" 12 " w" 3 " h" 1 " Background777777 hwndhCBL2", 0  ;GUI CLOSE BOTTOM-LEFT 02
Gui, Add, Progress, % " x" this.GuiW-20 " y" 13 " w" 1 " h" 1 " Background777777 hwndhCBL3", 0  ;GUI CLOSE BOTTOM-LEFT 03
Gui, Add, Progress, % " x" this.GuiW-15 " y" 11 " w" 3 " h" 1 " Background777777 hwndhCBR1", 0  ;GUI CLOSE BOTTOM-RIGHT 01
Gui, Add, Progress, % " x" this.GuiW-14 " y" 12 " w" 3 " h" 1 " Background777777 hwndhCBR2", 0  ;GUI CLOSE BOTTOM-RIGHT 02
Gui, Add, Progress, % " x" this.GuiW-13 " y" 13 " w" 1 " h" 1 " Background777777 hwndhCBR3", 0  ;GUI CLOSE BOTTOM-RIGHT 03
Gui, Add, Progress, % " x" 1 " y" this.GuiH-23 " w" this.GuiW-2 " h" 22 " Background0072C6 hwndhBar", 0  ;GUI STATUSBAR


Gui, Font, s9 c444444, Segoe UI  ;프로그램 타이틀 텍스트를위해 폰트설정
Gui, Add, Text, % " x" 37 " y" 2 " w" this.GuiW-96 " +Center +BackgroundTrans hwndhTitletext", 프로그램 타이틀
Gui, Font  ;폰트 초기화


Gui, Font, s8 cFFFFFF, Segoe UI  ;하단 메시지 텍스트를위해 폰트설정
Gui, Add, Text, % " x" 8 " y" this.GuiH-19 " w" this.GuiW-16 " +BackgroundTrans hwndhBarText", 하단 메시지 텍스트
Gui, Font  ;폰트 초기화


WinEvents.Register(this.hMainWindow, this)  ;기본 GuiEvent 레지스트


Gui, Show, % " w" this.GuiW " h" this.GuiH, GUI

}

 

IconButton()  ;아이콘버튼, Bound된 g라벨 Function
{
    SendInput, !{Space}  ;컨트롤메뉴 보이게
}

 

MinimizeButton()  ;최소화버튼, Bound된 g라벨 Func
{
    WinMinimize
}

 

MaximizeButton()  ;최대화버튼, Bound된 g라벨 Func
{
    VarSetCapacity(rect, 16, 0)
    DllCall("GetClientRect", uint, this.hMainWindow, uint, &rect )  ;보더와 캡션을 제외한 실제 윈도우영역을 구함
    if (NumGet( rect, 8, "int" ) >= A_ScreenWidth - 50)
        WinRestore
   else
       WinMaximize
}

 

MoveButton() ;상단 드래그영역, Bound된 g라벨 Func
{
    PostMessage, 0xA1, 2,,, A  ;드래그
}

 

CloseButton()  ;종료 X버튼, Bound된 g라벨 Func
{
    this.Delete("Bound")  ;Bound 오브젝트 제거
    WinEvents.Unregister(this.hMainWindow)  ;기본 GuiEvent 설정 언로드
    Gui, Destroy
    ExitApp
}

 

GuiSize()  ;구이 리사이즈, WinEvents.Register(this.hMainWindow, this)로 인해 Bound됨
{
    global
    GuiControl, Move, % this.hMinimizeButton, % "x" A_GuiWidth - 89 " y" 4 " w" 29 " h" 22
    GuiControl, Move, % this.hMaximizeButton, % "x" A_GuiWidth - 59 " y" 4 " w" 29 " h" 22
    GuiControl, Move, % this.hCloseButton, % "x" A_GuiWidth - 29 " y" 4 " w" 29 " h" 22
    GuiControl, Move, % this.hMoveButton, % "x" 1 " y" 1 " w" A_GuiWidth - 2 " h" 28
    GuiControl, Move, % hMin, % "x" A_GuiWidth - 80 " y" 10 " w" 9 " h" 2
    GuiControl, Move, % hMaxT, % "x" A_GuiWidth - 50 "y" 3 "w" 11 "h" 2
    GuiControl, Move, % hMaxB, % "x" A_GuiWidth - 50 "y" 11 "w" 11 "h" 2
    GuiControl, Move, % hMaxR, % "x" A_GuiWidth - 41 "y" 3 "w" 2 "h" 10
    GuiControl, Move, % hMaxL, % "x" A_GuiWidth - 50 "y" 3 "w" 2 "h" 10
    GuiControl, Move, % hXTL1, % "x" A_GuiWidth - 20 " y" 4 " w" 1 " h" 1
    GuiControl, Move, % hXTL2, % "x" A_GuiWidth - 21 " y" 5 " w" 3 " h" 1
    GuiControl, Move, % hXTL3, % "x" A_GuiWidth - 20 " y" 6 " w" 3 " h" 1
    GuiControl, Move, % hXTR1, % "x" A_GuiWidth - 13 " y" 4 " w" 1 " h" 1
    GuiControl, Move, % hXTR2, % "x" A_GuiWidth - 14 " y" 5 " w" 3 " h" 1
    GuiControl, Move, % hXTR3, % "x" A_GuiWidth - 15 "y" 6 "w" 3 "h" 1
    GuiControl, Move, % hXC1, % "x" A_GuiWidth - 19 " y" 7 " w" 6 " h" 1
    GuiControl, Move, % hXC2, % "x" A_GuiWidth - 18 " y" 8 " w" 4 " h" 1
    GuiControl, Move, % hXC3, % "x" A_GuiWidth - 18 " y" 9 " w" 4 " h" 1
    GuiControl, Move, % hXC4, % "x" A_GuiWidth - 19 " y" 10 " w" 6 " h" 1
    GuiControl, Move, % hCBL1, % "x" A_GuiWidth - 20 " y" 11 " w" 3 " h" 1
    GuiControl, Move, % hCBL2, % "x" A_GuiWidth - 21 " y" 12 " w" 3 " h" 1
    GuiControl, Move, % hCBL3, % "x" A_GuiWidth - 20 " y" 13 " w" 1 " h" 1
    GuiControl, Move, % hCBR1, % "x" A_GuiWidth - 15 " y" 11 " w" 3 " h" 1
    GuiControl, Move, % hCBR2, % "x" A_GuiWidth - 14 " y" 12 " w" 3 " h" 1
    GuiControl, Move, % hCBR3, % "x" A_GuiWidth - 13 " y" 13 " w" 1 " h" 1
    GuiControl, Move, % hBar, % "x" 1 " y" A_GuiHeight - 23 " w" A_GuiWidth - 2 " h" 22
    GuiControl, Move, % hTitletext, % "x" 37 " y" 2 " w" A_GuiWidth - 96
    GuiControl, Move, % hBarText, % "x" 8 " y" A_GuiHeight - 19 " w" A_GuiWidth - 16
    WinSet, Redraw
}

}

 

class WinEvents
{
    static Table := {}


Register(hWnd, Class, Prefix="Gui")
{
    Gui, +LabelWinEvents.
    this.Table[hWnd] := {Class: Class, Prefix: Prefix}
}


Unregister(hWnd)
{
    this.Table.Delete(hWnd)
}


Dispatch(hWnd, Type)
{
    Info := this.Table[hWnd]
    return Info.Class[Info.Prefix . Type].Call(Info.Class)
}


Size()
{
    return WinEvents.Dispatch(this, "Size")
}

}

'프로그래밍 > Archive' 카테고리의 다른 글

[Lib] CleanNotify  (4) 2015.11.21
WinWaitCreated()  (0) 2015.10.17
MS Office Style Gui 프로토타입  (4) 2015.10.09
GetActiveObjects 활성중인 객체를 불러온다  (0) 2015.03.04
L 유니코드32비트 1.1.19.03  (11) 2015.02.21
암호화 , 복호화 프로그램  (18) 2015.02.19
  1. 람바랄 2016.12.16 14:51 신고

    소중한 정보 감사합니다 적용을해보고있는데 창의 전체 크기에서 절반정도로 줄여서 사용하고자하는데 어느부분을 건들어야 작아질까요?

    • BlogIcon 예지력 2016.12.16 15:13 신고

      static GuiW := A_ScreenWidth * 0.3, GuiH := A_ScreenHeight * 0.6 이 부분 수정하세요!

  2. qmf369 2018.01.25 23:11 신고

    소중한 디자인 감사합니다
    이디자인중 하단텍스트부분만 빼서 사용할려고했더니 잘안되더라구요...어떻게 수정을 하면 일반 스마트구이에 그대로 넣을수있을까요?ㅠㅠ

    • BlogIcon 예지력 2018.02.25 01:04 신고

      Gui, Font, s8 cFFFFFF, Segoe UI ;하단 메시지 텍스트를위해 폰트설정
      Gui, Add, Text, % " x" 8 " y" this.GuiH-19 " w" this.GuiW-16 " +BackgroundTrans hwndhBarText", 하단 메시지 텍스트
      Gui, Font ;폰트 초기화



      GuiControl, Move, % hTitletext, % "x" 37 " y" 2 " w" A_GuiWidth - 96
      GuiControl, Move, % hBarText, % "x" 8 " y" A_GuiHeight - 19 " w" A_GuiWidth - 16

      이 부문만 따로 빼서 쓰세요

 

오토핫키에서 값을 저장하고 불러오는 목적으로 .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로 글자입력

      이게 가능할까요?

  15. 나그네 2018.06.15 19:33 신고

    죄송합니다만...ㅜㅜ
    제껀 왜안될까요?? 예제3번 복사해서 scite4autohotkey에 붙여넣고 저장한후같은폴더에 ReadURL.ahk파일 다운받아서 넣어두어도 안되네요

    ReadURL(URL, encoding = "utf-8") {
    ;밑엔 생략

    이거 복사해서 밑에 붙여넣어도 안되고요 중간에 텍스트박스 넣으면 제가 넣은 텍스트 박스만 뜨고. 나머지는 안뜹니다.

    #inclue 는 #inclued로 수정했고요

Author : Lexikos

Language : AutoHotkey L

Function : Get multiple active COM objects, 현재 활성중인 컴 객체를 가져온다

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


Library

; GetActiveObjects v1.0 by Lexikos

; http://ahkscript.org/boards/viewtopic.php?f=6&t=6494
GetActiveObjects(Prefix:="", CaseSensitive:=false) {
    objects := {}
    DllCall("ole32\CoGetMalloc", "uint", 1, "ptr*", malloc) ; malloc: IMalloc
    DllCall("ole32\CreateBindCtx", "uint", 0, "ptr*", bindCtx) ; bindCtx: IBindCtx
    DllCall(NumGet(NumGet(bindCtx+0)+8*A_PtrSize), "ptr", bindCtx, "ptr*", rot) ; rot: IRunningObjectTable
    DllCall(NumGet(NumGet(rot+0)+9*A_PtrSize), "ptr", rot, "ptr*", enum) ; enum: IEnumMoniker
    while DllCall(NumGet(NumGet(enum+0)+3*A_PtrSize), "ptr", enum, "uint", 1, "ptr*", mon, "ptr", 0) = 0 ; mon: IMoniker
    {
        DllCall(NumGet(NumGet(mon+0)+20*A_PtrSize), "ptr", mon, "ptr", bindCtx, "ptr", 0, "ptr*", pname) ; GetDisplayName
        name := StrGet(pname, "UTF-16")
        DllCall(NumGet(NumGet(malloc+0)+5*A_PtrSize), "ptr", malloc, "ptr", pname) ; Free
        if InStr(name, Prefix, CaseSensitive) = 1 {
            DllCall(NumGet(NumGet(rot+0)+6*A_PtrSize), "ptr", rot, "ptr", mon, "ptr*", punk) ; GetObject
            ; Wrap the pointer as IDispatch if available, otherwise as IUnknown.
            if (pdsp := ComObjQuery(punk, "{00020400-0000-0000-C000-000000000046}"))
                obj := ComObject(9, pdsp, 1), ObjRelease(punk)
            else
                obj := ComObject(13, punk, 1)
            ; Store it in the return array by suffix.
            objects[SubStr(name, StrLen(Prefix) + 1)] := obj
        }
        ObjRelease(mon)
    }
    ObjRelease(enum)
    ObjRelease(rot)
    ObjRelease(bindCtx)
    ObjRelease(malloc)
    return objects
}


'프로그래밍 > Archive' 카테고리의 다른 글

WinWaitCreated()  (0) 2015.10.17
MS Office Style Gui 프로토타입  (4) 2015.10.09
GetActiveObjects 활성중인 객체를 불러온다  (0) 2015.03.04
L 유니코드32비트 1.1.19.03  (11) 2015.02.21
암호화 , 복호화 프로그램  (18) 2015.02.19
Animate gif GUI  (0) 2015.02.19


이건 뭐죠?


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

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


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

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

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

강의파일(.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.
    유챗 또는 가가라이브 같은 채팅창에서 엔터키를 눌러도
    채팅이 되는방법.

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

  15. 2018.05.01 14:02

    비밀댓글입니다

    • BlogIcon 예지력 2018.05.01 14:20 신고

      방명록을 이용하시면 좋은데요!
      visionary1@daum.net 입니다

수정본.zip

 

ㅡ 뮤텍스

ㅡ 클래스네임

ㅡ 자동으로 관리자권한

ㅡ 아이콘변경

'프로그래밍 > Archive' 카테고리의 다른 글

MS Office Style Gui 프로토타입  (4) 2015.10.09
GetActiveObjects 활성중인 객체를 불러온다  (0) 2015.03.04
L 유니코드32비트 1.1.19.03  (11) 2015.02.21
암호화 , 복호화 프로그램  (18) 2015.02.19
Animate gif GUI  (0) 2015.02.19
메모리최적화 MemoryInfo  (0) 2015.02.15
  1. 까망 2015.02.21 16:13 신고

    감사합니다
    잘 쓸게요 ^^

  2. 호이 2015.02.24 17:04 신고

    어떻게 사용하는건가요 ?

    더블클릭해도 무반응인데 ㅎㅎ

    • BlogIcon 예지력 2015.02.24 20:42 신고

      이게 뭔지는 아시는건가요?;;
      내부수정을 거친 오토핫키 원본파일입니다

  3. 오토핫키초보 2015.03.12 09:04 신고

    안녕하세요
    C프로그래밍에 대한 지식이 없는 상태에서 오토핫키 오픈소스를 직접 컴파일할려고 하다보니 자꾸 에러만 뜨고 잘 안됩니다 ㅠㅠ
    현재 운영체제는 윈7 64비트구요. Microsoft Visual C++ 2010 Express를 설치했습니다.
    에러메시지는 아래처럼 뜨는데 해결방법 좀 알려주세요.
    AutoHotkeyx.vcxproj : warning : 프로젝트 파일 'AutoHotkeyx'에 참조된 'x64' 플랫폼을 찾을 수 없습니다. 이 플랫폼을 '%VCTargetsPath%\Platforms\x64' 아래에 설치했는지 확인하십시오.
    source\lib_pcre\lib_pcre.vcxproj : warning : 프로젝트 파일 'lib_pcre'에 참조된 'x64' 플랫폼을 찾을 수 없습니다. 이 플랫폼을 '%VCTargetsPath%\Platforms\x64' 아래에 설치했는지 확인하십시오.
    warning C4819: 현재 코드 페이지(949)에서 표시할 수 없는 문자가 파일에 들어 있습니다. 데이터가 손실되지 않게 하려면 해당 파일을 유니코드 형식으로 저장하십시오.
    LINK : fatal error LNK1123: COFF로 변환하는 동안 오류가 발생했습니다. 파일이 잘못되었거나 손상되었습니다.

    • BlogIcon 예지력 2015.03.12 22:19 신고

      지금 제가 올린버전 이후로 최신버전은 2010으로 빌드안되는걸로 알고있는데
      인코딩문제니까 솔루션 타입에서 문자집합을 멀티바이트로 바꾸고 빌드해보세요

  4. 오토핫키초보 2015.03.13 17:38 신고

    최신버전인 1.1.20.02 소스코드는 아무리 해도 자꾸 오류가 납니다.
    그래서 가지고 계신 구버전 1.1.19.03 원본 소스 파일을 올려주시면 정말 감사하겠습니다
    현재 홈페이지에는 최신버전밖에 없어서요.... ㅠㅠ 부탁드립니다

    • BlogIcon 예지력 2015.03.13 19:18 신고

      저도 구버전 소스는 없네요. 이거 빌드하고 며칠뒤에 포맷해서요
      그나저나 구버전이시라면 위 파일 사용하시면 될텐데요

  5. 별목 2015.04.30 09:42 신고

    컴파일러는 수정된 버전 없으신가요?
    컴파일 안된 상태로 사용시에는 별 문제가 없는데 컴파일을 하면 잡히내요.

  6. 가나다 2015.07.19 21:57 신고

    뮤텍스... 읽다가읽다가 전혀 모르겠어서 흘러들어왔어요.
    다른 강의도 몇번 정독하며 읽었네요
    아주 잘 정리해주셔서 감사합니다.^^

  7. 궁금합니다. 2016.06.08 21:39 신고

    클래스네임 바꾸는 방법이 궁금합니다.
    script2.cpp 파일에서 바꾸는건가요? 자세히좀 알려주시면 감사합니다.

 

암호/-복호화

 

무료 암호화/-복호화 프로그램입니다, 미국 정부의 표준 암호화 알고리즘 AES외에도 3DES,RC 등 다양한 알고리즘을 제공합니다!

 

드래드드롭을 지원해서 파일을 위 박스로 끌어서 파일의 내용을 불러올수있고, 사용자가 직접 텍스트를 입력할 수도 있습니다.

 

암호화 또는 복호화된 텍스트는 사용자의 설정에 따라 자동으로 클립보드로 복사가 가능합니다.

 

다운로드 아무런 기능제약이 없는 무료 프로그램입니다

 

암호-복호화.zip

 

 

바이러스가 없는 안전한 파일입니다

'프로그래밍 > Archive' 카테고리의 다른 글

GetActiveObjects 활성중인 객체를 불러온다  (0) 2015.03.04
L 유니코드32비트 1.1.19.03  (11) 2015.02.21
암호화 , 복호화 프로그램  (18) 2015.02.19
Animate gif GUI  (0) 2015.02.19
메모리최적화 MemoryInfo  (0) 2015.02.15
로그인 폼디자인  (0) 2015.02.05
  1. fff46 2015.03.02 18:22 신고

    오토핫키에 암호화된 문자열을 넣어도 인식하나요?

    • BlogIcon 예지력 2015.03.03 22:46 신고

      네 가능하죠, 하지만 언래 문자열을 출력할때는 복호화시키는 과정을 거쳐야하겠죠

  2. abedddd 2015.05.02 12:23 신고

    암호화 복호화를 해주는 프로그램인가요?
    만약 맞다면 반대로 풀수있는 프로그램은 없는거죠?ㅠ

  3. ㅁㅁ 2015.07.08 21:34 신고

    클립보드 복사하고
    어떻게 해요..?
    사용방법을 모르겧어요.

  4. 고맙습니다 2015.10.28 19:15 신고

    잘 사용하겠습니다. 혹시 이런 종류 프로그램에서 LEA 알고리즘을 지원하는 것이 있을까요?

  5. 안녕하세요 2015.12.25 12:47 신고

    예를 들어 Msgbox, 반갑습니다 를 AES256으로 암호화 하고
    암호화된 것을 SciTe4편집기에 복붙하여 실행하면 오류가 나는데
    암호화된 코드로 Ahk실행시 "Msgbox, 반갑습니다" 구현되게 하려면
    암호화된 스크립트 내에 '이 스크립트는 Aes256방식을 사용하여 나타내겠다' 라는 함수같은걸 따로 넣어줘야하는가요?

    • BlogIcon 예지력 2015.12.25 12:50 신고


      근데 이걸 자꾸 소스코드 암호화랑 혼동하시는 분들이 굉장히 많네요 특히 오토핫키에서요, 그런것과는 연관이 없는데 말이죠 @_@

  6. 임찬호 2016.03.13 23:09 신고

    암호화된스크립트내에서 이스크립트는 Aes256방식을 사용하여 나타내겠다 예제를 알려주실수있으신가요?
    정확히 사용법이없어서 사용을못하겠습니다.

  7. 2016.03.21 04:01

    비밀댓글입니다

  8. 이민호 2016.04.17 12:27 신고

    저도 암호화된 스크립트 내에서 aes256방식으로 사용하여 나타내겠따는 예저를 알려주실수있나여 찾아봐도 없는거같네요 프로그램은 훌륭합니다!!

  9. encryptolocker 2017.03.26 21:09 신고

    3des는 어떻게 구현하였나요?2개의 암-복호화키가 필요할탠데..

  10. 안녕하세요 2017.04.17 19:52 신고

    사용방법을 전혀 모르겠는데 간단한 예시같은게 있을까요?

  11. 강선봉 입니다 ksdsun123@gmail.com 2017.09.22 22:58 신고

    저기 지금 컴퓨터가 관리자를하고있어서 이것도 저것도 못하고있습ㄴ다
    비밀번호룰좀 가르쳐주시던지 암호를 없애주시던지 부탁드립니다

  12. ksdsun123@gmail.com 2017.09.22 23:17 신고

    암호화 복호하를 아까전에 토랜토에서 다운받았다가 제가 잘모르고 압축을 풀었나보네요 사실 사용방법도 모르는데 신기해서 샀다가..
    어떻게해야되나요? 포맷할까요? 참 난감합니다.. 부탁드려요

  13. soh1313 2018.01.22 18:12 신고

    오토핫키 맞춤으로는 없나용?ㅇㅅㅇ

  14. 라이제르 2018.08.10 11:39 신고

    혹시 해당파일 사용하면서

    사용하던 스크립트를 주입시켜

    암호화해 스크립트를 만들었는데 이부분을 컴파일후 실행이 정상적으로되려면

    어떻게 해야 할까요 ㅠㅠ? 부탁드립니다..

+ Recent posts