コード例 #1
0
ファイル: gui.py プロジェクト: Aarrtteemm123/remote-control
    def start(self):
        while True:
            event, values = self.__window.read(timeout=10)
            if event == sg.WIN_CLOSED or event == '-EXIT-':
                if Global.is_server_running:
                    requests.get(f'http://{Global.ip}:{Global.port}/shutdown')
                break

            elif event == '-SHARE-':
                Global.role = 'share'

            elif event == '-CONTROL-':
                Global.role = 'control'

            elif event == '-START-':
                self.__window.hide()
                if Global.role == 'share':
                    threading.Thread(target=make_screenshots,
                                     args=('screenshot.jpg', Global.quality,
                                           Global.region)).start()

                    while not keyboard.is_pressed('Esc'):
                        keyboard.play(Global.keyboard_events)
                        Global.keyboard_events.clear()
                        for event in Global.mouse_events:
                            if event['event_name'] == 'click' and event[
                                    'pressed'] == True and event[
                                        'button'] == 'left':
                                Mouse.press_left()
                            elif event['event_name'] == 'click' and event[
                                    'pressed'] == True and event[
                                        'button'] == 'right':
                                Mouse.press_right()
                            elif event['event_name'] == 'click' and event[
                                    'pressed'] == False and event[
                                        'button'] == 'left':
                                Mouse.release_left()
                            elif event['event_name'] == 'click' and event[
                                    'pressed'] == False and event[
                                        'button'] == 'right':
                                Mouse.release_right()
                            elif event['event_name'] == 'scroll':
                                Mouse.scroll(10 * event['dx'],
                                             10 * event['dy'])
                            elif event['event_name'] == 'move':
                                Mouse.move_to(event['x'], event['y'])
                        Global.mouse_events.clear()

                elif Global.role == 'control':
                    KeyboardListener().start_listen()
                    MouseListener().start_listen()
                    cv2.namedWindow('Window')
                    screensize = pyautogui.size()
                    x, y, w, h = cv2.getWindowImageRect('Window')
                    cv2.moveWindow('Window', screensize.width // 2 - w // 2,
                                   screensize.height // 2 - h // 2)
                    ImageFile.LOAD_TRUNCATED_IMAGES = True

                    while cv2.getWindowProperty('Window', 1) > 0:
                        keyboard_events, mouse_events = Global.keyboard_events, Global.mouse_events
                        Global.keyboard_events = []
                        Global.mouse_events = []
                        res = requests.get(
                            f'http://{Global.ip}:{Global.port}/data',
                            data={
                                'mouse_events': json.dumps(mouse_events),
                                'keyboard_events': json.dumps(keyboard_events)
                            })

                        if res.content:
                            stream = io.BytesIO(res.content)
                            frame = Image.open(stream).convert("RGBA")
                            stream.close()
                            frame = numpy.array(frame)
                            frame = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)
                            cv2.imshow('Window', frame)
                            if not cv2.waitKey(1):
                                break

                self.__window.un_hide()

            elif event == '-APPLY-':
                Global.ip = values['ip']
                Global.port = int(values['port'])
                Global.region = (values['-X-'], values['-Y-'],
                                 values['-WIDTH-'], values['-HEIGHT-'])
                Global.quality = values['-QUALITY-']
                try:
                    if Global.role == 'share':
                        run_server(Global.ip, Global.port)
                except Exception as e:
                    ctypes.windll.user32.MessageBoxA(None,
                                                     bytes(str(e), 'utf-8'),
                                                     b"Error", 0x30 | 0x0)
                self.__window['-TEST-CONNECT-'].update(disabled=False)
                self.__window['-APPLY-'].update(disabled=True)
                self.__window['-SHARE-'].update(disabled=True)
                self.__window['-CONTROL-'].update(disabled=True)
                self.__window['-X-'].update(disabled=True)
                self.__window['-Y-'].update(disabled=True)
                self.__window['-WIDTH-'].update(disabled=True)
                self.__window['-HEIGHT-'].update(disabled=True)
                self.__window['-START-'].update(disabled=False)

            elif event == '-TEST-CONNECT-':
                start = time.time()
                try:
                    requests.get(f'http://{Global.ip}:{Global.port}/ping')
                except Exception as e:
                    ctypes.windll.user32.MessageBoxA(None,
                                                     bytes(str(e), 'utf-8'),
                                                     b"Error", 0x30 | 0x0)
                ping_ms = round((time.time() - start) * 1000, 1)
                ctypes.windll.user32.MessageBoxA(
                    None, bytes(f"Ping: {ping_ms} ms", 'utf-8'), b"Info",
                    0x40 | 0x0)

        self.__window.close()