Python 手把手實現遠程控制桌面

2021-12-25 CSDN

本項目旨在讓大家理解遠控軟體的原理,通過遠控桌面可以實現遠程控制我們的電腦,更好更方便的管理電腦。文末將給出初始版的完整代碼,需要使用到的其他工具也會有所說明。最終實現的效果就是只要用戶點擊了客戶端的程序運行,我們就可以在服務端對其進行控制。效果如下:左邊是客服端程序運行了,然後我們就可以在左邊的另一臺電腦上打開服務端程序進行控制,可以看到左邊的屏幕圖像也已經顯示在了右邊的電腦上。完整代碼見文末!

本次環境使用的是python3.6.5+windows平臺主要用的庫有:圖像處理庫opencv,包括用來目標檢測和圖像處理等操作。Numpy模塊用來輔助opencv對圖像進行一些像素值操作;pynput.mouse用來控制滑鼠點擊事件。達到遠程控制滑鼠的作用。客戶端在這裡指的是被控制的電腦,就是我們需要受到控制的電腦。

1#客戶端代碼
2import socket
3import threading
4import cv2
5import numpy as np
6from PIL import ImageGrab
7from pynput.mouse import Button,Controller

(2)接著創建一個滑鼠控制器和用來接收服務端數據的函數。因為需要一直都接收數據,故需要嵌入循環。在這裡客戶端還需要接收數據的原因是,用來接收服務端傳來的滑鼠控制信息,要不然怎麼實現滑鼠控制桌面的效果呢。

1#接受伺服器返回的數據的函數
2m = Controller()
3def recvlink(client):
4    while True:
5        msg=client.recv(1024)
6        msg=msg.decode('utf-8')
7        print(msg)
8        key = msg.split(",")
9        xp = int(key[0])
10        yp = int(key[1])
11        m.position = ((xp,yp))
12        m.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:
19    im = ImageGrab.grab()
20    imm=cv2.cvtColor(np.array(im), cv2.COLOR_RGB2BGR)#轉為opencv的BGR格式
21    imm = cv2.resize(imm, (1535, 863))
22    img_encode = cv2.imencode(".jpg", imm, encode_param)[1]
23    data_encode = np.array(img_encode)
24    str_encode = data_encode.tostring()
25    #print(len(str_encode))
26    #輸入要發送的信息
27    sendmsg="kehu"
28    #向伺服器發送消息
29    client.send(str_encode)
30    if sendmsg=='quit':
31        break
32#結束時關閉客戶端
33client.close()

服務端指的是用來控制遠程電腦的那一端,為了方便使用,我們直接在伺服器上使用即可。

1#伺服器端
2import socket
3import threading
4import numpy as np
5import cv2
6import os

(2)創建滑鼠點擊事件函數,用來獲取滑鼠點擊的位置坐標:

1print("等待連接---")
2def mouse_click(event, x, y, flags, para):
3    if event == cv2.EVENT_LBUTTONDOWN:  # 左邊滑鼠點擊
4        f=open("1.txt","w")
5        f.write(str(x)+","+str(y))
6        f.close()

(3)創建伺服器端接收數據函數,用來實時接收傳輸過來的圖像數據並顯示:

1def recv_msg(clientsocket):
2    while True:
3        # 接受客戶端消息,設置一次最多接受10240位元組的數據
4        recv_msg = clientsocket.recv(102400)
5        # 把接收到的東西解碼
6        msg = np.fromstring(recv_msg, np.uint8)
7        img_decode = cv2.imdecode(msg, cv2.IMREAD_COLOR)
8        try:
9            s=img_decode.shape
10            img_decode=img_decode
11            temp=img_decode
12        except:
13            img_decode=temp
14            pass
15        cv2.imshow('SERVER', img_decode)
16        cv2.setMouseCallback("SERVER", mouse_click)
17        try:
18            f=open("1.txt")
19            txt=f.read()
20            f.close()
21            reply=txt
22            print(reply)
23            clientsocket.send(reply.encode('utf-8'))
24            os.remove("1.txt")
25        except:
26            pass
27        if cv2.waitKey(1) & 0xFF == ord('q'):
28            break

1def main():
2    socket_server=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
3    host='伺服器的本地ip'
4    #設置被監聽的埠號,小於1024的埠號不能使用
5    port=設置的埠
6    socket_server.bind((host,port))
7    #設置最大監聽數,也就是最多可以同時響應幾個客戶端請求,一般配合多線程使用
8    socket_server.listen(5)
9    #等待客戶端連接,一旦有了連接就立刻向下執行,否則等待
10    #accept()函數會返回一個元組,第一個元素是客戶端socket對象,第二個元素是客戶端地址(ip地址+埠號)
11    clientsocket,addr=socket_server.accept()
12    # 有了客戶端連接後之後才能執行以下代碼,我們先向客戶端發送連接成功消息
13    clientsocket.send('連接成功'.encode('utf-8'))
14    # 和客戶端一樣開啟一個線程接受客戶端的信息
15    t=threading.Thread(target=recv_msg,args=(clientsocket,))
16    t.start()

遠控桌面GUI主要是為了美觀而用,需要大家根據遠程代碼進行集合修改。當然單獨使用上述代碼已經可以實現功能了,只是不夠美觀。由於考慮到此處代碼量較大,且不是重點,故粗略講解

1from PyQt5.QtWidgets import *
2from PyQt5.QtCore import *
3from PyQt5.QtGui import QPalette, QBrush, QPixmap
4import os
5import socket
6import threading
7import cv2
8import numpy as np
9from PIL import ImageGrab
10from pynput.mouse import Button,Controller
11import time

1m = Controller()
2def mouse_click(event, x, y, flags, para):
3    if event == cv2.EVENT_LBUTTONDOWN:  # 左邊滑鼠點擊
4        print( x, y)
5        m.position = (x, y)
6        time.sleep(0.1)
7        m.click(Button.left, 1)

(3)GUI界面初始化,由於我們需要把實時的視頻顯示在窗口上,故也需要使用到opencv。

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

(4)設置窗口大小和控制項位置等信息。創建布局和設置名稱

1def set_ui(self):
2    self.__layout_main = QtWidgets.QHBoxLayout()
3    self.__layout_fun_button = QtWidgets.QVBoxLayout()
4    self.__layout_data_show = QtWidgets.QVBoxLayout()
5    self.button_open_camera = QtWidgets.QPushButton(u'遠程桌面')
6    self.button_close = QtWidgets.QPushButton(u'退出')
7    # Button 的顏色修改
8    button_color = [self.button_open_camera, self.button_close]
9    for i in range(2):
10        button_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}")
16    self.button_open_camera.setMinimumHeight(50)
17    self.button_close.setMinimumHeight(50)
18    # move()方法移動窗口在屏幕上的位置到x = 300,y = 300坐標。
19    self.move(500, 500)
20    # 信息顯示
21    self.label_show_camera = QtWidgets.QLabel()
22    self.label_move = QtWidgets.QLabel()
23    self.label_move.setFixedSize(100, 100)
24    self.label_show_camera.setFixedSize(1530,863)
25    self.label_show_camera.setAutoFillBackground(False)
26    self.__layout_fun_button.addWidget(self.button_open_camera)
27    self.__layout_fun_button.addWidget(self.button_close)
28    self.__layout_fun_button.addWidget(self.label_move)
29    self.__layout_main.addLayout(self.__layout_fun_button)
30    self.__layout_main.addWidget(self.label_show_camera)
31    self.setLayout(self.__layout_main)
32    self.label_move.raise_()
33    self.setWindowTitle(u'遠控桌面GUI')
34    '''
35    # 設置背景圖片
36    palette1 = QPalette()
37    palette1.setBrush(self.backgroundRole(), QBrush(QPixmap('background.jpg')))
38    self.setPalette(palette1)
39    '''

1def mousePressEvent(self,event):
2    if event.buttons() & QtCore.Qt.LeftButton:
3        x = event.x()-120
4        y = event.y()-10
5        text = "x: {0},y: {1}".format(x,y)
6        if x>=0 and y>=0:
7            m.position = (x, y)
8            time.sleep(0.1)
9            m.click(Button.left, 1)
10        print(text)

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

(7)顯示桌面功能函數,並設置點擊時修改名稱,可以隨時關閉桌面

1def button_open_camera_click(self):
2    if self.timer_camera.isActive() == False:
3        self.timer_camera.start(30)
4        self.button_open_camera.setText(u'關閉')
5    else:
6        self.timer_camera.stop()
7        self.cap.release()
8        self.label_show_camera.clear()
9        self.button_open_camera.setText(u'遠程桌面')

1def show_camera(self):
2    im = ImageGrab.grab()
3    imm = cv2.cvtColor(np.array(im), cv2.COLOR_RGB2BGR)  # 轉為opencv的BGR格式
4    #imm = cv2.resize(imm, (1535, 863))
5    self.image = imm
6    # face = self.face_detect.align(self.image)
7    # if face:
8    #     pass
9    show =cv2.resize(self.image, (1536,863))
10    show = cv2.cvtColor(show, cv2.COLOR_BGR2RGB)
11    print(show.shape[1], show.shape[0])
12    # show.shape[1] = 640, show.shape[0] = 480
13    showImage = QtGui.QImage(show.data, show.shape[1], show.shape[0], QtGui.QImage.Format_RGB888)
14    self.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_()
20def closeEvent(self, event):
21    ok = QtWidgets.QPushButton()
22    cacel = QtWidgets.QPushButton()
23    msg = QtWidgets.QMessageBox(QtWidgets.QMessageBox.Warning, u"關閉", u"是否關閉!")
24    msg.addButton(ok, QtWidgets.QMessageBox.ActionRole)
25    msg.addButton(cacel, QtWidgets.QMessageBox.RejectRole)
26    ok.setText(u'確定')
27    cacel.setText(u'取消')
28    # msg.setDetailedText('sdfsdff')
29    if msg.exec_() == QtWidgets.QMessageBox.RejectRole:
30        event.ignore()
31    else:
32        #             self.socket_client.send_command(self.socket_client.current_user_command)
33        if self.cap.isOpened():
34            self.cap.release()
35        if self.timer_camera.isActive():
36            self.timer_camera.stop()
37        event.accept()

完整代碼下載連結:https://pan.baidu.com/s/1r_ZAfWQG-xYGmYlZCDmWTQ,提取碼:lnp4作者簡介:李秋鍵,CSDN博客專家,CSDN達人課作者。碩士在讀於中國礦業大學,開發有taptap競賽獲獎等。在第 111 個女神節到來之際,CSDN 向所有技術女神致敬!並特邀產學研界的技術女神代表,共同探討女性開發者的職業發展機遇與挑戰,助力更多程序媛譜寫精彩的程序人生。

☞騰訊回應兩塊八賣《鬼谷八荒》:已下架並退款;iMac Pro 售完即停產;iCloud 識別姓氏鬧烏龍 | 極客頭條

☞騰訊:這可是一隻「骨骼清奇」的狗

☞《網際網路人求職圖鑑》:這類人才「最吃香」,最高薪程式語言出爐!

☞Google 重磅發布 Flutter 2 !一套代碼橫掃 5 大系統

相關焦點

  • Microsoft遠程桌面
    在同一個區域網內用手機遠程連接電腦,可以用Microsoft遠程桌面,也是比較方便的。
  • AnyDesk手機遠程連接控制電腦
    AnyDesk是安卓系統上的終極遠程訪問應用程式-為您提供真正的移動解決方案,通過安卓設備實現遠程桌面連接和控制。並且免費供私人使用!在任何環境中享受無縫連接。您既可以與辦公室的設備建立遠程桌面連接,也可以使用AnyDesk實現對客戶的外部支持。無論您身在何處,隨時隨地連接!選擇AnyDesk,您可以享受無與倫比的性能,可靠的安全性和穩定的連接。
  • 如何遠程控制別人的電腦【圖解】
    有的時候我們為了更好的,更直觀的去幫助別人去解決電腦中的一些問題的話,可能會想到遠程控制的這個方法,遠程控制可以非常方便的操作別人的電腦,從而幫助別人解決一些問題。那麼如何遠程控制別人的電腦是大家比較關注的一個話題。接下來,小編就具體為大家介紹一下 遠程控制 具體的操作方法,也希望可以幫助大家解決問題。
  • 電腦怎麼遠程控制
    然後檢查「允許遠程協助連接到此計算機」和「允許任何版本的遠程桌面的遠程電腦程式」。 轉到「控制面板」->「用戶帳戶和家庭安全」->「用戶帳戶」,然後單擊「為您的帳戶創建密碼」按鈕。
  • Python系列之——手把手教你玩Pycharm
    點擊上方「小小詹同學」,選擇「置頂公眾號」資源乾貨第一時間送達!
  • 受夠了Teamview,那就換這幾款遠程桌面軟體吧
    受夠了Teamview,那就換這幾款遠程桌面軟體吧提到「遠程桌面控制」,Teamviewer一直是大家心中的王者。但是,近兩年來Teamviewer「割韭菜」的行為實在惹了眾怒:個人用戶判定為疑似商業用途,連著連著就斷了,廣告付費彈窗頻繁彈出付費,甚至,即便是付費用戶,也經常死機連不上。王者的地位,瞬間跌成了青銅。
  • 【藏經閣】iOS多機遠程控制技術
    然而,相對於Android的開源,iOS相關技術一直很封閉,可利用的技術資源匱乏,暫無有效iOS多機遠程控制技術。已有的iOS遠程控制技術要麼受限於單機或者要麼視頻不流暢,本文解決已知問題,提出一種iOS多機遠程控制解決思路,實現多機遠程控制技術。要實現遠程控制,需要解決兩個事情,一個是如何能驅動手機完成一系列點擊、滑動、長按、輸入text操作;另一個是如何遠程看到手機屏幕的畫面。
  • 遠程控制的插線板?這是什麼新奇產品?
    向日葵遠程控制軟體是一款免費的集遠程控制電腦手機、遠程桌面連接、遠程開機、遠程管理、支持內網穿透的一體化遠程控制管理工具軟體。那麼向日葵將自家的遠程控制技術融入到硬體產品中並且提供了3個USB充電,在生活中會有什麼樣的變化呢?
  • NoMachine 7是對遠程桌面工具的重大更新
    劍客網12月22日訊據外媒報導 越來越多的人被迫遠程工作,但這是一種越來越普遍的工作習慣,無論是否存在大流行。但是,找到提供所需功能的遠程訪問工具可能很困難,尤其是在跨多個平臺工作時。
  • 當整個桌面都被搬上雲端,遠程辦公還有何難!
    然而受制於各種現實情況,很多人暫時無法回到工作崗位,目前只能以「遠程」方式開始自己的工作。於是各類主打遠程辦公和會議的服務開始頻繁露臉。藉助這樣的解決方案,企業可以通過 Azure 雲平臺為遍布各地的員工提供具備「統一配置、統一發布、統一管理、權限管控、數據安全、響應業務多樣性」等特性的辦公環境,而員工可以使用各種終端設備(筆記本電腦、臺式機、智慧型手機、平板),通過網際網路或 VPN 連接至和用戶身份及權限綁定的一個或多個雲桌面及應用系統,進而高效快捷地實現遠程辦公。
  • TeamViewer手機遠程控制電腦——高效達人必備神器
    日常工作中,有時我們外出不便,而又需要一臺電腦來處理問題,這時我們就可以通過手機遠程控制電腦來解決問題。TeamViewer作為全球領先的電腦遠程辦公軟體,專注於為用戶提供高效、安全、定製化的SaaS解決方案,搭建信息共享的實用工具平臺。
  • 十分鐘視頻,手把手教你用Python撒情人節狗糧的正確姿勢
    大數據文摘作品 轉載具體要求見文末作者 | 寒小陽 視頻後期 | 崔雲柯是的,你們沒有猜錯,這是一期撒狗糧的手把手教學文章
  • 無需公網 IP 遠程控制電腦和群暉 NAS!簡單免費內網穿透工具 - 網雲穿
    很多人都想隨時隨地能輕鬆遠程訪問家裡的 NAS (私人網盤/共享文件),或連接電腦遠程桌面控制
  • 如何在python語言代碼實現間隔加減法
    >pythondjango在使用python語言時,除了可以實現常規的功能之外,還可以用於數學計算。有這麼一個場景:0到100範圍,當是偶數時,就相加;若為奇數,就相減0-1+2-3+4-5+6-7+8-9+10……+98-99+100下面利用實例實現這個場景:操作步驟:1、打開Visual Studio工具,新建
  • 教程 | 用微信遠程控制你的電腦,這個工具又加了一些小功能(硬體+軟體)
    遠程控制電腦,能用的軟體也比較多,比如向日葵、TeamViewer等,這些軟體都可以讓你用手機等設備,遠程控制你的電腦。不過小編之前也寫過一篇文章,介紹了一個用微信就能遠程控制電腦的方法。文章傳送門:遠程管理控制你的電腦,這款微信小程序輕鬆搞定HiPC是小編在公眾號推薦的一個第三方Windows官改「專注於win7」的作者團隊(吻妻)開發的一款小程序。
  • 手把手教你搭建3款遠程開發環境:Pycharm、Jupyter notebook以及code-server!
    1$ jupyter lab --generate-config第三步,進行加密執行下面的Python命令生成加密過密碼串,1$ python -c "from notebook.auth import passwd; print(passwd())"2Enter password
  • python:控制流程 - for迭代循環
    #pythoncontinue 是跳出當前循環,進入下一次循環; 3. else 是只有在正常迭代結束時運行else,即不是被break終止的情況編制by偉森leung 喜歡本文章的可以請關注偉森leung,後續有更多python方面的知識分享。
  • 武漢灝存科技有限公司創始人熊鵬航:一個手勢實現遠程控制
    總結教訓創業再出發在創立灝存科技前,熊鵬航先後就職於雷諾集團和東風雷諾信息技術部,他利用下班和周末的私人時間,和幾個小夥伴們進行語音控制、手勢識別等人工智慧領域的開發。他認為,在全球人工智慧的發展過程中,體感識別或者說機器觸覺領域的發展相對於機器人大腦(AI晶片),機器人聽覺,機器視覺這些領域發展要滯後很多,這也就意味著市場開發機會更多。
  • 手機控制手機、手機控制電腦、電腦控制手機就這麼簡單
    關注我你就是個網絡、電腦、手機小達人 很多用戶在下班後到家才發現公司電腦沒關,出門了才發現家裡電腦沒關,臨時需要家裡電腦上的文件,那麼這個時候就需要手機控制電腦了,下面就跟大家分享一下我自己在用的遠程軟體。手機控制電腦的軟體您選哪個?
  • Win10系統如何在區域網內遠程另外一臺電腦?
    前幾天,小澤寫了兩臺電腦如何直接用一根網線傳數據的文章,有朋友在評論區指出,區域網內遠程另一臺也可以達到這個效果,小澤始終堅持切實為粉絲解決問題的原則,所以今天給大家帶來Win10系統如何在區域網內遠程另外一臺電腦的操作!走起!