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

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

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

질문 답변 목록

  • Q. 프날님,, 정렬 후 값을 변수로 반환하고 싶은데요. [...] [답글]

    count:=array()
    count[1,1] := tx1
    count[1,2] := ta1
    count[2,1] := tx2
    count[2,2] := ta2
    count[3,1] := tx3
    count[3,2] := ta3

    sort, Count

    loop,3{
    Result .= itemcount [A_index,1]
    }

    msgbox % Result

    1열의 값을 기준으로 오름차순으로 정렬하여 2열의 값을 가져오고싶은데요..
    메세지박스를 띄워보면 sort하기전 순서대로만 출력이 됩니다..
    어떻게 해야할까요?


    • A. 비밀댓글입니다 [...]


  • Q. MSGBOX 내용 복사 방법 문의 [...] [답글]

    안녕하세요,

    MSGBOX에 출력되는 내용을 마우스로 드래그 후 복사 붙여넣기를 하고 싶은데,
    방법이 있을까요? 구글링해도 못찾겠습니다.ㅜ

    감사합니다.

    • A. MsgBox는 입력폼이 아닌 출력용이기 때문에 당연히 드래그가 불가능합니다.

      MsgBox로 출력을 안하시면 됩니다. GUI 폼에 Edit컨트롤을 넣고 거기다가 출력을 시켜도 되겠죠.
      그런데, 질문자분이 만든 프로그램이라면 그냥 MsgBox 출력 전에 해당 내용을 클립보드에 복사한 후 MsgBox로 출력하면 되는 일이 아닌가 싶습니다.

      문제 접근을 꼭.. MsgBox에 있는 내용을 드래그해야겠다! 라고 접근하시지 말고
      다른 더 좋은 방법이 많으니 다르게 접근해보세요. [...]


  • Q. 여러줄 저장하고 가져오기 방법을 알고 싶습니다. [...] [답글]

    안녕하세요 프날님!
    다름이 아니라

    제가 긴글을 Edit에 작성을 하고
    인라이트로 저장으로 저장을하면 글전체가 텍스트 자체는 ini파일에 저장은 되는데
    인리드로 불러오면 가장 첫줄만 불러오고 두번쨰 줄부터는 불러오지 못하는데
    어떻게 해야 긴 글도 저장하고 불러올수 있나요?

    • A. 안녕하세요.
      ini 파일은 한 줄 저장이 주된 목적입니다. StrReplace()함수를 이용하면 전체 문자열 안에 있는 특정 문자열을 다른 문자열로 치환할 수 있습니다. (흔히 다른 문서 편집 프로그램에 있는 Ctrl+H 바꾸기 기능과 동일하다고 보시면 됩니다.)

      따라서, 저장할 문자열에서(긴 글을) StrReplace()함수를 이용하여 `n을 §와 같은 안 쓰는 문자열로 임시로 바꾼 후 저장하여, ini 파일에서 가져온 뒤엔 다시 §를 `n으로 바꾸는 작업 후 사용하세요. 즉 줄바꿈을 다른 문자로 바꾼 후 저장하고, 불러온 이후에 그 다른 문자를 줄바꿈으로 다시 바꾸라는 뜻입니다.

      이와 별개로, ini 파일은 줄바꿈이 있는 텍스트를 저장하는덴 적합하지 않습니다. FileAppend를 이용해서 나만의 형식을 구성하여 글을 저장하는 것도 나쁘지 않습니다. [...]


  • Q. 스크립트 질문드립니다 [...] [답글]

    친구들이랑 요새 고전 오락실게임들을
    다시 플레이 해보고 있는데요
    몇몇 게임들 천지를먹다, 닌자베이스볼같은
    앞뒤 방향으로 방향전환을하면서 싸우는게임들이
    키보드로 하니까 손가락에 무리가많이가더라구요
    질문의 요지는 캐릭터가 앞에적을 때릴땐
    오른쪽방향키를 누르고 가서 적을때리고
    뒤에서 적이올땐 왼쪽 버튼을 눌러서 이동하잖아요?
    근데 이게 횡스크롤이다보니 단순히 방향키 한개로만
    이동을하는게 아니고 위아래 버튼으로 y축 이동도해서
    한쪽방향키 포함 위아래 방향키도 누를때
    기술이나가는 버튼을 하나로 설정한상태에서
    왼쪽 방향키 오른쪽 방향키 두개를 조건으로 두고
    왼쪽방향키를 누르고 y축으로 위아래 키로 움직이다가
    (왼쪽방향키가 먼저입력되고 위아래는 나중에 입력된 상황 ) 왼쪽 오른쪽 두개 키중에 ( 위아래 다른키가 늦게 입력된건 상관없이 ) 방향키를 마지막으로 누른? 쪽으로 스킬이 변경해서 나가게 할수있나요?
    말그대로 버튼하나로 왼쪽을 보고있으면 왼쪽으로 스킬이 나가고 오른쪽을보고있으면 오른쪽으로 스킬이 나가는건데 변수가 오른쪽 왼쪽 버튼만 누르는게 아니라
    친구는 왼쪽스킬 오른쪽스킬 2개씩 핫키를 만들어서 쓰던데 그러면 더 헷갈릴거 같아서요...
    위의내용처럼 스크립트를 짤 수 있나요?
    처음인데 두서없이 주절주절 질문만 늘어놓았네요ㅠ
    가르침을부탁드립니다 ( _ _ )

    • A. 안녕하세요.

      오락실 게임이라... PC 온라인 게임이 아니기 때문에 예외적으로 게임임에도 답변 드리려고 했으나, 그렇게 되면 또 서비스 종료되어 사설서버로 운영되고 있는 게임, 싱글플레이 게임, 오프라인 패키지 게임, 실질적으로 매크로 제재를 하지않는 게임 등 여러 경우에서의 기준점을 다시 정해야하니까요, 또 "저 사람한텐 답변해주고 나한텐 왜 안해주냐!"와 같은 이의도 있을 수 있고요. 그런 이유로 게임과 관련된 질문 전체에는 답변을 드리고 있지 않습니다. 이해 부탁드립니다. [...]


  • Q. 함수를 랜덤으로 중복없이 실행하는 방법 질문입니다. [...] [답글]

    랜덤으로 클릭하는 함수가 있습니다.

    click(100,100,200,200)
    click(100,200,200,300)
    .
    .
    .
    click(500,500,600,600) ;10번째함수

    이 10가지의 함수를 랜덤으로 순서를 섞에서 한번씩 모두 실행하게 하고 싶은데

    clickGO = click1,click2,click3,....click10

    으로 리스트에 넣고

    sort,clickGO,D,Random 으로 순서를 섞기는 생각해봤는데

    이다음에 섞은 순서를 어떻게 차례대로 실행시킬수 있게 하는지 도움이 필요합니다 ㅠㅠ

    • A. 안녕하세요.

      click()함수를 예로 드셨는데
      리스트에 넣은 함수는 click1, click2...네요
      함수명은 다 똑같은 함수겠지요 당연히? 안그러면 함수를 쓰는 의미가 없으니까요. 이 부분에 대해서 명확히 말씀해주시면 예제라도 짜보는데요.

      그러면 함수명을 리스트로 처리해줘도 되지만,
      그냥 매개변수를 임의로 한 번씩 안섞이게 하는게 좋을 것 같습니다.
      매개변수 리스트를 배열로 준비해둬서(2차원 배열이 적합할 것 같습니다) 넘기는 방법이 낫지 않을까요.

      그게 아니라면, Function object라고 래퍼런스에 검색하시면 함수 객체라고 해서, 함수를 담을 수 있는 객체(변수라고 보시면 됩니다)에 관한 설명이 있는데, 함수객체에 함수를 바꿔가면서 그 객체에서 Call 함수를 실행시키는 것으로 구현 가능합니다. [...]

    • A. 일단 리스트 (ClickGo)에 있는 식으로 함수명이 있다면

      num := 1
      func%num%()
      func1()
      {
      MsgBox, 1
      }
      처럼, Dynamic Function을 이용할 수 있습니다 (함수 이름을 동적으로 두겠다는 뜻입니다) Loop돌리면서 실행해주면 되겠죠

      그런데 이걸 안해보셨을거같진 않고, 처음 말씀하신대로 click()함수로만 이루어있다면 함수 이름을 click1, click2, click3로 지은 경우가 아니니까요. Function Object를 써서

      arr := [Func("ShowMsg").Bind("첫번째"), Func("ShowMsg").Bind("두번째")]

      arr[1].Call()
      arr[2].Call()

      ShowMsg(param)
      {
      MsgBox, % "전달된 매개변수: " param
      }

      이렇게.. 쓸 수 있겠습니다. [...]

    • A. 제가 질문을 이상하게 올린것 같습니다
      click()이라는 함수를 10개정도 파리미터만 다르게 해서 실행을 해야합니다
      실행하게 되면 위에서 아래로 차례대로 실행되니
      그렇게가 아닌 랜덤으로 순서를 섞어서
      함수가 실행될때마다 클릭되는 순서를 랜덤으로 하고싶습니다
      [...]

    • A. https://m.kin.naver.com/mobile/qna/detail.nhn?d1id=11&dirId=1126&docId=347266154&qb=7Jik7Yag7ZWr7YKk&enc=utf8&section=kin.qna&rank=43&search_sort=0&spq=0

      검색하다가 찾았는데

      저도 저런식으로 구현하고 싶습니다

      어느조건이 만족하게 되면 클릭하는 스크립트입니다

      그런데 그 순서를 랜덤으로 하고 싶습니다

      첫번째순서가 1234567890 의 순서로 클릭했다면
      두번째순서는 0923145678 의 순서로 클릭하게말이죠

      맞는 조건이 나오면 항상 랜덤으로 저순서를 섞어서 실행되게 하고싶은대 도저히 방법이 생각이 안나네요ㅠㅠ 도와주세요 [...]

    • A. 안녕하세요.

      원댓에서 드신 예시에서
      (100, 100, 200, 200)
      (100, 200, 200, 300)
      (500, 500, 600, 600)
      이라는 세 개의 매개변수 묶음을 말씀해주셨습니다.

      이를 임의로 섞어서
      (100, 200, 200, 300)
      (500, 500, 600, 600)
      (100, 100, 200, 200)
      의 순서대로 누르게 하면 된다는 것이지요.

      이와 관련해서 아래와 같은 글을 작성해보았습니다. 리스트 개념을 말씀하셔서, 배열에 대한 기초는 있으시다고 판단되어 배열을 사용하였습니다. (배열을 사용해보시지 않았다면 이번 기회에 배열을 사용해보세요)

      https://pnal.kr/pages/qna3

      위 글에서 2차원 배열의 행을 섞는 방법을 써보았으니, 말씀하신 매개변수 세트
      (100, 100, 200, 200)
      (100, 200, 200, 300)
      (500, 500, 600, 600)
      를 배열에 넣고, 이를 섞어서
      (100, 200, 200, 300)
      (500, 500, 600, 600)
      (100, 100, 200, 200)
      형태로 만드신 다음,
      이를 순서대로 실행해주시면 되겠습니다. [...]

    • A. ranclick := [1,2,3,4,5,6,7,8,9,10]
      ; 배열에 1부터 10까지 넣는다
      sort,ranclick,random,D
      ; sort로 ranclick배열안을 섞어준다

      loop, ranclick.length(){
      swith ranclick[a_index]
      case 1 : 클릭
      case 2 : 클릭
      case 3 : 클릭
      case 4 : 클릭
      case 5 : 클릭
      case 6 : 클릭
      case 7 : 클릭
      }

      이렇게 짜보있는데 문제점이 뭘까요 [...]

    • A. 이건 찍어보시면 알텐데요...

      1. Sort명령어는 배열에서 사용할 수 없습니다.
      2. Loop의 첫번째 매개변수는 전통식 자리이기 때문에 변수에 %표시를 해주고, 이렇게 함수 호출을 위해선 표현식 처리(%를 치고 한 칸 띄웁니다.)를 해주어야합니다.

      전체적으로 뭘 하고싶으신건지 이해는 되는 스크립트이나, Sort를 버리십시요. Sort는 배열에서 작동하지 않기 때문에, 제가 드린 링크처럼 2차원 배열의 행을 섞는 방법을 사용하는 것입니다. (1차원 배열로 연습해보셔도 좋습니다.) 드린 링크에서는 Sort 명령어를 쓰지 않고, 배열 인덱스를 랜덤으로 뽑아서 새 배열로 옮겨넣는 방식을 사용하였습니다. [...]

    • A. 늦은시간까지 답변해주셔서 감사합니다!
      올려주신 답변으로 도전해보겟습니다! [...]

    • A. 프날님 해결했습니다!

      기쁜소식을 전해드리고 싶습니다!

      프날님이 해주신 코드는 저에게 너무 어려워 최대한 간단하게 짜봤습니다!

      바로 스왑기능을 통해서 배열안에 있는 순서를 바꿔보았습니다!

      clickA := [1,2,3,4,5,6,7,8,9,10]


      loop, % clickA.length(){
      random,idx1,1,clickA.length()
      random,idx2,1,clickA.length()
      Temp := clickA[idx1]
      clickA[idx1] := clickA[idx2]
      clickA[idx2] := Temp
      }

      이렇게 하면 배열의 순서만 바꾸는거니
      중복될리가 없습니다!

      너무 감사합니다 프날님!
      [...]

    • A. 스왑하는 방법도 있네요 ^^ 그게 더 간단한 것 같습니다.
      잘되셔서 다행입니다 [...]


  • Q. 비활성 입력시 IME비황설화 되는 문제 질문입니다. [...] [답글]

    안녕하세요! 방개에도 질문 올렸습니다.

    Postmessege 나 ControlSend 를 사용하여 비활성 입력을 하게되면

    어느순간 키가 안먹히는 경우가 발생하여 확인해보니

    IME가 비활성 되더라구요

    바탕화면을 클릭하거나 다른프로그램 입력창 작업표시줄등을 클릭해줘야 IME가 다시 활성화 되는데

    문제는 다시 비활성입력을 하게 되면 IME가 비활성화 된다는겁니다.

    해결방안이 있을까요?

    • A. 안녕하세요.

      말씀하신 문제는 모르겠네요. ControlSend가 IME에 영향을 미친다고 해도... 왜 미치는진 모르겠습니다. 전 재현이 안되네요.

      {Blind} 키워드와 함께 전송시켜보는건 어떤가요? 보낼 키(혹은 문자열) 앞에 {Blind}를 붙여주면 됩니다.

      ControlSend,,{Blind}Test String,~~~
      이런식으로요 [...]

    • A. 블라인드 해서 한번 해보도록 하겠습니다ㅠ

      그리고 또 ControlSend 를 함수와 하고 싶은데

      CS(in){
      ....ControlSend,,%in%, ahk_exe notepad.exe

      }

      CS(asdasd)

      를 하면 asdasd가 입력이 안되네요ㅠ

      ControlSend를 함수화 하는 방법이 있을까요?


      //CS("asdasd")를 하면 되네요!!

      아주 단순한 오류였습니다 ㅎㅎ

      뿌듯하네요! [...]

    • A. 네 맞습니다.
      괄호 안에 문자열을 적으면 항상 따옴표로 감싸주어야 하죠(안 감싸주면 asdasd라는 변수명으로 사용하게 될것입니다.) [...]


  • Q. 변수 [...] [답글]

    Hotkey,%FF%,FF 라는 식이 있는데
    Hotkey,%FF%,FF Hotkey,%GG%,GG .... 이렇게 많아져서 간단하게 저 안에 들어갈 변수를
    123 으로 지정해놓고
    Hotkey,%%123%%,%123% 라고 지정하고
    123:=FF
    123:=GG 이런식으로 지정해서 스크립트를 줄이고싶은데
    %%변수는 이중으로 작동을 안하는데 어떤방식으로 변수를 지정할수 있을까요??

    • A. 안녕하세요.

      https://pnal.kr/12
      강좌에선 위와 같이 변수를 쓰는 또다른 방법으로 % 기호를 한 번만 쓴 다음 한 칸 띄우고 변수명을 적는 방법을 소개드린 바 있습니다.

      그런데 사실 이렇게 설명드리면 오류가 있긴 한데, 왜냐하면 % 기호를 매개변수의 시작 부분에 한 번만 쓰고 띄워주는 저 방식은 "전통식 자리에서 표현식을 쓸 수 있게 하는 방법"이기 때문입니다. 말이 어렵죠?

      https://pnal.kr/pages/mola1
      전통식과 표현식에 대한 간단한 기술은 위에 있습니다.

      그런데 아무튼 그게 중요한게 아니라... 변수명으로 변수명을 지정해주는(?) 말씀하신 방법은 위 방법과 같이 표현식 자리에서 %%로 감싸주면 됩니다.

      즉, 전통식 자리를 표현식 자리로 만들어주는게 %(공백) 이고, 표현식 자리에서 %(변수명)%을 쓰면 변수명을 변수명으로 지정할 수 있기 때문에

      % %var%
      처럼 구문이 완성되는 것이지요. 말씀하신 경우엔
      Hotkey, % %var%, ~~~ - 띄어쓰기에 유의해야합니다
      가 되겠습니다. (123은 변수명으로 부적합하여 일단 영문으로 바꿨습니다.)

      그런데 있잖아요, 일단 그런 구조가 안나오는게 제일 좋습니다. 안 나오게 짤 수 있습니다. 간결한 방법이 있겠습니다. 조금 더 고민해보시는게 좋겠습니다. (좀.. 어려우실수도 있습니다. 함수 객체(Function Object)라는 개념을 이용하실 수도 있고요. 직업적으로 프로그래밍을 하신 분이 아니면 그냥 말씀드린대로, % %var% 형태로 쓰면 이중으로 변수를 쓸 수 있습니다(변수를 가리키는 변수를 쓸 수 있다는 뜻입니다.)) [...]


  • Q. 컴파일시에 에러가 뜹니다! [...] [답글]

    
    다른 png 나 ini파일 요소들은 다 컴파일 되는데

    코드도 완전히 똑같은 위치 똑같은 경로지정 인데

    텍스트.txt 파일 하나만 컴파일시에 error adding fileinstall file, 텍스트.txt 라고 에러가 뜨면서 실패를 합니다.
    인스톨에서 텍스트.txt를 제외시키면 컴파일이 됩니다...

    진짜 다른 요소들과 전혀 다르지 않게 경로나 설치위치가 지정 되어있는데

    왜 뜨는 걸까요..

    

    • A. 컴파일 하지 않고 스크립트를 실행 시키면
      텍스트.txt도 제대로 지정한 폴더에 제대로 설치됩니다..ㅜㅜ
      [...]

    • A. 보통 파일 이름이 잘못되어 납니다.

      1. 파일 이름을 text.txt로 변경한 후 소스코드에서도 그렇게 써보세요
      2. 텍스트 파일의 권한을 확인해보세요 (읽기 쓰기 실행 전부 할 수 있는지?)
      3. ahk2exe를 관리자 권한으로 실행시켜보세요 [...]

    • A. 뾰족한 해결책은 보이지 않네요. 다른 경로에 텍스트 파일을 위치시켜도 그런지. 오토핫키를 설치할 때 강좌와 마찬가지로 Unicode 32 bit를 디폴트로 설정하셨는지. 등등 이것저것 많이 해봐야겠습니다 [...]

    • A. 와.. 혹시 몰라서 아무것도 안적힌 텍스트 파일에 그냥 아무 글씨나 적어서 저장하고
      용량이 0kb에서 21kb로 늘었고 그상태로 컴파일을 하니 컴파일이 됩니다........
      아마도 텍스트파일 안에 아무것도 적혀있지 않아서 그런 거아닐까요..?
      용량이 0kb라서...?? [...]


  • Q. 기존에 열려있는 엑셀의 셀은 어떻게 변경하나요? [...] [답글]

    안녕하세요?
    항상 좋은 가르침 감사합니다.
    엑셀을 새로 생성하는 거 말고 이미 화면에 열려있는 엑셀의 셀은 어떻게 조정하나요?
    XL := ComObjActive("excel.application")
    으로 했더니 에디터의 run script에서는 되는데
    컴파일해서 exe 파일을 만들어서 하니 Error : 0X800401e3 이라는 에러가 뜨던데...
    어떻해야 하나요?
    감사하니다

    • A. 안녕하세요.

      https://support.microsoft.com/ko-kr/topic/getobject-%EB%98%90%EB%8A%94-getactiveobject%EA%B0%80-%EC%8B%A4%ED%96%89-%EC%A4%91%EC%9D%B8-office-%EC%9D%91%EC%9A%A9-%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%A8%EC%9D%84-%EC%B0%BE%EC%9D%84-%EC%88%98-%EC%97%86%EC%9D%8C-6cdf21a3-ac90-512b-6bff-badc5f4cc215

      라곤 하는데,

      엑셀 파일의 위치가 잘못되어있을 수도 있으니 A_ScriptDir를 활용해서 경로를 적어보세요.

      https://www.autohotkey.com/boards/viewtopic.php?t=33405
      또 위에 글을 보면, 엑셀창 말고 다른 창에 포커스를 두라는 것 보니 WinActivate를 이용해서 다른 창에 포커스를 둔 후 Com 명령어를 사용해보세요
      [...]


  • Q. splashimage [...] [답글]

    혹시 스플레쉬이미지를 이용하여 이미지를 띄울때 배경이 투명인 이미지를 띄우는 방법이 없을까요?
    게임내에 크로스헤어 이미지를 띄우려는데 이미지를 배경이 투명인 png파일로 설정을 해도 사각 불투명으로 출력이 되서 방법이 없나 여쭈어봅니다.

    • A. 안녕하세요. 게임과 관련된 질문은 받지 않습니다.

      물론 크로스헤어정도는 게임 내에서 허용하는 경우도 많고, 모니터 제조사에서 해당 기능을 넣어 판매하는 경우도 많을 정도로 게임의 공정성을 해치는 것과는 거리가 먼 것은 맞습니다.

      그러나 게임과 관련된 질문을 하나씩 받다보면 어느 수준까지 관련 질문을 받아야하나, 저 사람은 되고 이 사람은 왜 안되나 등등의 형평성이나 구별 문제가 나타날 수 있기 때문에, 일단은 게임에 사용되는 프로그램이면 전부 질문을 금하고 있습니다. [...]