본문 바로가기
programming language/Autohotkey

Autohotkey 를 사용한 Microsoft Office 수평 스크롤

by 남성 2017. 7. 28.
요즘은 휠이 달린 마우스를 많이 들 사용 할테니 마우스 휠을 이용한 위 아래 스크롤은 많이들 하실겁니다. 

그런데 좌우 스크롤도 할 수 있다는거 아시나요?

물론 좌우 스크롤을 하기 위해서는 키보드의 shift 키를 같이 눌러 줘야 합니다.

화면 크기가 확대 된 상태가 되면 좌우 스크롤바가 나타나는데

이때 Shift + Mouse Wheelup 또는  Shift + Mouse Wheeldown 을 해 보면 좌우 스크롤이 동작하는걸 확인 할 수 있습니다. 

크롬에서 해봤는데 잘 되네요. 

그런데 우리가 업무에 많이 활용하는 Microsoft Office 에서는 이상하게 위 단축키가 정상적으로 동작하지 않더군요. 

그래서 다음과 같은 Autohotkey 코드를 만들어 봤습니다.

Microsoft Word,  Excel, Powerpoint 를 위한 단축키이고 visio 에서는 위 단축키가 정상적으로 동작 하길래 만들지 않았습니다.

Shift + Mouse Wheelup 을 하면 오른쪽으로, Shift + Mouse Wheeldown 을 하면 왼쪽으로 스크롤 됩니다.


댓글24

  • 노을과보름달 2017.09.29 09:58

    멋진 스크립트 팁 주셔서 감사합니다.
    같은 문제로 고민하다가 해결했습니다.
    단, #IfWinActive, ahk_class XLMAIN 라는 문구가 오토핫키 스크립트에서 맨 아래에 위치해야 하겠더군요.
    안 그러면 기존 설정들 중 일부가 엑셀에서만 작동하는 문제가 있습니다.
    답글

  • 낌스트 2018.12.01 00:08

    안녕하세요, 늦게나마 포스트 발견하여 autohoekey 잘사용하고 있습니다.
    위에 소스 활용하여 가로스크롤 기능 구현하였는데
    실행은 되나 0x800401e3 경고문구가 뜨고 확인을 눌러줘야합니다.
    조치 방법은 따로 없을까요?

    답글

    • 남성 2018.12.01 12:28 신고

      일단 0x800401e3 에러는 경험해 보지못한 에러라 안 뜨게 하는 방법은 모르겠고 warning 등이 뜨면 해당 창의 버튼을 자동으로 눌러서 빨리 닫아주게 하는 방식 등을 사용하는 방법도 있을것 같네요.

  • 낌스트 2018.12.02 12:37

    혹시 해당창을 닫게하는 소스코드는 어떻게 구현하면 좋을까요?
    autohotkey 초보라 참 어렵네요 ㅠ.ㅜ
    답글

    • 남성 2018.12.02 12:55 신고

      해당 창의 정보를 알아야 하니까 Active Window Info 프로그램을 사용하여 해당 창의 class 등을 알아내서 닫게 해주면 되겠죠.

      아래 포스팅에서 소개하는 AHK_Window_Info_v1.7.ahk 를 써도 되고 아니면 Autohotkey를 설치하면 들어있는 Windows spy 프로그램을 써도 됩니다.

      http://iamaman.tistory.com/1246

      0x800401e3 에러가 항상 뜬다고 한다면 winwait 를 해서 해당창을 기다리다가 해당 차이 뜨면 winclose 또는 winkill 을 통해 닫아주게 하거나 send 또는 controlsend 를 통해 확인 버튼을 클릭하게 하면 될겁니다.

      확인 창의 버튼 정보 등도 Active Window Info 프로그램을 사용하여 ClassNN 정보를 확인하면 됩니다. ClassNN 정보를 확인하는 방법등에 대해서는 아래 포스팅을 참조하세요.

      http://iamaman.tistory.com/1387

  • 낌스트 2018.12.02 15:00

    엑셀 실행시 최초 이 경고창만 뜨고
    예 한번만 눌러주면 이 스크립트는 잘 실행됩니다.
    제가 없애고자 하는 건 이 경고창이 떳을 때 자동으로 예라고 누르는 스크립트를 구현하고 싶습니다.

    해당 경고창의 class는 32770이고
    해당 경고창의 예 버튼은 Button1입니다.

    이코드를 실행시켜도 여전히 경고창이 뜨는데 뭐가 문제일까요?ㅠ.ㅜ

    #IfWinActive, ahk_class #32770 ; MSofficeHScroll.ahk
    WinWait, #32770
    WinActivate, #32770
    Sleep, 100
    ControlClick, Button1, #32770
    return
    답글

    • 남성 2018.12.02 15:16 신고

      ahk_class 를 왜 밑에는 안 써주신건지... 모르겠네요.

      WinWait, ahk_class #32770
      WinActivate, ahk_class #32770
      Sleep, 100
      ControlClick, Button1, ahk_class#32770

      이렇게 하거나
      ControlClick 대신에 send {enter} 해도 될 듯 하네요.

  • 낌스트 2018.12.02 15:29

    사용하는 운영체제가 어떻게 되시나요? 윈도우10 사용중인데 저는 아무리 코드 조합을 해도 엑셀을 껏다켜서 최조 실행하면 저런 메세지창이 뜨네요 엑셀에만!
    오토핫키 포럼에도 찾아보고 했지만 딱히 해결책은 없는 것 같습니다.
    도와주셔서 감사합니다.

    참고로 저 경고창은 엑셀을 실행시키고
    쉬프트랑 마우스를 눌렀을 때 생깁니다.
    예 버튼을 클릭 후 이후, 새로운 엑셀창을 켜더라도 저 메세지는 나오지 않고 실행이 잘됩니다.

    제가 사용한 소스 전문 코드입니다.

    #IfWinActive, ahk_class #32770 ; MSofficeHScroll.ahk
    ControlClick, Button1, ahk_class#32770
    return

    #MaxHotkeysPerInterval 1000#
    #IfWinActive, ahk_class OpusApp
    +WheelDown:: ; scroll right
    ComObjActive("Word.application").ActiveWindow.SmallScroll(0,0,1,0)
    return

    +WheelUp:: ; scroll left
    ComObjActive("Word.application").ActiveWindow.SmallScroll(0,0,0,1)
    return

    #IfWinActive, ahk_class PPTFrameClass
    +WheelDown:: ; scroll right
    ComObjActive("Powerpoint.application").ActiveWindow.SmallScroll(0,0,1,0)
    return

    +WheelUp:: ; scroll left
    ComObjActive("Powerpoint.application").ActiveWindow.SmallScroll(0,0,0,1)
    return

    #IfWinActive, ahk_class XLMAIN
    +WheelDown:: ; scroll right
    ComObjActive("Excel.application").ActiveWindow.SmallScroll(0,0,1,0)
    return

    +WheelUp:: ; scroll left
    ComObjActive("Excel.application").ActiveWindow.SmallScroll(0,0,0,1)
    return

    #IfWinActive
    답글

    • 남성 2018.12.02 16:23 신고

      위에 코드 보니까 아래 코드 부분에서

      ControlClick, Button1, ahk_class#32770

      ahk_class 뒤에 공백이 없네요. 아래와 같이 공백이 있어야 할 겁니다.

      ahk_class #32770


      그리고 ahk_class #32770 으로 설정하면 모든 알림창에 대해 클릭을 하게 만드는거라 그리 좋은 설정 방법은 아닌것 같습니다. ahk_class #32770 와 창의 title 을 같이 설정해 주는게 좋을것 같네요.
      예를 들어 아래와 같이 해보시는걸 추천 드립니다.

      ControlClick, Button1, MSofficeHScroll.ahk ahk_class #32770

  • 낌스트 2018.12.02 15:37

    혹시나 몰라 해당 증상 동영상 첨부해봅니다.

    https://youtu.be/9g1cEKOr0RE

    해결책으로 생각되는게
    1. 엑셀을 실행시키고 나서 ahk 파일이 이후 지연실행되도록 설정하거나
    2. 저 경고창이 자동으로 예라고 눌러지는 소스 스크립트 구현이 필요할 것 같습니다.
    답글

  • 곰훙이 2018.12.27 12:10 신고

    안녕하세요 댓글 달기 위해 휴면해제하고 로그인했네요
    저도 낌스트님과 똑.같.은 현상이 발생합니다
    문제의 원인은 결국 찾아내지 못했고,
    윈도우 포맷한 후에 오피스 재설치, 그리고
    MSOscroll 이라는 엑셀 추가기능으로 가로 스크롤 사용하고 있습니다
    위 코드가 이상하게 엑셀에서만 0x800401e3 에러 뜨고 나머지 ppt, word 에서는 잘 작동하네요

    이 에러에 대해 한 가지 의심스러운게 있는데요,
    아래의 코드를 사용하기 시작한 뒤로 문제가 시작되었습니다.

    ; 비활성창 스크롤되게끔 하는 소스
    *WheelDown::
    CoordMode,Mouse,Screen
    MouseGetPos,x,y,hwnd,ctrl,3
    wp:=0xFF880000|GetKeyState("LButton")|GetKeyState("RButton")<<1|GetKeyState("Shift")<<2|GetKeyState("Ctrl")<<3|GetKeyState("MButton")<<4|GetKeyState("XButton1")<<5|GetKeyState("XButton2")<<6
    lp:=y<<16|x
    IfWinExist,ahk_id %hwnd%
    {
    SendMessage,0x84,0,%lp%,,ahk_id %ctrl%
    If ErrorLevel=4294967295
    MouseGetPos,,,,ctrl,2
    Loop,%A_EventInfo%
    PostMessage,0x020A,%wp%,%lp%,,ahk_id %ctrl%
    }
    return
    *WheelUp::
    CoordMode,Mouse,Screen
    MouseGetPos,x,y,hwnd,ctrl,3
    wp:=0x00780000|GetKeyState("LButton")|GetKeyState("RButton")<<1|GetKeyState("Shift")<<2|GetKeyState("Ctrl")<<3|GetKeyState("MButton")<<4|GetKeyState("XButton1")<<5|GetKeyState("XButton2")<<6
    lp:=y<<16|x
    IfWinExist,ahk_id %hwnd%
    {
    SendMessage,0x84,0,%lp%,,ahk_id %ctrl%
    If ErrorLevel=4294967295
    MouseGetPos,,,,ctrl,2
    Loop,%A_EventInfo%
    PostMessage,0x020A,%wp%,%lp%,,ahk_id %ctrl%
    }
    return

    물론 제가 만든 코드는 아니고 구글링으로 찾은 것이며, 마우스 오버한 창의 스크롤이 되게끔 하는 코드입니다.
    듀얼모니터 쓰다보니 꼭 필요한 기능인데, 엑셀에서만 유독 비활성창 스크롤이 안되서 쓰기 시작한 뒤로 가로스크롤 문제가 시작되었네요
    혹시 이 코드의 명령어들과 어딘가 충돌나서 발생하는 문제가 아닐까 싶은데..
    아시는 바가 있는지 궁금해서 여쭤봅니다.
    답글

    • 남성 2018.12.27 21:11 신고

      위 코드와의 충돌 때문이라면 위 코드들을 실행안하고 했을때는 정상적으로 동작하는건가요? 이 부분에 대해 실험 한번 해 보시는게 좋을것 같네요.

  • 곰훙이 2018.12.27 12:12 신고

    아참 좋은 AHK 코드들 공유해 주셔서 감사합니다.
    틈날때마다 들여다 보며 공부하고 도움 받고 있습니다.
    앞으로도 잘 부탁드려요~
    답글

  • 곰훙이 2018.12.28 17:43 신고

    답변 감사합니다.
    정황을 설명드리기 복잡한데 문제가 있었을 때 제 상황은..


    (윈도우 포맷& 재설치를 자주 하는 편이며, 아래의 1,2,3은 시간 순서입니다.)

    1. 윈도우10 RS4 (1709), 오피스 2013
    본문 코드로 excel,ppt,word 모두 수평 스크롤 잘 되었습니다
    댓글에 제가 작성한 '비활성창 스크롤 제어' 를 함께 사용(약 10일)하여도 문제없었습니다.

    2. 윈도우10 RS5 (1809), 오피스 2013
    포맷하고 최신 윈도우를 재설치한 후 본문의 수평스크롤 코드를 사용하려하니 에러가 시작되었습니다.
    댓글에 제가 작성한 '비활성창 스크롤 제어' 를 함께 사용 하던 안하던 본문 코드로 수평 스크롤 에러 계속 일어났습니다.

    3. 윈도우10 RS4 (1803), 오피스 2013
    찝찝한건 싫어서 포맷하고 혹시나 해서 윈도우 버전은 다시 내렸지만, 수평스크롤 코드 사용해보니 또 에러가 나더군요
    이젠 포기하고 Github 에서 만든 엑셀 추가기능 MSOscroll.dll 으로 수평 스크롤하고 있으며
    댓글에 작성한 '비활성창 스크롤 제어' 코드는 아예 사용 안하고 있습니다.

    3-1. 에러 문제
    - 엑셀에서 뜨는 저 에러는 새로운 엑셀 창이 열리고 shift+scroll 입력되는 순간, 팝업으로 뜹니다, 팝업 제목은 제 .ahk 파일명으로 뜨며 yes 를 눌러줘야만 합니다.
    - 한번 에러가 뜬 후에는 에러메세지 없이 수평 스크롤 잘 됩니다.
    - 엑셀 파일을 하나 띄운 중에 다른 엑셀 파일 불러오면 또 다시 에러 한 번 뜹니다.
    = *.xlsx 파일을 실행할 때마다 AHK 와 충돌날 만한 작업을 반복하는 것 같습니다.


    error 0x800401E3 은 한 대의 PC 에서만 에러나는게 아니고, 집에 있는 제 개인 pc (윈도우10 RS4 1803, 오피스 2013) 에서도 똑같은 에러 뜹니다.
    '비활성창 스크롤 제어' 코드를 집에선 사용하지 않았기 때문에, 이 코드의 문제라고 말씀드리긴 어렵습니다만
    혹시나 충돌날 만한 명령어들이 있을까 싶어서 AHK 초보자 입장에서 여쭤봤습니다.
    구글링 해봐도 해결책이 없어서 포맷만 여러번 하고 결국 포기했네요

    혹시 나중에 이 문제에 해답을 알게된다면, 여기에 해결 방법 작성하겠습니다 ^^
    답글

    • 남성 2018.12.28 19:24 신고

      검색을 해보니 running object table 에 등록이 안되어 있어서 그런거라고 하는데...

      정확히 원인은 잘 모르겠네요.

      될지는 모르겠지만 아래 코드 한번 돌려 보실래요?

      ComObjActive("Excel.application").Windows(1).SmallScroll(0,0,1,0)

    • 남성 2018.12.28 19:32 신고

      그리고 아래 코드도 한번 돌려보실래요?


      ex := ComObjActive("Excel.application")
      ex.Worksheets(1).Activate
      ex.ActiveWindow.SmallScroll(0,0,1,0)

  • 곰훙이 2018.12.29 04:44 신고

    신경써주셔서 감사합니다 ^^ 먼저 올려주신
    ComObjActive("Excel.application").Window(1).SmallScroll(0,0,1,0) 은
    최초 1회는 0x800401E3 에러 한 번 뜬 뒤로
    그 다음부터는 입력할 때마다 '0x80020006 - 알 수 없는 이름입니다.' 에러가 뜨네요

    두번째 올려주신 것은 구글링으로 찾아서 시도해봤던건데 다시 시도해봤으나, 원래의 증상과 똑같습니다.
    최초 1회 0x800401E3 에러 -> 그 다음엔 에러없이 수평 스크롤 잘됨 -> 엑셀 재실행되면 다시 8x800401E3 에러 (반복)

    원인이 뭘지 참 궁금하네요...;;;
    답글

    • 남성 2018.12.29 13:57 신고

      running object table 에 등록이 안되어 그런 거라고 하는데 해당 엑셀 창을 최소화를 했다가 최대화한 이후에 한번 해 보시면 어떨까요?

  • 낌스트 2019.02.03 21:07

    0x800401E3 에러에 대해 다시 해결해보고자 하는데

    이 에러 치료 방법은 없을 거 같고

    최초 실행시 뜨는 경고창을 자동확인하게끔 하면 제일 좋은 방법일텐데
    여러가지 가르쳐주신 방법으로 해봐도 안되네요

    ControlClick, Button1, MSofficeHScroll.ahk ahk_class #32770

    이 구문을 추가해봐도 여전히 경고창이 떠도 자동으로 '확인'버튼이 안눌러지네요

    쥔장님 자동으로 확인을 누를 수 있는 스크립트 좀 알려주실 수 있으신가요?
    답글

    • 남성 2019.02.03 21:32 신고

      일단 위에 작성 하신 명령어가 정확히 맞는지 확인해 봐야 할 겁니다. Active Window Info 를 이용하여 button 의 이름이나 에러 경고창의 이름이 정확한지 확인해 보고 위에 작성하신 ControlClick 명령어만 실행해 보세요. 해서 안되면 그냥 send 명령으로 enter 를 날려되 될 겁니다.

      위에 작성한 class 명이 맞다면 아래와 같이 하면 확인 버튼을 자동으로 누를 수 있지 않을까 싶네요.


      winwait MSofficeHScroll.ahk ahk_class #32770

      WinActivate, MSofficeHScroll.ahk ahk_class #32770

      send {Enter}

  • 낌스트 2019.02.03 22:33

    어느정도 해결했네요
    실행파일을 두개로 분리하고
    하나는 가로스크롤 구문, 하나는 창 다는 구문을 입력시켜 동시에 실행시키니 잘되네요
    여태껏 하나로 실행시켜서 안됏나보네요
    왜 하나에 파일에 두 구문을 동시에 넣으면 실행이 안되는지는 아직도 의문이지만..
    에러창 뜨는 게 여전히 좀 아쉽지만 그래도 자동종료 구문을 추가하니 아쉬운 대로 써야겟네요
    차기 엑셀에서는 꼭 가로스크롤 구문을 지원해줬으면 하네요
    감사했습니다.
    답글

    • 남성 2019.02.04 02:29 신고

      지금은 완벽하지 않더라도 하나 하나 해결하다 보면 다음에는 조금더 완벽한 해결 방법을 찾을 수 있을 겁니다. 자주 방문해 주세요. ^^