通过Python在套接字上从服务器向客户端发送鼠标和键盘输入?

问题描述 投票:1回答:1

我让我的桌面流在服务器上运行,可以看到客户端桌面,我基本上要做的是从客户端获取屏幕截图,并将其连续发送到服务器,然后使用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中的套接字有效地发送鼠标和键盘输入?感谢您的帮助。
python-3.x pyautogui
1个回答
0
投票
这可以帮助您。...根据需要进行设置。

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()

© www.soinside.com 2019 - 2024. All rights reserved.