프날 오토핫키 강좌
프날 오토핫키 강좌

프날 오토핫키 질문 커뮤니티

* 질문 공지사항(질문 요령) 필독해주세요.: https://pnal.kr/pages/how-to-question
* 최근 10개의 질문/답변만 보여집니다.
* 댓/답글 작성시 "비밀글" 설정을 해제해주세요. 어차피 비회원제라 비밀 답글로 답변 드리면 작성자분도 읽을 수 없습니다.
* 메인 질문은 위쪽 양식을 이용해주시고, 답글로는 간단한 인사나 질문만 해주세요.

질문 답변 목록

  • Q. gui 관련 질문 드립니다 [...] [답글]

    안녕하세요 강좌 글 잘 보고 있습니다.

    오토핫키를 이용해 간단한 매크로를 만들어 사용중인데, gui 관련 질문 드리려고 합니다.

    제가 작성한 매크로에서 suspend, pause 명령어를 사용하는데요, suspend 또는 pause 시에 트레이 아이콘이 색깔변화 그리고 H,S 상태로 나타나 이를 확인할 수 있는데요,

    작동 상태를 확인할 때 트레이아이콘에서 확인하는 방법 말고, 혹시 gui 창으로 나타낼 수 있을까요?


  • Q. winhttp질문드립니다 [...] [답글]

    우선 winhttp 강의 감사합니다 잘봤습니다.

    제가 홍보기를 만들려하는데요.
    홈페이지 로그인, 그리고 글쓰기까지는 완료한 상태입니다.
    그 다음으로 글쓰고 나서 반환되는 게시물의 주소를 기록하고 싶습니다.
    게시물의 주소를 변수로 만들고 FileAppend를 활용해 메모장에 기록하는 방식을 사용하려합니다만,
    반환된 게시물의 주소를 어떤 방식으로 따와야할지 모르겠습니다.
    괜찮은 방법이 있을까요?
    https://linsunday.com/b/marketing/123(여기에 글 순서번호가 매겨짐)

    • A. 안녕하세요.

      테스트용 링크를 들어가보니 게임쪽 서버 홍보에 사용하시려는 것 같습니다. 게임쪽으로 활용될 수 있는 질문은 상단 공지사항(빨간 글씨로 적혀있는 질문 요령 링크)과 같이 받고있지 않고있습니다.

      죄송합니다. [...]


  • Q. 김민규 [...] [답글]

    Autohotkey script로
    ^Q::
    FileCopy, ~~, ~~ 이렇게 단축키를 사용해서
    파일을 복사 붙여넣기 하는걸 만들고 있는데요...
    Autohotkey script를 새로만들기 해서 Edit script하면 메모장이 하나 나오잖아요, 근데 거기서는
    단축음키를 두개이상 쓰면 처음 써놓은 단축키 명령어만 실행이 되고 나머지 단축키들은 써봤자 실행이 안되던데 한개의 파일에 여러개의 단축키를 입력 못시켜놓나요 ?? 방법이 없는건가요 ?

    • A. 안녕하세요.

      본편 강좌 핫키나 return쪽 보시면 여러 핫키를 한 파일에 넣는 예제도 있습니다. 참고하시면 좋을 것 같습니다. [...]


  • Q. 안녕하십니까 강좌 잘보고 있습니다. [...] [답글]

    다름아닌 변수를 선언하고 함수에서 사용하려합니다.

    프날님은 변수 선언을 어떻게 하시고 실제로 어떻게 사용하시는지 궁금합니다!

    제가 사용하는방법은

    global Var1, Var2, Var3, Var4

    global ID1, ID2, ID3, ID4

    global PW1, PW2, PW3, PW4

    이런식으로 초반에 선언하는데

    이렇게 선언 안하고 쓰는 방법이 따로 있는지 궁금합니다

    • A. 안녕하세요.

      1. 전역변수 사용은 지양하는게 좋습니다 (구조적 프로그래밍 원칙에 위배)

      2. 대신, 함수 내에 필요한 변수들을 매개변수의 형식으로 전달해주는 것이 좋습니다.

      3. 연관된 값(주신 예시에선 Var1, 2, 3, 4... 그리고 ID1, 2, 3, 4... 그리고 PW1,2,3,4...)은 배열로 만드는 것이 관리에 용이합니다. 특히 ID와 PW는 한 세트니까 하나의 배열로(이차원 배열) 구성하는게 좋아보입니다.


      결론적으로, 일단 제 방법을 물어보신거라면, 저는 전역변수를 웬만하면 안씁니다. (다만, 제작 라이브러리인 "모두의 한글"과 같이 모든 함수가 공유하는 하나의 데이터셋이 있다면 이는 전역변수로 선언하는 예외적인 경우를 개인적인 원칙으로 두고 있습니다.)

      전역변수를 쓰는 대신 필요한 변수를 함수의 매개변수 형태로 전달해줍니다. (이렇게 해결 못하는 형태는 전혀 없습니다.) 만약 함수 내에서 해당 값을 바꿔야하는 경우나, 해당 변수의 값을 복사해서 매개변수로 사용하는 것이 아닌 원본 변수가 필요하다면 Call-By-Reference를 위해 ByRef키워드를 이용합니다. 이를 이용하면 오토핫키 명령어에서 쓰는 OutputVar 매개변수와 똑같은 기능을 구현할 수 있습니다. (ImageSearch의 ooutputVarX, outputVarY변수처럼요)

      또한, 매개변수의 개수가 가변적이라면 *(별표)를 통해 가변 길이의 매개변수를 받을 수 있습니다.
      예를 들어서 foo(bar, baz*){ } 처럼 함수가 정의되어있다면, 함수 내에서 baz[1]로 두 번째 매개변수(첫 번째 매개변수는 bar겠죠), bar[2]로 세 번째 매개변수 처럼 쓸 수 있습니다.

      [참조 링크]
      배열: https://pnal.kr/pages/array1
      전역변수를 사용한 특수한 경우: https://pnal.kr/pages/every-hangul
      ByRef: https://www.autohotkey.com/docs/Functions.htm#ByRef
      가변길이 매개변수: https://www.autohotkey.com/docs/Functions.htm#Variadic

      ========

      결론적으로, 쓰신 예시로 제 방식의 코드를 짜보면

      userAccount := [{"ID": 1111, "PW": "password1"}, {"ID": 2222, "PW": "password2"}]
      foo(userAccount)

      foo(_userAccount)
      {
      MsgBox, % "두 번째 ID: " _userAccount[2].ID "`n두 번째 PW: " _userAccount[2].PW
      }

      처럼 쓸 것입니다. (편의를 위해 ID PW가 네 가지씩 있던 예시를 두 가지로 줄였습니다.)

      애초에 가짜 배열 형태는 안쓰는게 좋습니다. (var1, 2, 3... 처럼 배열이 아님에도 불구하고 배열처럼 순번이 붙은 형태를 의미합니다. 자세한건 위쪽의 배열 강좌 링크 참조하세요) [...]

    • A. 답변 감사합니다 프날님

      gui 에서 v라벨을 쓰는데

      함수내에서 쓰면 값이 아무것도 없더라구요

      매개변수로의 형식으로 전달한다는게

      함수(v라벨) 이런식으로 해줘야 한다는 말씀이신가요?

      ex) gui, add, checkbox, x30 y30 v사용가능 , 사용가능?

      함수(사용가능)
      {
      if( 사용가능 = 1)
      {
      블라블라~
      }
      }
      [...]

    • A. 안녕하세요. 함수 매개변수로 그 v레이블 값을 전해주면 된다는 뜻입니다.

      v레이블명을 Label, 매개변수 명을 Param이라고 하면

      foo(Label)
      로 호출하면 되겠죠. 물론 v레이블 값이기 때문에 Gui, Submit, NoHide를 그 앞에서 한번 실행해주어야 하겠지만요.

      함수의 정의 부분은

      foo(Param)
      {
      ...// Param가지고 할 동작
      }

      이 되겠습니다.

      이렇게 작성하시면 foo() 함수에 Label을 전달해주면 함수 내에서 Param 변수로 그 값을 활용할 수 있습니다. 굳이 Label이 아니라 다른 값을 넣어도, Param 변수로 활용할 수 있지요.

      지금 쓰신대로 함수에 전달되는 매개변수와, 전달된 매개변수명이 같아도 오류는 안나지만(두 변수는 다른 변수임에 유의해야합니다), 다르게 명시적으로 분리해주는 편이 좋죠. 따라서, 주신 예제를 좀 더 수정해보면

      gui, add, checkbox, x30 y30 v사용가능 , 사용가능?
      이런 Gui 컨트롤이 있을 때,

      함수(사용가능)

      으로 함수 호출을 하면, 사용가능 < 이라는 변수가 매개변수로 전달되고,

      함수(Param)
      {
      ...// 여기서 Param변수 사용
      }

      위와 같이 정의된 함수에서 Param 변수를 이용하여 쓸 수 있다는 것입니다.

      물론, Param이니 사용가능이니 이런건 변수명이기때문에 자유롭게 쓰시면 됩니다. 제가 처음 단 답글에서도 호출할 때 매개변수로 전달해주는 변수는 userAccount, 함수 내에서는 _userAccount라는 매개변수명을 사용해서 분리해주었습니다. [...]

    • A. 예를 들어서 GUI에서 레이블명 EditX, EditY의 값을 foo()라는 함수내에 전달해봅시다. 전달된 두 값을 더해서 반환하는 함수를 만들어보자고요.

      foo(x, y)
      {
      return x + y
      }

      이렇게 함수를 정의했다면,

      Gui, Submit, NoHide
      foo(EditX, EditY)

      이런식으로 함수를 호출하면 되는거죠. EditX, EditY가 가지는 값이 함수 내에 전달되어, x, y 변수로 활용할 수 있을 것입니다. [...]

    • A. 답변 정말 감사합니다!

      그러면 함수를 할때마다 매개변수로 꼭 써줘야하고 함수를 만들때


      함수(n)
      {
      if(n = 1)
      {
      블라블라
      }
      }

      으로 만들고

      Gui, Submit, NoHide
      함수(사용가능)

      으로 쓰면 된다는 말씀이시져?

      정말 감사합니다!
      [...]


  • Q. 안녕하세요 오토핫키가 안먹히는 창? 이 있어 여쭤봅니다 [...] [답글]

    원격을 통해 이것저것 단순반복업무를 하려고 오토핫키를 공부중인데
    간단하게 연습을 시작했는데 아예 작업이 안먹혀요
    여름에 공부하다 말아서 다시시작했는데 그때는 됐거든요..


    mouseclick, 1000, 1000 //연습용 아무 좌표

    coordmode는 screen으로 했습니다!
    바탕화면에서 해도 아무 폴더를 활성화시켜놓고 해도 다 클릭을 하는데
    parsec이라는 원격프로그램 켜놓고 실행시키면 아무런 움직임도 없는데 이런경우 어떻게 해야하나요?

    • A. 안녕하세요.

      비슷한 질문들이 많이 올라오곤 하는데, 드릴 말씀이 별로 없습니다. 해당 프로그램이 입력을 못받는데, 코드를 잘못짠 것은 아니지요.

      코드(스크립트)에 관련된 질문 창구이기도 하고요, 다른 프로그램이 입력을 못 받는걸 제가 어떻게 명쾌하게 딱 답을 내려드릴 순 없습니다. 배가 아픈 이유가 여러가지이듯이, 클릭이 안되거나 키가 먹통인 이유도 여러가지겠죠? 의사도 "배가 아파요"라는 말만 듣고 소화제를 처방해주진 않듯이요.(열도 재보고, 청진기도 대보고, 어제 뭐먹었냐고도 물어보고 하죠)

      원격 프로그램이 TeamViewer같은건가요? 아무튼 그런 프로그램은 프로그램 자체가 실제 마우스 입력을 해당 게스트 컴퓨터에 보내는 과정을 거치다보니 그런 키 입력이 잘 안되곤 합니다. 그런데 역시 해결 방법을 제시해드릴 순 없습니다. 이건 해당 프로그램을 만져보고 해결해본 사람만 알 수 있을 것이지요.

      듣기 싫은 소리로 들렸을진 모르겠습니다(그랬다면 죄송합니다.) 다만 어떻게 해결책을 내려드리기엔 제 영역 밖이고, 이런 "클릭이 안돼요""키 입력이 안돼요" 류의 질문 같은 경우에는 대상 프로그램이 입력을 못받는거라 코드 문제가 아니어서 어떻게 진단이 안됩니다. 차라리 해당 프로그램 개발자와 소통해보시는 편이 더욱 나을 것입니다. 오토핫키 질문이 아니란 뜻이지요. 주제에 다소 벗어난 부분인지라 이렇게 말씀드렸는데, 다시 한 번 명쾌한 해결 못내려드린 점 죄송합니다. [...]


  • Q. 오토핫키 컴파일 [...] [답글]

    오파핫키 컴파일 후 컴파일 수정 할 수 있는 방법이 있는지 궁금합니다.

    컴파일전 소스파일을 실수로 지웠다던가 다른 컴퓨터에서 수정을 하고 싶을 때 할 수 있는지가 궁금합니다.





    너무 초보적 질문인데 독학으로 이제 막 배우고 있는 상태에서 궁금한 내용을 아무리 검색해보아도 나오지 않아
    이렇게 질문 드려 봅니다.

    바쁘시겠지만 알려주시면 감사하겠습니다.!

    감사합니다.!

    • A. 안녕하세요.

      상단 공지에서 언급드린 것처럼 소스코드 관리 또한 개발자의 책임이라 할 수 있지요. 그래서 실수로 지웠다던가, 다른 컴퓨터에서 수정을 하고싶을 때 실행 파일만으로 쉽게 할 순 없습니다.

      일단 컴파일 후엔 수정을 못하는게 원칙이나, 컴퓨터 보안의 관점에서 보면 불가능한것이 아닙니다. 자신이 제작한 프로그램이라면 딱히 불법적인 것도 아니고요.

      다만 프날에선 상단 공지와 같이, 프로그램 코드 역분석에 대한 일체의 자세한 내용을 드리고있지 않습니다. 결론적으로, '기술적으론 가능하나 코드 관리는 개발자의 책임' 정도가 되겠네요. [...]


  • Q. 이미지 서치가 안됩니다 ㅠ [...] [답글]

    항상 프날님 강의 잘보고 있습니다!

    -

    구글폼에 데이터 입력하는 일을 하고 있어서 오토핫키를 이용해서 입력을 하고 있었습니다.


    ImageSearch,ax,ay,0,113,950,1027,*20 제출.png
    if (Errorlevel = 0)
    {
    Mouseclick,l,ax+10,ay+5,1,0
    }


    제출 상자를 보면 마우스 클릭을 했습니다.

    그런데 회사 구글폼 양식에 사진이 몇장 추가가 됐더니 오차를 바꿔봐도 제출 상자 이미지 서치를 못합니다. (제출 상자는 똑같습니다.)

    왜 이런 현상이 나왔는지 잘 이해가 안돼서 질문드립니다....


    -
    날씨 쌀쌀한데 건강 조심하시기 바랍니다!

    • A. 안녕하세요.

      코드는 거짓말을 하지 않습니다.
      우리 눈에 똑같아보이는 버튼이라도 실제로 미묘하게 다를수도 있고요,

      이미지가 추가되면서 y좌표 인식범위보다 아래에 이미지가 있을수도 있고요

      경우의 수가 너무 여러개네요. [...]


  • Q. postmessage 로 조합키를 구현하는 방법 [...] [답글]

    안녕하세요 프날님

    강의 잘 읽고 있습니다.

    postmessage 로 조합키를 구현할수 있는 방법을 혹시 알고 계시는지요

    PostMessage, 0x100, 17, 1075642369,, ahk_id %프로그램id%
    PostMessage, 0x100, 76, 1076232193,, ahk_id %프로그램id%
    PostMessage, 0x101, 76, 2490369,, ahk_id %프로그램id%
    PostMessage, 0x101, 17, 1900545,, ahk_id %프로그램id%

    이방식은 안됩니다. L만 두번 입력이 되요

    PostMessage, 0x100, 12, 0,, ahk_id %프로그램id%

    이것도 ASCII 코드 를 넣어봤는데 작동을 안합니다.

    postmessage로는 조합키 구현이 어려운지요

    • A. 안녕하세요.

      우선 PostMessage로 키 입력을 하실려면 ControlSend를 사용하는걸 추천드리는 편입니다. ControlSend도 내부적으로 PostMessage를 사용하고, PostMessage로 문자 입력이 너무 길어지니까 명령어 하나로 묶어둔 것이기 때문에...

      그리고 lparam이 이상하네요. 어떤 키를 입력하시려는진 모르겠지만 lparam이 너무 긴거 아닌지... 뭔가 잘못 따신것 같습니다. 심지어 조합키 입력이면 아마 (조합키 누름) + (키 누름) + (키 뗌) + (조합키 뗌) 으로 코딩하셨을텐데, lParam이 전부 다르다는건... 4개가 다 다른 키인 셈이니까요. 적어도 첫번째 네번째, 그리고 두번째 세번째 줄끼린 lParam이 같게 나올겁니다.

      아무튼 PostMessage로 조합키 보내는 방식이 여러개가 있으나, 제가 개인적으로 질문 답변 활동 해온 결과 아래와 같은 스크립트가 제일 만족도가 높더라고요.

      Send, {Ctrl Down}
      PostMessage, 0x100, 65, 1966081,, *제목 없음 - Windows 메모장
      PostMessage, 0x101, 65, 1966081,, *제목 없음 - Windows 메모장
      Send, {Ctrl Up}

      저는 메모장에 Ctrl+A 보내는걸로 테스트 했습니다.

      그러니까, Ctrl키는 활성입력인 Send로 눌러주는거죠. 어차피 조합키는 타 프로그램을 사용중이라도 단독으로 누를 경우 아무 기능이 없으니까요... [...]

    • A. 와.. 대박입니다!!
      이런생각을 하시다니요!!
      감사합니다!! [...]


  • Q. ControlSend를 대체할 수 있는것은 없나요? [...] [답글]

    ControlSend로 문자 입력시 일반적인 문자 입력은 아직까진 정상적으로 진행되는데

    Ctrl 이나 Alt와 같이 사용하는 식의 입력에서 가끔씩 정상적으로 입력되지가 않습니다.

    ex ---------------------
    Clipboard = asdf
    ControlSend, Edit1, {Ctrl Down}v{Ctrl Up}, %Win_title%

    정상결과입력값 : asdf
    오류입력값 : v
    ------------------------

    그래서 ControlSend를 대체할 수 있는 무언가가 혹시나 있을까 하여 질문 올립니다.

    • A. 안녕하세요.

      PostMessage나 SendMessage등을 이용하여 대상 창에 메시지를 직접 보낼 수 있습니다(메시지는 문자메시지를 의미하는게아닌, 전기적인 신호를 의미합니다.). 그러니까 어떤 창에 특정 명령을 내리는 역할인거죠. 그 명령중에는 "문자를 보내라" "키를 누르는 신호를 보내라" 등 또한 있습니다. 오토핫키에서도 사용 가능하니까 강좌 마지막강에 설명된것처럼 검색해보시면 잘 나옵니다.

      그런데 ControlSend도 오토핫키 인터프리터(설치하신 오토핫키 파일)를 까보면 PostMessage로 문자를 전송하는 방식입니다. 따라서 별로 기대하는 효과는 얻지 못할 공산이 큽니다. 몇몇 사람은 PostMessage로 바꾼 후 일부 키가 씹히는 현상이 없어졌다고 말하고 있으나, 개인적으로는 플라시보 효과이거나 PostMessage구문으로 옮기면서 자연스레 다른 환경적인 요소(키 사이의 간격, 누르고 있는 시간 등)가 변해서 PostMessage가 이 문제를 해결했다! 라는 오해가 생겼다고 생각합니다. 직접 인터프리터를 보았을 땐 분명 ControlSend도 내부적으로 PostMessage를 사용하고 있었습니다.

      일단 추천드리는 방법은 아래와 같습니다.

      1. 지금 Edit1 컨트롤에 명령을 보내는데, Edit1 컨트롤은 Text값을 가지는 컨트롤이므로 ControlSetText를 이용하여 값을 대치시키는 편이 좋습니다. 키를 입력하는 방식이 아니기때문에 동작의 신뢰도가 높습니다.

      2. ControlSend를 사용하시겠다면 조합키 입력 방식인 ^를 사용해보세요. Down/Up을 이용한 방식은 조합키 뿐만 아니라 일반적인 키에도 모두 사용되는 공통 구문이지만, ^, !, +, # 등의 조합키를 위한 별도의 축약어가 있기 때문입니다. ^{v} 로 적어보시란 뜻입니다.

      3. v는 텍스트가 아니라 키이기 때문에(v라는 텍스트를 입력하는게 아닌, v키를 누르는 행동을 원하기 때문) 중괄호로 감싸주는것이 원칙입니다. 물론 동작은 똑같이 진행될것이나, 원칙상 키임을 명시해주는 것이 좋습니다. v 말고 {v}로 쓰란 뜻입니다.

      4. Send가 ControlSend에서 {Blind}모드가 켜져있을 때는 사용자의 키 입력을 받아들이면서 작동합니다(예: {Blind}abc는 사용자가 Shift를 누른 상태라면 ABC로 입력됨). 지금은 테스트코드로 옮기시느라 Blind가 생략된 상태라면, 원본 코드에서 Blind를 지워보세요 (안쓰셨다면 무시하시면 됩니다.)

      질문과 별개로, 첫 줄에 있는 저 Clipboard 대입문엔 =가 아닌 표현식인 :=를 사용해주시길 바랍니다.
      https://pnal.kr/10

      마지막으로, 아무래도 키보드나 마우스 관련 명령어는 결국 특정 창과 상호작용하는 명령어이기 때문에 그 창의 특성에 따라 신뢰도가 좌우되곤 합니다. 대부분의 상황에선 문제 없지만, 일부 프로그램은 키를 받아들이는 방식에 따라 너무 빨리 입력되면 키 입력을 받아들이지 못할수도 있습니다. SetKeyDelay를 통해 키 입력 속도를 늘려보세요. Ctrl을 누르는 작업이 너무 빨라서 Ctrl이 작동되지 않을 수 있다는 뜻입니다. 물론, 대상 프로그램의 특성이기 때문에 이럼에도 불구하고 키를 받아들이는 방식에 따라 입력이 계속 하나씩 빠질수도 있습니다. 원인이 뭔지 뚜렷하지가 않은 경우가 많더라고요. [...]


  • Q. 안녕하세요 프날님 강좌 잘보고 있습니다 [...] [답글]

    https://pnal.kr/30

    부분에 3번 글에 질문을 방개에 올리라고 되어있습니다. 자칫 처음오시는분들이 헷갈려 하실수 있을꺼같아서 글 남깁니다.

    • A. 수정했습니다 감사합니다 [...]