디시인사이드 갤러리

마이너 갤러리 이슈박스, 최근방문 갤러리

갤러리 본문 영역

[일반] 교훈 : 어중간한 실력으로 크롬 전용 게임 비활성 매크로 제작하지 말자.

ㅇㅇ(110.11) 2020.07.01 19:29:15
조회 1357 추천 1 댓글 22
														

비활성 매크로 제작을 시도하면서 실패 후기를 남겨 봄..



일단 비활성 매크로의 주 목적은, 주로 남들 몰래 게임을 진행하기 위함과 본인이 컴퓨터로 하는 것을 방해받지 않기 위함임.

이런 매크로를 좀 더 잘 만들기 위해서는 몇 가지 선수 지식이 요구되는 것 같음.


일단은 윈도우(창)라는 게 다 핸들로 구분되어 있고, 사용자는 그 윈도우들에 일련의 메시지(키 입력, 마우스 클릭 등)를 보내서 상호 작용을 하는데, 각각의 윈도우마다 전체적인 틀 내에서 메시지 처리 방식이 별도로 있음. 보통은 크게 다르지 않음. 그리고 각각의 윈도우 중에는 활성 창 1개랑 비활성 창들로 이루어져 있고, 보통은 활성 창만 메시지를 받음. 근데, 핸들을 특정해 주고 메시지를 발생시킬 수가 있음. 


좀 더 구체적으로는

메시지를 보내길 원하는 윈도우의 handle을 얻고 (FindWindow 같은 거 쓰면 됨.)


PostMessage(handle, 메시지, 옵션1 옵션2)를 하면 윈도우에 그 메시지를 다이렉트로 보낼 수 있음.

 


그렇게 해서 실제로 우리가 하는 활성화 키 입력이랑 마우스 입력은 그렇게 창이 비활성화되어 있어도 문제 없이 메시지를 보낼 수 있음. 

근데, 이제부터가 정말 골치 아파짐. 


1. 스크린 캡쳐.


이걸 원하는 크롬창만(작업표시줄 같은 거 안 보이게) 스크린 캡쳐를 하고, 파일로 저장하는데 계속 검은 화면이 뜸. 근데, 동일한 코드를 크롬 창 말고 다른 윈도우 창으로 시도해 보면, 어떤 창은 검은 화면 뜨고, 어떤 창은 제대로 뜨고, 심지어 어떤 창은 배경은 검은색인데 구성 요소들은 또 제대로 뜸. (맨 처음 시작할 때 배경 화면을 캡쳐해 보면, 원래 푸른색인 바탕화면은 검은색으로 표현되고 아이콘들은 정상적으로 표현됨.)


이 문제에 대해 StackOverflow 등을 찾아다니면서 알아본 결과, 해당 윈도우가 이미지를 그리는 방식이 근본적으로 다르기 때문이라고 함. 


화면 캡쳐하는 기본적인 방법은 윈도우에다가 Print 메시지 같은 걸 보내면 그 윈도우가 알아서 해 주겠지 라는 생각으로 보통 이루어짐. 


그런데, 이 방식은 CPU를 사용하는 것이고, 크롬의 이미지는 CPU가 아니라 GPU를 사용함. 다른 말로는, 하드웨어 가속을 사용한다고 함. (왜냐하면, 이미지 표현하는 건 CPU보다 GPU가 더 빠르고 잘 한다고 함.)


이때, 하드웨어 가속을 하여 GPU를 사용해서 그린 이미지는 CPU를 사용해서 그림을 그리는 GDI 방식으로는 캡쳐가 안 됨. (적어도 난 방법을 못 찾았음.)


그래서 나도 똑같이 GPU를 사용해서 화면 캡쳐하면 되는 거 아니냐고 생각하고 좀 더 자료 찾아 봤는데, 결국 못 찾음. (후보 몇 개 찾았지만 다 실패함.)


그나마 이건 해결 방법이 있었음. 


그냥 크롬 보고 GPU 쓰지 말라고 하는 거임. (설정 창에 있음.) 그리고 실제로 GPU를 쓰지 않도록 설정하고 크롬 창을 캡쳐해 봤더니 제대로 캡쳐가 됐음!


근데, GPU를 안 쓰니까 렉이 심하게 걸리더라.  


그래, 뭐 이 정도 렉은 그냥 눈 감아 줄 수 있지. 


정 안 되면 또 다른 해결 방법이 있었음. 


크롬 창을 캡쳐하지 말고, 모니터 화면 자체를 캡쳐하는 방법임. 크롬 창은 Print 메시지를 처리할 때, GPU 기반 이미지를 출력해 주지 않지만, 모니터 자체에 Print 메시지를 보내면 모니터는 그냥 각 픽셀의 RGB값을 반환해 줘서 전체 화면 스크린샷은 언제나 가능함. 


그래서 본래 목적에서 방해 받지 않는다는 걸 포기하고, 남들에게 보이게 하지 않는다는 목적을 달성하는 준비활성 매크로를 만들어보고자 했음. 

게다가 윈도우10에서는 새 데스크톱을 만들 수 있더라. 그러면, 본래 작업할 데스크톱1과 알아서 돌아가게 할 창이 있는 데스크톱2를 생성하고, 

데스크톱1에 있다가 일정한 시간 간격으로 데스크톱2로 순간적으로 이동해서 전체 화면 스크린샷을 하고 다시 데스크톱1로 돌아오는 거임. 이때, 그 순간에 누가 볼 수 있으니까, 데스크톱2로 이동하기 전에 화면을 끄고(절전 모드로 만듦. Fn +F9 로 하면 더 좋은데, Fn키를 보내는 메시지가 없더라. 이거 찾느라 또 고생함.), 스크린샷 하고 데스크톱1로 완전히 돌아오면 다시 화면을 켜는 거임. 


그러면, 일정 간격으로 화면이 꺼졌다 켜졌다 하겠지만, 공공장소에서 사용하다가 들킬 위험은 줄어듦.


이 기능들까지는 어찌어찌 잘 구현했음.

근데, 진짜 근본적인 문제는 그 다음이었음.



2. 클릭하면 창이 활성화된다.


윈도우 창을 클릭하면 그 윈도우 창이 맨 위로 올라오고 다른 윈도우 창들은 (그 창이랑 겹쳐 있으면 겹친 부분이) 가려지는 건 다들 알 거임. 그게 대충 활성화된 창의 특징 중 하나임. (포커스가 해당 윈도우 창으로 이동했다고도 함.)


근데, PostMessage를 해서 비활성 클릭을 해도 그 창이 활성화가 됨. 그러면, 모니터 화면이 자동으로 그 윈도우 창을 표시하게 됨. (데스크톱 다르면 그 창이 있는 데스크톱으로 이동까지 해 주더라.)


이게 해당 윈도우를 마우스 클릭을 하면 WM_MOUSEACTIVATE라는 메시지가 자동으로 발생하고 이걸 윈도우 창에서 처리할 때는 일반적으로는 창을 활성화시키도록 처리함. 다만, 처리 방식에 따라서는 이 메시지를 다르게 처리해서, 마우스 클릭은 처리하고 활성은 시키지 않게 하는 처리 방식도 있다고 함. 그런 처리 방식을 갖는 대표적인 예가 터치 키보드임. (터치 키보드를 클릭해도 포커스가 터치 키보드에 가지 않음.)


그리고 그걸 위해 좀 알아 본 게, 윈도우 창의 확장 스타일 중에 WS_EX_NOACTIVATE라는 스타일이 있음. 이게 바로 클릭해도 활성화가 되지 않게 해 주는 윈도우 스타일임. 


그래서 해당 윈도우의 핸들을 구해서 그 핸들의 확장 스타일에 WS_EX_NOACTIVATE를 추가해 주면, 그 윈도우를 클릭해도 활성화가 되지 않음. 


근데, 크롬은 예외더라. 더 정확히는 크롬의 클라이언트 창은 예외더라.  일반적인 다른 윈도우 창들은 저렇게 코드 만들어서 저런 확장 스타일 추가해 주면 정말로 클릭을 해도 창이 맨 위로 뜨지 않고 다른 창에 가려진 채로 남아 있음. 즉, 코드 문제가 아님. 심지어 크롬의 Non-client 영역(위에 검색창이랑 탭 있는 부분. 얘는 또 다른 핸들을 갖고 있음.)에다가 시도해보면 얘도 클릭해도 활성화가 되지 않는 상태가 됨. 즉, 이건 단순히 코드의 문제가 아니라 크롬의 보다 근본적인 구조가 이 방식을 못 하게 하는 것 같음. 그리고 관련 정보도 좀 찾으려고 해 봤지만 못 찾았음. 



이 문제 만큼은 정말 해결해 주기 쉽지 않았음. 


이 게임은 키보드를 쓸 일이 거의 없고, (유니온 기부랑 채팅 정도?) 마우스 클릭으로 진행하는 게임인데, 마우스 클릭 메시지를 보내는 것만으로 그 창이 모니터 화면에 바로 보이게 되면, 결국 누군가에게도 보일 위험이 매우 큼. 


그러면 차라리 본인의 매크로를 믿고, 윈도우 화면을 투명하게 만들면 어떨까 싶었는데, 크롬 창을 투명하게 만드는 방법을 찾지 못했음. 


어쩌면 게임이 크롬이 아니라 오페라로 돌아가기만 했어도 아마 비활성 매크로 만들 수 있었을 것 같은데, (오페라에 직접 해 본 건 아니고 된다는 글을 본 것 같음. 근데 어차피 오페라로 게임 안 돌아가니까 시도도 안 함.)


아니면, 특수 안경이 있어야만 보이는 모니터 화면이라면 또 모를까.....



이렇게 엄청난 고통을 받고 문제 해결을 완전히 하지 못한 채 포기함.....



혹시라도 이 과정을 통해서 겪은 문제를 하나라도 해결할 방법이 있으면 알려주면 정말 감사하겠음. 





그냥 비활성만 포기하면, 스크린 캡쳐도 가능하고 인터페이스 위치 다 일일히 좌표 분석해서 마우스 매크로 만드는 것도 가능함.

추천 비추천

1

고정닉 0

0

댓글 영역

전체 댓글 0
등록순정렬 기준선택
본문 보기

하단 갤러리 리스트 영역

왼쪽 컨텐츠 영역

갤러리 리스트 영역

갤러리 리스트
번호 말머리 제목 글쓴이 작성일 조회 추천
2850 설문 운전대만 잡으면 다른 사람이 될 것 같은 스타는? 운영자 24/04/15 - -
2851 이슈 [디시人터뷰] 집념닥터, ‘내가 사랑하는 커뮤니티, 디시인사이드’ 운영자 24/04/16 - -
37265 공지 신희 갤러리 통합공지 (2021-05-02) Plancard갤로그로 이동합니다. 21.05.02 1716 2
2 공지 카미히메 프로젝트 갤러리 공지사항 로이탄먹는놈갤로그로 이동합니다. 16.09.01 8530 1
39763 일반 B등상 입갤 [1] 녹색다시마갤로그로 이동합니다. 04.18 25 0
39762 일반 미라티켓 뭐데려오지 [4] ㅇㅇ(203.234) 04.18 59 0
39761 일반 아리사 나왔다고 해서 옴 [1] aaaaku(122.38) 04.17 39 0
39760 일반 왜 이번에는 10연차 뿐이지?? [1] 윤회쌉초보갤로그로 이동합니다. 04.17 34 0
39759 일반 왕성 다 빼버리는건 좀 그렇겠지 [1] ㅇㅇ(203.234) 04.17 49 0
39758 일반 이제 테크대 단일에 아르젠탐 박는건 별로인가 [3] ㅇㅇ(203.234) 04.17 43 0
39757 일반 그냥 빛 15눈깔무기 하나 더 풀돌함 [3] ㅇㅇ(203.234) 04.16 61 0
39756 일반 기수 레이드 솔플 기준 덱 구성 [5] ごご(39.7) 04.14 69 0
39755 일반 세팅 조언해줄 고인물들 구함... [6] 녹색다시마갤로그로 이동합니다. 04.13 76 0
39754 일반 검은책 다모았다ㅋㅋㅋㅋ이제 항우개방 딱 [2] ㅇㅇ(203.234) 04.13 70 0
39753 일반 15눈깔 풍속은 안나오나 [1] ㅇㅇ(58.78) 04.13 42 0
39752 일반 좀 늦었지만 전기회 결과 [1] DenpaOtoko갤로그로 이동합니다. 04.11 69 0
39751 일반 일단 나온거에 만족해야지. [1] ごご(118.36) 04.11 55 0
39750 일반 전 단차로 나왔어요 [5] DenpaOtoko갤로그로 이동합니다. 04.11 84 0
39749 일반 천보 6마리 다모임 [1] ㅇㅇ(203.234) 04.11 51 0
39748 일반 북두프렌이 절실하다 [4] DenpaOtoko갤로그로 이동합니다. 04.10 90 0
39747 일반 타나토스는 항상 좋네 [1] ㅇㅇ(203.234) 04.10 57 0
39746 일반 킹오크는 등장 20분만에 따잇당했슴니다.. DenpaOtoko갤로그로 이동합니다. 04.08 71 0
39745 일반 신천보 앞으로 남은건 하나 [8] ㅇㅇ(211.234) 04.03 108 0
39744 일반 어둠 좀 초강력해진거같음 ㅇㅇ(203.234) 04.03 51 0
39742 일반 불 딜은 부족하지만 좀비됐음 ㅇㅇ(203.234) 04.02 52 0
39741 일반 감옥 간수인줄 알고 당연히 채찍휘두를 줄 알았는데 [2] ㅇㅇ(203.234) 04.02 70 0
39740 일반 이번 환수제 질문 [3] 카갤러(220.125) 04.01 79 0
39739 일반 항우 해방했슴 + 소소한 정보 [8] DenpaOtoko갤로그로 이동합니다. 04.01 142 0
39738 일반 이걸로 불은 이제 안심이다 [2] ㅇㅇ(203.234) 04.01 75 1
39737 일반 분명 어저께 항우 해방재료 다 준비했는 DenpaOtoko갤로그로 이동합니다. 04.01 61 0
39736 일반 항우 무기는 뭐로열지 고민되네 [5] DenpaOtoko갤로그로 이동합니다. 04.01 95 0
39735 일반 어둠 알렉산더팟 존나기분좋아 ㅇㅇ(203.234) 04.01 53 0
39734 일반 오크랑 레이드중 뭐돌아야함? [2] ElsQanT(223.39) 03.31 69 0
39733 일반 4월 요리미츠 [1] 윤회쌉초보갤로그로 이동합니다. 03.31 86 0
39732 일반 레이드이벤 개편한건가? [2] ㅇㅇ(203.234) 03.30 64 0
39731 일반 1년간 어둠 존나세진듯 [1] ㅇㅇ(203.234) 03.30 72 0
39730 일반 항우 좀 생각해보니 꽤 쉽게 쓸만할지도 ㅇㅇ(203.234) 03.29 51 0
39729 일반 오크토벌 이건 뭔생각으로 만든건지 잘 모르겠네 [3] ㅇㅇ(203.234) 03.29 82 0
39728 일반 미소지환수 3스텝 ㅇㅇ(203.234) 03.29 53 0
39727 일반 ㅋㅋ로키 막상 혼자 패보려고 하니 애미없네 [1] ㅇㅇ(203.234) 03.29 49 0
39726 일반 카타스 환수 얻고싶은데 [5] 카갤러(220.125) 03.28 78 0
39725 일반 신규 페이지 드랍은 잘되는 편이네 [1] DenpaOtoko갤로그로 이동합니다. 03.28 93 0
39724 일반 [중요]추첨권 데일리미션 신경써서 클리어하셈 DenpaOtoko갤로그로 이동합니다. 03.28 79 0
39723 일반 별로 안아프네 생각보다 [3] ㅇㅇ(203.234) 03.28 75 0
39722 일반 쩝 망한거같은데 천장이네 [1] 윤회쌉초보갤로그로 이동합니다. 03.28 73 0
39721 일반 与ダメージ 디버프 질문 [3] ㅇㅇ(203.234) 03.28 61 0
39720 일반 8주년 가챠는 순방했다.. [1] DenpaOtoko갤로그로 이동합니다. 03.28 110 0
39719 일반 진짜개씨발개새끼들아 [1] ㅇㅇ(203.234) 03.28 100 0
39718 일반 좋은 소식과 안좋은 소식이 있어 [1] ㅇㅇ(203.234) 03.28 86 0
39717 일반 오늘 멘테종료는 17시 예정 DenpaOtoko갤로그로 이동합니다. 03.28 53 0
39716 일반 어차피 내일 풀릴 정보지만 미리 풀음 [2] ElsQanT(221.140) 03.27 79 0
39715 일반 무기 하나만 넣으면 되는데 [6] 카갤러(220.125) 03.25 79 0
39714 일반 갤 망한거 같은데 에로랩스 갤로 쓰자 [9] ㅇㅇ(218.233) 03.21 191 0
39713 일반 글고보니 ssr각성은 아예 사라진건가 [2] ㅇㅇ(203.234) 03.20 87 0
갤러리 내부 검색
제목+내용게시물 정렬 옵션

오른쪽 컨텐츠 영역

실시간 베스트

1/8

뉴스

디시미디어

디시이슈

1/2