keyboard-hook/test/client.py

195 lines
5.0 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

import evdev,sys
import pandas as pd
from socket import *
import time
NULL_CHAR = chr(0)
zero = NULL_CHAR*8
serHost = '192.168.0.111'
serPort = 50009
data = pd.read_csv("./scan-code.csv")
list = data.values.tolist()
def read_line(code):
code_hex = code.replace("0x","")
#print("code_hex=",code_hex)
for i in range(len(list)):
lkc = str(list[i][2])
if lkc[-1] == "0":
if code_hex == lkc.replace("0x00",""):
return int(list[i][0].replace("0x07 0x00",""),16)
else:
if code_hex == lkc[lkc.rfind("0")+1:]:
return int(list[i][0].replace("0x07 0x00",""),16)
def send_report(report):
sockobj.send(report.encode())
print(zero.encode())
sockobj = socket(AF_INET, SOCK_STREAM)
sockobj.connect((serHost,serPort))
sockobj.send(b'hid open')
data = sockobj.recv(1024)
print(data)
time.sleep(5)
while True:
for i in range(4,34):
send_report(NULL_CHAR*2+chr(i)+NULL_CHAR*5)
data = sockobj.recv(1024)
print(data)
send_report(NULL_CHAR*8)
data = sockobj.recv(1024)
i = i+1
if i == 35:
i = 4
send_report(NULL_CHAR*2+chr(40)+NULL_CHAR*5)
data = sockobj.recv(1024)
print(data)
send_report(NULL_CHAR*8)
data = sockobj.recv(1024)
time.sleep(0.1)
device = evdev.InputDevice('/dev/input/event1')
print(device)
tmp = 0
tmp_code = 0
hang = 0
caps = 0
for event in device.read_loop():
if event.type == evdev.ecodes.EV_KEY :
k = evdev.events.KeyEvent(event)
#print(k) #完整事件
#print(event.code) ##键盘code --按键的hex code(如28---enter)
hid_code = read_line(hex(event.code))
#print("hid_code=",hid_code)##完成scan code到hid code的转换
#print("hid_code_type=",type(hid_code))
#print(event.value) ##键盘状态 01,2 --0为release, 1为down , 2hold
if event.value == 1:
#print(NULL_CHAR*2+chr(event.code)+NULL_CHAR*5)
if hid_code == 224 or hid_code == 225 or hid_code == 226 or hid_code == 227 or hid_code == 228 or hid_code == 229 or hid_code == 230 or hid_code == 231 or hid_code == 58:
tmp_code = hid_code
hang = 1
match hid_code:
case 224:
tmp = 1
case 225:
tmp = 2
case 226:
tmp = 4
case 227:
tmp = 8
case 228:
tmp = 16
case 229:
tmp = 32
case 230:
tmp = 64
case 231:
tmp = 128
case 58:
if caps == 1:
caps = 0
else:
caps = 1
hang = 0
tmp_code = 0
else:
if tmp != 0: ##按住ctrl等然后按字母等
hang = 2 ##可以认定为没有单次敲击shift
print("caps=",caps)
if caps == 1 and (tmp_code == 225 or tmp_code == 229):
send_report(NULL_CHAR*2+chr(hid_code)+NULL_CHAR*5)
else:
send_report(chr(tmp)+NULL_CHAR+chr(hid_code)+NULL_CHAR*5)
else:
if caps == 1 :
send_report(chr(32)+NULL_CHAR+chr(hid_code)+NULL_CHAR*5)
else:
send_report(NULL_CHAR*2+chr(hid_code)+NULL_CHAR*5)
data = sockobj.recv(1024)
#print(data)
if event.value == 2:
#print(NULL_CHAR*2+chr(event.code)+NULL_CHAR*5)
if hid_code == 224 or hid_code == 225 or hid_code == 226 or hid_code == 227 or hid_code == 228 or hid_code == 229 or hid_code == 230 or hid_code == 231 :
tmp_code = hid_code
match hid_code:
case 224:
tmp = 1
case 225:
tmp = 2
case 226:
tmp = 4
case 227:
tmp = 8
case 228:
tmp = 16
case 229:
tmp = 32
case 230:
tmp = 64
case 231:
tmp = 128
else:
if tmp != 0:
hang = 2
if caps == 1 and (tmp_code == 225 or tmp_code == 229):
send_report(NULL_CHAR*2+chr(hid_code)+NULL_CHAR*5)
else:
send_report(chr(tmp)+NULL_CHAR+chr(hid_code)+NULL_CHAR*5)
else:
if caps == 1 :
send_report(chr(32)+NULL_CHAR+chr(hid_code)+NULL_CHAR*5)
data = sockobj.recv(1024)
#print(data)
else:
send_report(NULL_CHAR*2+chr(hid_code)+NULL_CHAR*5)
data = sockobj.recv(1024)
#print(data)
if event.value == 0:
if hid_code == tmp_code and hang == 1:
send_report(chr(tmp)+NULL_CHAR*7)
send_report(NULL_CHAR*8)
tmp = 0
tmp_code = 0
hang = 0
elif hid_code == tmp_code:
send_report(NULL_CHAR*8)
tmp = 0
tmp_code = 0
hang = 0
else:
send_report(NULL_CHAR*8)
data = sockobj.recv(1024)
#print(data)
'''
This article provided the answer.
Input reports (sent from keyboard to computer) have the following structure for a total of 8 bytes:
1 byte: modifier keys (Control, Shift, Alt, etc.), where each bit corresponds to a key
1 byte: unused/reserved for OEM
6 bytes: pressed key codes
Further into the article, there is a list of the modifiers, each represented by a bit:
Left Control: 224 (0x00e0)-------0x01
Left Shift: 225 (0x00e1)-------0x02
Left Alt: 226 (0x00e2)-------0x04
Left Meta (Windows key): 227 (0x00e3)-------0x08
Right Control: 228 (0x00e4)-------0x10
Right Shift: 229 (0x00e5)-------0x20
Right Alt: 230 (0x00e6)-------0x40
Right Meta (Windows key): 231 (0x00e7)-------0x80
For firing my screenshot app, I need CMD-SHIFT-5, so I need to set the 2nd and 4th bits on.
0b01010000
'''