100字范文,内容丰富有趣,生活中的好帮手!
100字范文 > Python 手把手实现远程控制桌面

Python 手把手实现远程控制桌面

时间:2023-05-12 22:36:21

相关推荐

Python 手把手实现远程控制桌面

作者 |李秋键

责编 | 寇雪芹

头图 | 下载于视觉中国

本项目旨在让大家理解远控软件的原理,通过远控桌面可以实现远程控制我们的电脑,更好更方便的管理电脑。文末将给出初始版的完整代码,需要使用到的其他工具也会有所说明。最终实现的效果就是只要用户点击了客户端的程序运行,我们就可以在服务端对其进行控制。效果如下:左边是客服端程序运行了,然后我们就可以在左边的另一台电脑上打开服务端程序进行控制,可以看到左边的屏幕图像也已经显示在了右边的电脑上。完整代码见文末!

远控流程

1.1 环境要求

本次环境使用的是python3.6.5+windows平台

主要用的库有:图像处理库opencv,包括用来目标检测和图像处理等操作。

Socket用来远程传输数据达到远程控制的效果;

Threading模块用来创建多线程管理;

Numpy模块用来辅助opencv对图像进行一些像素值操作;

PIL模块用来获取屏幕图像数据;

pynput.mouse用来控制鼠标点击事件。达到远程控制鼠标的作用。

1.2 客户端讲解

客户端在这里指的是被控制的电脑,就是我们需要受到控制的电脑。

(1)首先是导入相关模块:

1#客户端代码2importsocket3importthreading4importcv25importnumpyasnp6fromPILimportImageGrab7frompynput.mouseimportButton,Controller

(2)接着创建一个鼠标控制器和用来接收服务端数据的函数。因为需要一直都接收数据,故需要嵌入循环。在这里客户端还需要接收数据的原因是,用来接收服务端传来的鼠标控制信息,要不然怎么实现鼠标控制桌面的效果呢。

1#接受服务器返回的数据的函数2m=Controller()3defrecvlink(client):4whileTrue:5msg=client.recv(1024)6msg=msg.decode('utf-8')7print(msg)8key=msg.split(",")9xp=int(key[0])10yp=int(key[1])11m.position=((xp,yp))12m.click(Button.left,1)

(3)创建ipv4的socket对象,使用TCP协议(SOCK_STREAM)。然后设置服务端IP地址,以及端口。这里用来向服务端传输数据,即传输桌面图像数据。注释代码如下:

1#创建ipv4的socket对象,使用TCP协议(SOCK_STREAM)2client=socket.socket(socket.AF_INET,socket.SOCK_STREAM)3#设置服务器ip地址,注意应该是服务器的公网ip4host='服务器的公网ip'5#设置要发送到的服务器端口,需要在云服务器管理界面打开对应端口的防火墙6port=设置的端口7#建立TCP协议连接,这时候服务器就会监听到到连接请求,并开始等待接受client发送的数据8client.connect((host,port))9#建立连接后,服务器端会返回连接成功消息10start_msg=client.recv(1024)11print(start_msg.decode('utf-8'))12#开启一个线程用来接受服务器发来的消息13t=threading.Thread(target=recvlink,args=(client,))14t.start()15p=ImageGrab.grab()#获得当前屏幕16quality=25#图像的质量17encode_param=[int(cv2.IMWRITE_JPEG_QUALITY),quality]18whileTrue:19im=ImageGrab.grab()20imm=cv2.cvtColor(np.array(im),cv2.COLOR_RGB2BGR)#转为opencv的BGR格式21imm=cv2.resize(imm,(1535,863))22img_encode=cv2.imencode(".jpg",imm,encode_param)[1]23data_encode=np.array(img_encode)24str_encode=data_encode.tostring()25#print(len(str_encode))26#输入要发送的信息27sendmsg="kehu"28#向服务器发送消息29client.send(str_encode)30ifsendmsg=='quit':31break32#结束时关闭客户端33client.close()

1.3 服务端讲解

服务端指的是用来控制远程电脑的那一端,为了方便使用,我们直接在服务器上使用即可。

(1)导入使用到的模块:

1#服务器端2importsocket3importthreading4importnumpyasnp5importcv26importos

(2)创建鼠标点击事件函数,用来获取鼠标点击的位置坐标:

1print("等待连接---")2defmouse_click(event,x,y,flags,para):3ifevent==cv2.EVENT_LBUTTONDOWN:#左边鼠标点击4f=open("1.txt","w")5f.write(str(x)+","+str(y))6f.close()

(3)创建服务器端接收数据函数,用来实时接收传输过来的图像数据并显示:

1defrecv_msg(clientsocket):2whileTrue:3#接受客户端消息,设置一次最多接受10240字节的数据4recv_msg=clientsocket.recv(102400)5#把接收到的东西解码6msg=np.fromstring(recv_msg,np.uint8)7img_decode=cv2.imdecode(msg,cv2.IMREAD_COLOR)8try:9s=img_decode.shape10img_decode=img_decode11temp=img_decode12except:13img_decode=temp14pass15cv2.imshow('SERVER',img_decode)16cv2.setMouseCallback("SERVER",mouse_click)17try:18f=open("1.txt")19txt=f.read()20f.close()21reply=txt22print(reply)23clientsocket.send(reply.encode('utf-8'))24os.remove("1.txt")25except:26pass27ifcv2.waitKey(1)&0xFF==ord('q'):28break

(4)主函数,用来建立连接和数据接收等功能。

1defmain():2socket_server=socket.socket(socket.AF_INET,socket.SOCK_STREAM)3host='服务器的本地ip'4#设置被监听的端口号,小于1024的端口号不能使用5port=设置的端口6socket_server.bind((host,port))7#设置最大监听数,也就是最多可以同时响应几个客户端请求,一般配合多线程使用8socket_server.listen(5)9#等待客户端连接,一旦有了连接就立刻向下执行,否则等待10#accept()函数会返回一个元组,第一个元素是客户端socket对象,第二个元素是客户端地址(ip地址+端口号)11clientsocket,addr=socket_server.accept()12#有了客户端连接后之后才能执行以下代码,我们先向客户端发送连接成功消息13clientsocket.send('连接成功'.encode('utf-8'))14#和客户端一样开启一个线程接受客户端的信息15t=threading.Thread(target=recv_msg,args=(clientsocket,))16t.start()

远程控制GUI窗口

远控桌面GUI主要是为了美观而用,需要大家根据远程代码进行集合修改。当然单独使用上述代码已经可以实现功能了,只是不够美观。由于考虑到此处代码量较大,且不是重点,故粗略讲解

(1)导入相关库:

1fromPyQt5.QtWidgetsimport*2fromPyQt5.QtCoreimport*3fromPyQt5.QtGuiimportQPalette,QBrush,QPixmap4importos5importsocket6importthreading7importcv28importnumpyasnp9fromPILimportImageGrab10frompynput.mouseimportButton,Controller11importtime

(2)建立鼠标控制函数和点击函数

1m=Controller()2defmouse_click(event,x,y,flags,para):3ifevent==cv2.EVENT_LBUTTONDOWN:#左边鼠标点击4print(x,y)5m.position=(x,y)6time.sleep(0.1)7m.click(Button.left,1)

(3)GUI界面初始化,由于我们需要把实时的视频显示在窗口上,故也需要使用到opencv。

1def__init__(self,parent=None):2super(Ui_MainWindow,self).__init__(parent)3#self.face_recong=face.Recognition()4self.timer_camera=QtCore.QTimer()5self.cap=cv2.VideoCapture()6self.CAM_NUM=07self.set_ui()8self.slot_init()9self.__flag_work=010self.x=011self.count=0

(4)设置窗口大小和控件位置等信息。创建布局和设置名称

1defset_ui(self):2self.__layout_main=QtWidgets.QHBoxLayout()3self.__layout_fun_button=QtWidgets.QVBoxLayout()4self.__layout_data_show=QtWidgets.QVBoxLayout()5self.button_open_camera=QtWidgets.QPushButton(u'远程桌面')6self.button_close=QtWidgets.QPushButton(u'退出')7#Button的颜色修改8button_color=[self.button_open_camera,self.button_close]9foriinrange(2):10button_color[i].setStyleSheet("QPushButton{color:black}"11"QPushButton:hover{color:red}"12"QPushButton{background-color:rgb(78,255,255)}"13"QPushButton{border:2px}"14"QPushButton{border-radius:10px}"15"QPushButton{padding:2px4px}")16self.button_open_camera.setMinimumHeight(50)17self.button_close.setMinimumHeight(50)18# move()方法移动窗口在屏幕上的位置到x = 300,y = 300坐标。19self.move(500,500)20#信息显示21self.label_show_camera=QtWidgets.QLabel()22self.label_move=QtWidgets.QLabel()23self.label_move.setFixedSize(100,100)24self.label_show_camera.setFixedSize(1530,863)25self.label_show_camera.setAutoFillBackground(False)26self.__layout_fun_button.addWidget(self.button_open_camera)27self.__layout_fun_button.addWidget(self.button_close)28self.__layout_fun_button.addWidget(self.label_move)29self.__layout_main.addLayout(self.__layout_fun_button)30self.__layout_main.addWidget(self.label_show_camera)31self.setLayout(self.__layout_main)32self.label_move.raise_()33self.setWindowTitle(u'远控桌面GUI')34'''35#设置背景图片36palette1=QPalette()37palette1.setBrush(self.backgroundRole(),QBrush(QPixmap('background.jpg')))38self.setPalette(palette1)39'''

(5)获取鼠标点击时的坐标:

1defmousePressEvent(self,event):2ifevent.buttons()&QtCore.Qt.LeftButton:3x=event.x()-1204y=event.y()-105text="x:{0},y:{1}".format(x,y)6ifx>=0andy>=0:7m.position=(x,y)8time.sleep(0.1)9m.click(Button.left,1)10print(text)

(6)按钮绑定所设置的函数:

1defslot_init(self):2self.button_open_camera.clicked.connect(self.button_open_camera_click)3self.timer_camera.timeout.connect(self.show_camera)4self.button_close.clicked.connect(self.close)

(7)显示桌面功能函数,并设置点击时修改名称,可以随时关闭桌面

1defbutton_open_camera_click(self):2ifself.timer_camera.isActive()==False:3self.timer_camera.start(30)4self.button_open_camera.setText(u'关闭')5else:6self.timer_camera.stop()7self.cap.release()8self.label_show_camera.clear()9self.button_open_camera.setText(u'远程桌面')

(8)显示桌面函数和退出程序函数

1defshow_camera(self):2im=ImageGrab.grab()3imm=cv2.cvtColor(np.array(im),cv2.COLOR_RGB2BGR)#转为opencv的BGR格式4#imm=cv2.resize(imm,(1535,863))5self.image=imm6#face=self.face_detect.align(self.image)7#ifface:8#pass9show=cv2.resize(self.image,(1536,863))10show=cv2.cvtColor(show,cv2.COLOR_BGR2RGB)11print(show.shape[1],show.shape[0])12#show.shape[1]=640,show.shape[0]=48013showImage=QtGui.QImage(show.data,show.shape[1],show.shape[0],QtGui.QImage.Format_RGB888)14self.label_show_camera.setPixmap(QtGui.QPixmap.fromImage(showImage))15#cv2.setMouseCallback(showImage,mouse_click)16#self.x+=117#self.label_move.move(self.x,100)18#ifself.x==320:19#self.label_show_camera.raise_()20defcloseEvent(self,event):21ok=QtWidgets.QPushButton()22cacel=QtWidgets.QPushButton()23msg=QtWidgets.QMessageBox(QtWidgets.QMessageBox.Warning,u"关闭",u"是否关闭!")24msg.addButton(ok,QtWidgets.QMessageBox.ActionRole)25msg.addButton(cacel,QtWidgets.QMessageBox.RejectRole)26ok.setText(u'确定')27cacel.setText(u'取消')28#msg.setDetailedText('sdfsdff')29ifmsg.exec_()==QtWidgets.QMessageBox.RejectRole:30event.ignore()31else:32#self.socket_client.send_command(self.socket_client.current_user_command)33ifself.cap.isOpened():34self.cap.release()35ifself.timer_camera.isActive():36self.timer_camera.stop()37event.accept()

完整代码下载链接:/s/1r_ZAfWQG-xYGmYlZCDmWTQ,提取码:lnp4

作者简介:李秋键,CSDN博客专家,CSDN达人课作者。硕士在读于中国矿业大学,开发有taptap竞赛获奖等。

在第 111 个女神节到来之际,CSDN 向所有技术女神致敬!并特邀产学研界的技术女神代表,共同探讨女性开发者的职业发展机遇与挑战,助力更多程序媛谱写精彩的程序人生。

☞腾讯回应两块八卖《鬼谷八荒》:已下架并退款;iMac Pro 售完即停产;iCloud 识别姓氏闹乌龙 | 极客头条☞腾讯:这可是一只“骨骼清奇”的狗☞《互联网人求职图鉴》:这类人才“最吃香”,最高薪编程语言出炉!☞Google 重磅发布 Flutter 2 !一套代码横扫 5 大系统

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。