У меня работает поток рабочего стола, сервер может видеть рабочий стол клиента, в основном я делаю снимки экрана с клиента, непрерывно отправляю их на сервер и отображаю с помощью 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
? Спасибо за вашу помощь.