-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathBindMacros.py
239 lines (208 loc) · 10.2 KB
/
BindMacros.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
import keyboard
import time
import json
import os
import threading
# Подсказка для пользователя
HELP_TEXT = """
Поддерживаемые клавиши:
- Буквы и цифры (например, w, q, 1)
- Специальные клавиши: (alt), (-alt), (space), (esc), (tab), (caps), (shift), (ctrl), (win)
- Для помощи введите: _help
Примеры использования:
- wwqr(alt)d(-alt)
- (space)(shift)a
"""
# Функция для синхронизации с английской раскладкой
def sync_with_english_layout(key):
# Маппинг клавиш с русской на английскую раскладку
ru_to_en = {
"й": "q", "ц": "w", "у": "e", "к": "r", "е": "t", "н": "y", "г": "u", "ш": "i", "щ": "o", "з": "p",
"х": "[", "ъ": "]", "ф": "a", "ы": "s", "в": "d", "а": "f", "п": "g", "р": "h", "о": "j", "л": "k",
"д": "l", "ж": ";", "э": "'", "я": "z", "ч": "x", "с": "c", "м": "v", "и": "b", "т": "n", "ь": "m",
"б": ",", "ю": ".", ".": "/", ",": "`"
}
# Если клавиша русская, преобразуем её
return ru_to_en.get(key, key)
# Функция для создания новой последовательности
def create_sequence():
sequence = {}
print("Создание новой последовательности.")
print(HELP_TEXT)
while True:
trigger_key = input("Введите клавишу, которая будет запускать макрос (или 'done' для завершения): ")
trigger_key = sync_with_english_layout(trigger_key) # Синхронизация с английской раскладкой
if trigger_key.lower() == 'done':
break
actions = []
print(f"Создание макроса для клавиши '{trigger_key}'. Введите последовательность действий:")
while True:
keys = input("Клавиши (или 'done' для завершения макроса): ")
keys = sync_with_english_layout(keys) # Синхронизация с английской раскладкой
if keys.lower() == 'done':
break
elif keys.lower() == '_help':
print(HELP_TEXT)
continue
delay = float(input(f"Задержка перед нажатием клавиш '{keys}' (в секундах): "))
actions.append({"key": keys, "delay": delay})
sequence[trigger_key] = actions
print(f"Макрос для клавиши '{trigger_key}' добавлен.")
return sequence
# Функция для выполнения макроса
def execute_macro(sequence, trigger_key, stop_key):
global stop_macro
if trigger_key in sequence:
stop_macro = False # Сброс флага остановки
for action in sequence[trigger_key]:
# Проверяем, если задана клавиша остановки
if stop_macro:
print(f"Макрос остановлен, так как была нажата клавиша '{stop_key}'.")
break # Прерываем выполнение макроса
time.sleep(action["delay"])
keys = parse_keys(action["key"])
for key in keys:
keyboard.press_and_release(key)
else:
print(f"Макрос для клавиши '{trigger_key}' не найден.")
# Функция для разбора строки с клавишами
def parse_keys(keys):
parsed_keys = []
buffer = ""
special_key = False
for char in keys:
if char == '(':
if buffer:
parsed_keys.append(buffer)
buffer = ""
special_key = True
buffer += char
elif char == ')':
buffer += char
if special_key:
parsed_keys.append(buffer)
buffer = ""
special_key = False
else:
if special_key:
buffer += char
else:
parsed_keys.append(char)
if buffer:
parsed_keys.append(buffer)
# Преобразование специальных ключей
for i, key in enumerate(parsed_keys):
if key == "(alt)":
keyboard.press("alt")
elif key == "(-alt)":
keyboard.release("alt")
elif key == "(space)":
parsed_keys[i] = "space"
elif key == "(esc)":
parsed_keys[i] = "esc"
elif key == "(tab)":
parsed_keys[i] = "tab"
elif key == "(caps)":
parsed_keys[i] = "caps lock"
elif key == "(shift)":
keyboard.press("shift")
elif key == "(-shift)":
keyboard.release("shift")
elif key == "(ctrl)":
keyboard.press("ctrl")
elif key == "(-ctrl)":
keyboard.release("ctrl")
elif key == "(win)":
keyboard.press("windows")
elif key == "(-win)":
keyboard.release("windows")
elif key.startswith("(") and key.endswith(")"):
print(f"Неизвестная специальная клавиша: {key}")
return [key for key in parsed_keys if not key.startswith("(")]
# Функция для сохранения последовательности
def save_sequence(sequence, name):
with open(f"{name}.json", "w") as f:
json.dump(sequence, f)
print(f"Последовательность '{name}' сохранена.")
# Функция для загрузки последовательности
def load_sequence(name):
with open(f"{name}.json", "r") as f:
return json.load(f)
# Функция для получения списка всех сохранённых последовательностей
def get_saved_sequences():
return [f.replace(".json", "") for f in os.listdir() if f.endswith(".json")]
# Функция для выполнения макроса в отдельном потоке
def start_macro_thread(sequence, trigger_key, stop_key):
macro_thread = threading.Thread(target=execute_macro, args=(sequence, trigger_key, stop_key))
macro_thread.start()
# Функция для проверки нажатых клавиш
def check_pressed_key():
print("Нажимайте клавиши для проверки. Для выхода нажмите 'q'.")
while True:
event = keyboard.read_event()
if event.event_type == keyboard.KEY_DOWN:
pressed_key = event.name
english_key = sync_with_english_layout(pressed_key)
if english_key == 'q':
print("Выход из режима проверки клавиш.")
break
else:
print(f"Нажата клавиша: {english_key}")
# Главное меню программы
def main():
global stop_macro
while True:
print("\n1. Создать новый макрос")
print("2. Запустить макрос")
print("3. Проверить нажатие клавиш")
print("4. Выход")
choice = input("Выберите действие: ")
if choice == '1':
name = input("Введите имя нового макроса: ")
sequence = create_sequence()
save_sequence(sequence, name)
elif choice == '2':
sequences = get_saved_sequences()
if not sequences:
print("Нет доступных макросов!")
continue
print("Доступные макросы:")
for i, seq_name in enumerate(sequences, start=1):
print(f"{i}. {seq_name}")
seq_choice = int(input("Введите номер макроса для запуска: ")) - 1
if 0 <= seq_choice < len(sequences):
sequence_name = sequences[seq_choice]
sequence = load_sequence(sequence_name)
print(f"Запуск макроса '{sequence_name}'.")
# Настройка клавиши остановки
set_stop_key = input("Хотите установить клавишу для остановки макроса? (yes/no): ").lower()
if set_stop_key == 'yes':
print(f"Выберите кнопку нажав на нее")
time.sleep(1)
event = keyboard.read_event()
pressed_key = event.name
stop_key = sync_with_english_layout(pressed_key)
else:
stop_key = None # Клавиша остановки не задается
if stop_key:
print(f"Клавиша для остановки макроса: '{stop_key}'.")
else:
print("Клавиша для остановки макроса не задана.")
# Ожидание и выполнение макросов до прерывания
while True:
if stop_key and keyboard.is_pressed(stop_key):
stop_macro = True
event = keyboard.read_event()
if event.event_type == keyboard.KEY_DOWN:
trigger_key = event.name
trigger_key = sync_with_english_layout(trigger_key) # Синхронизация с английской раскладкой
if trigger_key in sequence:
start_macro_thread(sequence, trigger_key, stop_key)
elif choice == '3':
check_pressed_key()
elif choice == '4':
break
else:
print("Неверный выбор, попробуйте снова.")
if __name__ == "__main__":
main()