본문 바로가기
소프트웨어/파이썬

[파이썬] 화상 키보드 비활성으로 클릭하기

by 만들오 2022. 5. 29.
728x90
 

[파이썬] 비활성 키 입력 코드 공유

안녕하세요? 만들오 입니다. 최근 게임 매크로에 비활성 키 입력을 사용하고 있습니다. 비활성 키 입력이란? 창이 다른 화면에 가려져 있어도 입력하는 방식 이 방식으로 바로 게임창으로 키 입

mandloh.tistory.com

※ 위의 글에서 수정한 버전입니다.

※ 일부 게임가드는 이 기능을 사용할 수 없도록 막고 있습니다.(참고)

 


비활성 클릭이란?

창을 마우스로 선택하지 않아도, 창이 다른창에 가려져 있어도 클릭할 수 있는 방식

 

Requirements

1. 파이썬 라이브러리 설치

pip install pywin32

 

2. 화상 키보드 설정

좌표를 입력하는 방식이기 때문에, 크기와 레이아웃이 제 설정과 같아야 합니다.

다음 순서에 따라 설정을 완료하세요.

① win + ctrl + o 키를 동시에 눌러 화상 키보드 실행

② 옵션에 진입한 후, 아래 이미지와 같이 설정 후 확인

③ 창 크기를 가장 작게 줄이기(아래 그림처럼 모서리를 잡아서 작아지도록)

 

osk.py
import time
import win32gui, win32ui, win32con, win32api
from win32com.shell import shell

class OSK:
    def __init__(self):
        if not shell.IsUserAnAdmin():
            raise Exception("관리자 권한이 필요합니다")
        self.hwnd = win32gui.FindWindow(None, "화상 키보드")
        if not self.hwnd:
            raise Exception("화상 키보드가 실행중이지 않습니다")
        else:
            self.hwnd_sub = self.getInnerWindows(self.hwnd)["DirectUIHWND"]
            self.win = win32ui.CreateWindowFromHandle(self.hwnd_sub)

    def getInnerWindows(self, whndl):
        def callback(hwnd, hwnds):
            if win32gui.IsWindowVisible(hwnd) and win32gui.IsWindowEnabled(hwnd):
                hwnds[win32gui.GetClassName(hwnd)] = hwnd
            return True
        hwnds = {}
        win32gui.EnumChildWindows(whndl, callback, hwnds)
        return hwnds
    
    def click(self, x, y):
        lParam = win32api.MAKELONG(x, y)
        self.win.PostMessage(win32con.WM_LBUTTONDOWN, win32con.MK_LBUTTON, lParam)
        time.sleep(0.1)
        self.win.PostMessage(win32con.WM_LBUTTONUP, win32con.MK_LBUTTON, lParam)

    def press(self, key):
        posX = {"1":55, "2":80, "3":105, "4":130, "5":155, "6":180, "7":205, "8":230, "9":255, "0":280}
        self.click(posX[key], 16)

app = OSK()
for i in range(0, 10):
    app.press(str(i))
    time.sleep(0.2)

 

실행화면

 

[끝].

댓글