Отправка ввода мыши и клавиатуры с сервера на клиент через сокет в Python?

У меня работает поток рабочего стола, сервер может видеть рабочий стол клиента, в основном я делаю снимки экрана с клиента, непрерывно отправляю их на сервер и отображаю с помощью cv2.imshow().
Теперь мне нужен способ отправки ввода с мыши и клавиатуры из сервер к клиенту, чтобы он мог управлять клиентом удаленно. Я знаю, что модуль pyautogui можно использовать для имитации перемещения, щелчка и перетаскивания мыши, а также нажатия клавиш. Я подумал, что один из способов - отправить координаты в долях разрешения.

Пример.
Если ваш фотобокс имеет размер 800 x 600 и вы щелкаете в точке (200, 300), отправьте (0,25, 0,5).
На другом компьютере вы получите (0,25, 0,5) и вы умножаете их на разрешение. На разрешении 1024x768 вы перемещаете указатель мыши в положение (256, 384).

Но мне нужен метод, чтобы получить ввод с мыши и клавиатуры из окна opencv и отправить его клиенту через сокет, а затем смоделировать его на стороне клиента.

Любой другой метод вместо использования opencv для отображения кадров на сервере также будет принят, если я могу работать с клавиатурой и мышью и улучшать производительность.

Примечание. Я также не могу получить скриншот приглашения UAC с помощью Imagegrab.grab(), даже если я запускаю скрипт от имени администратора. Я не знаю, почему это происходит.

Ниже приведен мой код для клиентских и серверных исключений, которые не обрабатываются, поскольку я просто пытаюсь убедиться, что все работает.

Приветствуются любые предложения по ускорению трансляции :)

сервер.py:

import socket
import struct
import cv2
import numpy

host = "192.168.0.5"
port = 4444

s = socket.socket(socket.AF_INET,socket.SOCK_STREAM) #create socket
s.bind((host,port))
s.listen(5)
c , addr = s.accept()
print("Connection recieved from {}".format(addr))

cv2.namedWindow("Remote Desktop",cv2.WINDOW_NORMAL)
while True:
    bs = c.recv(8)
    (length,) = struct.unpack(">Q",bs) # get length of image
    data = b''
    while(len(data)<length):  # get image data
        recv_data = length - len(data)
        if(recv_data>4096):
            data += c.recv(4096)
        else:
            data += c.recv(recv_data)

    with open("demo.jpg","wb") as f:
        d = f.write(data)
        #print(d)
    img = cv2.imread("demo.jpg")
    cv2.imshow("Remote Desktop",img)
    key = cv2.waitKey(1)
    if key == 27:
        break

cv2.destroyAllWindows()
s.close()

Вот мой клиент.py:

import socket
import struct
from PIL import ImageGrab
import time

host = "192.168.0.5"
port = 4444
s = socket.socket(socket.AF_INET,socket.SOCK_STREAM) #create socket
s.connect((host,port)) #connect to server
print("Connection Established")
time.sleep(5)

while True:
        img = ImageGrab.grab()
        img.save("demo.jpg","JPEG")
        with open("demo.jpg","rb") as f:
            data = f.read()    # read the image
            s.sendall(struct.pack(">Q",len(data))) #send the length of image in bytes
            s.sendall(data)     # send the data

s.close()

Итак, как я могу эффективно отправлять ввод с мыши и клавиатуры через сокет в python? Спасибо за вашу помощь.


person Overflow    schedule 11.07.2018    source источник


Ответы (1)


Это может помочь вам .... Сделайте это в соответствии с вашими потребностями.

import threading
import mouse
import keyboard

mouse_events = []


mouse.hook(mouse_events.append)
keyboard.start_recording()

keyboard.wait("*")

mouse.unhook(mouse_events.append)
keyboard_events = keyboard.stop_recording()

#Keyboard threadings:

k_thread = threading.Thread(target = lambda :keyboard.play(keyboard_events))
k_thread.start()

#Mouse threadings:

m_thread = threading.Thread(target = lambda :mouse.play(mouse_events))
m_thread.start()

#waiting for both threadings to be completed

k_thread.join() 
m_thread.join()
person Harshit Joshi    schedule 02.03.2020