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
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()
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