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

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

by 만들오 2022. 1. 13.
728x90

 

donaricano-btn

 

안녕하세요? 만들오 입니다.

최근 게임 매크로에 비활성 키 입력을 사용하고 있습니다.

  • 비활성 키 입력이란? 창이 다른 화면에 가려져 있어도 입력하는 방식

이 방식으로 바로 게임창으로 키 입력을 보내는게 가장 좋은데, 게임사에서 막아놓곤 합니다.

 

아래 깃허브 홈페이지에서, 비활성 키보드 입력하는 부분을 마우스 입력으로 변경해 보았습니다.

 

import win32gui, win32ui, win32con, win32api, time

def get_inner_windows(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

#중요 : 안되면 관리자 권한으로 해볼 것
#화상 키보드 대상 win + ctrl + o 키로 실행할 수 있다.
window_name = "화상 키보드"
hwnd = win32gui.FindWindow(None, window_name)
left, top, right, bottom = win32gui.GetWindowRect(hwnd)
win32gui.MoveWindow(hwnd, left, top, 576, 173, True)
#get_inner_windows() 함수를 통해 내부 클래스의 핸들을 가져온다.
#미리 코드를 실행시켜 확인한 결과 : DirectUIHWND
hwnd_sub = get_inner_windows(hwnd)['DirectUIHWND']

#이 코드가 핵심이었다. 다른 예제에서는 찾기 어려웠음.
win = win32ui.CreateWindowFromHandle(hwnd_sub)

#화상 키보드에 x=100, y=100좌표(숫자 1 위치)를 long타입으로 만들어 준다
lParam = win32api.MAKELONG(53, 35)
#마우스 다운
win.PostMessage(win32con.WM_LBUTTONDOWN, win32con.MK_LBUTTON, lParam)
time.sleep(0.2)
#마우스 업
win.PostMessage(win32con.WM_LBUTTONUP, win32con.MK_LBUTTON, lParam)

#문자를 보내는 경우
#win.SendMessage(win32con.WM_CHAR, ord('A'), 0)
#win.SendMessage(win32con.WM_CHAR, ord('B'), 0)


#win.SendMessage(win32con.WM_KEYDOWN, 0x1E, 0)
#sleep(0.5)
#win.SendMessage(win32con.WM_KEYUP, 0x1E, 0)

 

댓글