导航菜单
首页 >  Python手把手实现远程控制桌面  > Python 手把手实现远程控制桌面

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

4importcv2

5importnumpy asnp

6fromPIL importImageGrab

7frompynput.mouse importButton,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地址,注意应该是服务器的公网ip

4host='服务器的公网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]

18while True:

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)

30if sendmsg=='quit':

31break

32#结束时关闭客户端

33client.close

1.3 服务端讲解

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

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

1#服务器端

2importsocket

3importthreading

4importnumpy asnp

5importcv2

6importos

(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.shape

10img_decode=img_decode

11temp=img_decode

12except:

13img_decode=temp

14pass

15cv2.imshow( 'SERVER', img_decode)

16cv2.setMouseCallback( "SERVER", mouse_click)

17try:

18f=open( "1.txt")

19txt=f.read

20f.close

21reply=txt

22print(reply)

23clientsocket.send(reply.encode( 'utf-8'))

24os.remove( "1.txt")

25except:

26pass

27ifcv2.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.QtWidgets import*

2fromPyQt5.QtCore import*

3fromPyQt5.QtGui importQPalette, QBrush, QPixmap

4importos

5importsocket

6importthreading

7importcv2

8importnumpy asnp

9fromPIL importImageGrab

10frompynput.mouse importButton,Controller

11importtime

(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 = 0

7self.set_ui

8self.slot_init

9self.__flag_work = 0

10self.x = 0

11self.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]

9fori inrange( 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:2px 4px}")

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)获取鼠标点击时的坐标:

1def mousePressEvent(self, event):

2ifevent.buttons & QtCore.Qt.LeftButton:

3x = event.x -120

4y = event.y -10

5text= "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 = imm

6# face = self.face_detect.align(self.image)

7# if face:

8# pass

9show =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] = 480

13showImage = 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 += 1

17# self.label_move.move(self.x,100)

18# if self.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

完整代码下载

相关推荐: