我让我的桌面流在服务器上运行,可以看到客户端桌面,我基本上要做的是从客户端获取屏幕截图,并将其连续发送到服务器,然后使用cv2.imshow()
显示它。现在,我想要一种将鼠标和键盘输入从服务器发送到客户端的方法,以便它可以远程控制客户端。我知道pyautogui
模块可用于模拟移动,单击和拖动鼠标以及按键。我认为的一种方法是按分辨率的分数发送坐标。
示例:如果您的图片框是800x600,并且您单击了位置(200,300),则发送(0.25,0.5)。在另一台计算机上,您收到(0.25,0.5),然后将它们乘以分辨率。在1024x768上,将鼠标指针移到位置(256,384)。
但是我需要一种方法来从opencv
窗口中获取鼠标和键盘输入,并通过套接字将其发送到客户端,然后在客户端进行模拟。
只要我能够使用键盘和鼠标输入并提高性能,那么也可以接受使用任何其他方法代替使用opencv
在服务器上显示帧。
Note:即使我以管理员身份运行脚本,我也无法使用Imagegrab.grab()
获取UAC提示的屏幕截图这正在发生。
下面是我针对客户端和服务器异常的代码,由于我只是在尝试正常工作,因此未得到处理。
也欢迎任何[[建议使我的信息流更快::]
server.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()
这里是我的client.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
中的套接字有效地发送鼠标和键盘输入?感谢您的帮助。
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()