오토핫키 강좌 #6 - FormatTime (오토핫키 붙여넣기)




안녕하세요~ 킴영감입니다~


요즘 바쁜일이 있어서 강좌를 자주 올리지 못하네요...


기다리시는 분들께 죄송하다는 말씀 먼저 드립니다.ㅠ


오늘 오랜만에 제 강좌를 보시는 분께서 질문해 주신 내용으로 강좌를 진행하려고 합니다.


매크로를 만들어서 돌리다보면 게임이 종료되거나 검은화면으로 되는 등 원하지 않는 현상들이 발생합니다.


이럴 경우 게임을 다시 실행하거나 프로그램을 다시 실행하는 기능이 절실하게 느껴지실 것입니다.


위와 같이 고민하고 계시는 분들을 위해서 일정 시간동안 아무 작업을 하지 않을 경우 프로그램을 종료한 뒤 다시 실행하는 기능을 붙여넣어서 사용하실 수 있도록 함수로 구현해 드리겠습니다.  (두 강좌에 나눠서 진행하겠습니다.)


그럼 간만의 강좌를 힘차게 시작해 보겠습니다.



1. FormatTime


FormatTime은 컴퓨터의 시간을 받아오는 명령어 입니다.


원하는 형식으로 시간을 받아올 수 있으며 사용방법은 아래와 같습니다.


 FormatTime, 시간을 저장할 변수, 받아올 정보, 정보를 표시할 포멧


시간을 저장할 변수 - 원하는 변수 이름을 적으시면 됩니다.


받아올 정보 - 날짜, 시간 중 받아오고 싶은 것을 정하는 부분입니다. 년, 월, 일, 시, 분, 초를 모두 사용할 수 있으며 각각에 해당하는 양식을 적어주시면 됩니다. (년: YYYY, 월: M, 일: D, 시: H24 또는 H12, 분: m, 초: s) 예를 들어 분과 초만 받아오고 싶을 경우 다음과 같이 스크립트를 작성하시면 됩니다. (예시: FormatTime, 변수, m s, m s).


정보를 표시할 포멧 - 말 그대로 정보를 표시할 포멧입니다. 오토핫키에서는 변수의 자료형을 따로 정의하지 않기 때문에 표시할 형태만 설정해 주면 됩니다. 예를 들어 분과 초를 표시할 때 "3분40초"라는 형태로 표시하고 싶으시면 "FormatTime, 변수, ms, m분s초" 라고 작성하시면 됩니다.


2. FormatTime을 활용한 시간확인 함수


특정 동작을 하지 않는 시간이 5초 이상이 되면 메세지 박스를 띄우는 프로그램을 생각해 봅시다.


프로그램이 시작되면 루프를 돌고 위에서부터 한줄씩 내려가면서 코드를 수행하게 됩니다. 그럼 루프 내부에 제일 아래쪽에 시간을 확인하는 코드를 추가하면 되겠죠??


여기에 추가로 "동작을 하지 않은 시간을 저장하는 변수"와 "마지막 동작을 한 시간"을 저장하는 변수, "현재시간"을 저장하는 변수가 필요합니다.


밑그림을 그렸으니 코드를 작성해 보도록 하겠습니다. 


아래와 같이 스크립트를 작성하세요.



이번 강좌에서는 간편하게 핫키로 동작하도록 스크립트를 작성했습니다.


F2 키를 누르면 프로그램이 시작하고 F3 키를 누르면 프로그램이 종료됩니다.



"현재시간", "마지막동작시간", "동작을하지않은시간" 이라는 변수를 선언하고 0으로 초기화합니다. 루프로 들어가기 직전에 "마지막 동작시간"을 갱신해주고 작업을 시작합니다.


작업이미지를 찾았을 경우에 마지막동작시간을 갱신함으로써 작업이 멈춘 시점부터의 시간을 계산할 수 있습니다.


루프 내부의 마지막줄에 시간을 확인하는 함수를 호출하도록 "시간확인()"을 추가했습니다.


마지막으로 시간확인함수를 아래에 구현 했습니다.

"시간확인"함수를 호출하게되면 현재시간을 받아와서 마지막동작시간과의 차이를 계산합니다. 시간은 지날수록 값이 커지기 때문에 현재시간에서 마지막동작시간을 빼줬습니다. 이렇게 동작을하지않은시간을 계산하고 if를 이용해서 그 시간이 일정시간 이상이될 경우 원하는 동작을 하도록 작성되었습니다.


저는 테스트 시간관계상 5초로 했지만 실제 적용할 때에는 "분"단위로 계산될 것이라 생각합니다. 이 때는 "FormatTime, 분, m, m"처럼 "분" 단위로 적용하시면 되며 아래와 같이 스크립트를 작성하시면 됩니다.



시간을 확인하는 부분에서 빨간 박스의 내용처럼 바뀐 이유는 60분이 넘어갈 경우를 생각해줬기 때문입니다. "초" 단위를 사용할 때에도 위와같이 60초가 넘어가는 것을 체크해주는 것이 좋겠죠?^^



이렇게 해서 특정 시간동안 아무일도 하지 않을 경우를 확인하는 함수를 만들어 봤습니다.


오랜만에 쓰는 강좌라 정리가 덜된 느낌이네요... 하지만 어려운 내용이 아니니 그동안 제 강좌를 보시면서 꾸준히 연습하신 분들이라면 충분히  쉽게 적용하실 수 있을 것입니다.


이해가 안되는 부분 있으시면 언제든지 댓글로 질문 주시면 됩니다.^^


그럼 오늘 강좌를 마치도록 하겠습니다.

블로그 이미지

킴영감

프로그래밍과 게임공략, 게임과 관련된 프로그램에 대한 내용을 다룹니다.

댓글을 달아 주세요

  • 박성준 2016.02.10 20:12  댓글주소  수정/삭제  댓글쓰기

    안녕하세요!! 오토핫키강좌 너무너무 잘 구독하고 있는 독자입니다. 배운데로 해서 원하는 매크로를 작성했는데 이게 잘 작동을 하다가 가끔씩(3~4시간) 마다 한번씩은 "*.exe의 작동이 중지되었습니다"라고 하면서 오토핫키가 멈춰 버리는데 ㅜ 스크립트를 변경해보고 해도 계속 같네요ㅜㅜ 혹시 매크로가 작동이 안될때 이를 인지하고 매크로프로그램을 다시 실행할수 있을까요? 답변부탁드립니다ㅜ 몇일 째 답을 못찾겠네요ㅜ

    • 킴영감 2016.02.11 01:03 신고  댓글주소  수정/삭제

      우선 강좌가 도움이 된다니 뿌듯하네요^^
      프로그램이 강제적으로 종료된다면 왜 멈추는지를 찾는것이 우선인 것 같습니다. 프로그램이 종료되는 이유는 대부분 CPU나 메모리 성능의 부족이 원인이며 이럴 경우에는 수동으로 프로그램을 실행시켜주는 것이 유일한 방법입니다.
      임시방편을 알려드리면 프로그램이 켜져있는지를 모니터링하는 프로그램을 하나 더 만들어서 실행시키시는 것입니다.
      만약 하드웨어 성능이 충분하다면 작성하신 스크립트 내부에서 문제가 발생하는 것이니 전체 스크립트를 확인해봐야 알 수 있을 것 같습니다.
      도움을 드리지 못해서 죄송합니다.ㅠ

  • 박성준 2016.02.11 19:24  댓글주소  수정/삭제  댓글쓰기

    답변 감사합니다^^ 다시한번 스크립트를 확인 해봐야 겠네요. 감사합니다!!

  • 해모수 2016.09.02 12:11  댓글주소  수정/삭제  댓글쓰기

    유익한 강좌 열심히 잘 보고 있습니다.^^

    60분이 넘어갈 경우 체크부분에서 코드가 이상한거 같아서요.
    현재시간 - 마지막동작시간 + 60
    이렇게 하는게 맞는거 아닌가요?.... 확인 좀 부탁드릴게요.

  • 쭈쭈바 2017.12.16 20:56  댓글주소  수정/삭제  댓글쓰기

    FormatTime, 시간체크Start, s, s
    Loop
    {
    imagesearch, vx, vy, 0, 0, A_ScreenWidth, A_ScreenHeight, *30 %A_ScriptDir%\작업이미지.bmp
    if (errorlevel = 0)
    {
    FormatTime, 시간체크Start, s, s
    sleep, 2000
    }
    시간체크()
    }

    여기서 Loop 안의 FormatTime, 시간체크Start, s, s 가 잘 이해가 안가는데요.
    Loop안에서 계속 갱신되는거 아닌가요??

    그리고 시간체크() 안의 마지막부분에
    마지막시간동작시간 := 현재시간
    이부분은 왜 꼭 해주어야하나요?

    • 킴영감 2017.12.16 21:47 신고  댓글주소  수정/삭제

      루프안에서 시간체크를 하는 이유는 우리가 구현하고 싶은것이 동작을 안하는 시간이기 때문입니다.
      동작을 했다면 최근 동작한 시간을 업데이트해주고 그 시간과 차이를 계산하는게 맞겠죠?
      마지막동작시간 := 현재시간 도 같은 의미라고 보시면 될 것 같네요^^

  • 이재민 2018.11.13 01:39  댓글주소  수정/삭제  댓글쓰기

    블로그가 너무 깔끔하고 강좌가 이해하기 쉽게, 잘 되어 있어서 많이 배웠습니다.
    박성준님 안되었던 이유 같기도한데..
    멈춘시간 10초 해놓고 스크립트 돌리니까 2번정도 되고 말더군요, 렉 또한 생기면서.
    해결은 FormatTime, 함수,, mmss 로 바꾸어 사용하였습니다.
    뒤에 format 인자를 s로 사용하여 메세지박스로 보았더니 60초 이후 0으로 변하고, 현재시간-마지막시간 = 또한 -단위로 넘어갑니다.
    다시한번 좋은 글에 감사드립니다.

  • 큰영혼 2019.03.12 13:42  댓글주소  수정/삭제  댓글쓰기

    timess := Time*6000
    Gui,Add, edit, x200 y60 vtimes ,%timess%
    Gui, Add, Button, x+1 w54 h40 gCilck_btn5, 클릭
    Gui, Show, x0 y630 w480 h100, *****
    Gui, Submit, Nohide
    return


    Cilck_btn5:
    Gui, Submit, Nohide
    GuiControl,, times,%timess%
    {
    Click, 510,200
    Sleep, 1000
    Click, 580,253
    Sleep, %timess%
    }
    return

    안녕하세요...
    위 Sleep, %timess% 변수에 사용자가 시간넣고 작동시키고 싶은대요
    좀 도와 주세요.