pyautogui 에서 typewrite 사용시 한글<-> 영문 인식 및 변경법 by using win32API

horiz.d·2021년 11월 16일
0

파이썬 꿀단지

목록 보기
18/35

파이썬으로 pyautogui를 이용해 특정 작업을 위한 실행시 자동으로 사전에 설정한 작업환경을 구성해주는 프로그램을 만들던 중,

typewrite 함수에 영문값을 넣어도 한글이 입력되거나 한글,영문이 혼용돼서 입력되는 등의 문제가 발생해서

win32 API를 이용해 현재 키보드상태를 인식하고 자동으로 변경해주는 방법을 찾아냈다.

import cytypes
import time 
from ctypes import wintypes
wintypes.ULONG_PTR = wintypes.WPARAM
hllDll = ctypes.WinDLL ("User32.dll", use_last_error=True)
VK_HANGUEL = 0x15


class MOUSEINPUT(ctypes.Structure):
    _fields_ = (("dx",          wintypes.LONG),
                ("dy",          wintypes.LONG),
                ("mouseData",   wintypes.DWORD),
                ("dwFlags",     wintypes.DWORD),
                ("time",        wintypes.DWORD),
                ("dwExtraInfo", wintypes.ULONG_PTR))
class HARDWAREINPUT(ctypes.Structure):
    _fields_ = (("uMsg",    wintypes.DWORD),
                ("wParamL", wintypes.WORD),
                ("wParamH", wintypes.WORD))
class KEYBDINPUT(ctypes.Structure):
    _fields_ = (("wVk",         wintypes.WORD),
                ("wScan",       wintypes.WORD),
                ("dwFlags",     wintypes.DWORD),
                ("time",        wintypes.DWORD),
                ("dwExtraInfo", wintypes.ULONG_PTR))
class INPUT(ctypes.Structure):
    class _INPUT(ctypes.Union):
        _fields_ = (("ki", KEYBDINPUT),
                    ("mi", MOUSEINPUT),
                    ("hi", HARDWAREINPUT))
    _anonymous_ = ("_input",)
    _fields_ = (("type",   wintypes.DWORD),
                ("_input", _INPUT))
def get_hanguel_state():
    return hllDll.GetKeyState(VK_HANGUEL)
def change_state():
    x = INPUT(type=1 ,ki=KEYBDINPUT(wVk=VK_HANGUEL))
    y = INPUT(type=1, ki=KEYBDINPUT(wVk=VK_HANGUEL,dwFlags=2))
    hllDll.SendInput(1, ctypes.byref(x), ctypes.sizeof(x))
    time.sleep(0.05)
    hllDll.SendInput(1, ctypes.byref(y), ctypes.sizeof(y))

#영 > 한
if get_hanguel_state() == 0: #0 일경우 vk_key : 0x15(한글키)가 비활성화
    change_state() #한글키 누르고(key_press) , 때기(release)

#한 > 영
if get_hanguel_state() == 1: #1 일경우 vk_key : 0x15(한글키)가 활성화
    change_state() #한글키 누르고(key_press) , 때기(release)

REF :

#getkeystate : https://docs.microsoft.com/en-us/windows/win32/api/winuser/nf-winuser-getkeystate
#sendinput : https://docs.microsoft.com/en-us/windows/win32/api/winuser/nf-winuser-sendinput
#code : https://gist.github.com/Aniruddha-Tapas/1627257344780e5429b10bc92eb2f52a

https://hashcode.co.kr/questions/11185/%ED%8C%8C%EC%9D%B4%EC%8D%AC-%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%A8-%EC%8B%A4%ED%96%89%EC%8B%9C-%EB%82%98%ED%83%80%EB%82%98%EB%8A%94-%EC%BD%98%EC%86%94%EC%B0%BD%EC%97%90-%EC%9E%85%EB%A0%A5%EC%8B%9C-%ED%95%9C%EC%98%81-%EC%A0%84%ED%99%98%ED%82%A4-%EC%95%88-%EB%88%8C%EB%9F%AC%EB%8F%84-%EA%B8%B0%EB%B3%B8%EC%A0%81%EC%9C%BC%EB%A1%9C-%ED%95%9C%EA%B8%80%EC%9D%B4-%EC%9E%85%EB%A0%A5%EB%90%98%EB%8F%84%EB%A1%9D-%ED%95%A0-%EC%88%98-%EC%9E%88%EB%82%98%EC%9A%94
김호원님에게 무한한 감사를 보냅니다.

profile
가용한 시간은 한정적이고, 배울건 넘쳐난다.

0개의 댓글