70 lines
2.8 KiB
Python
70 lines
2.8 KiB
Python
#!/usr/bin/env python3
|
||
# -*- coding: utf-8 -*-
|
||
"""
|
||
Вспомогательный скрипт для подбора координат для config.json.
|
||
Запустите его, затем наведите мышь на нужный элемент в окне мессенджера
|
||
и нажмите клавишу — в консоль выведется позиция мыши.
|
||
Для координат ОТНОСИТЕЛЬНО окна: сначала активируйте окно мессенджера,
|
||
запустите скрипт и кликайте по элементам — скрипт покажет и экранные координаты,
|
||
и координаты относительно активного окна (если доступно).
|
||
"""
|
||
|
||
import sys
|
||
import time
|
||
import platform
|
||
from pathlib import Path
|
||
|
||
def get_cursor_pos():
|
||
import pyautogui
|
||
return pyautogui.position()
|
||
|
||
def get_active_window_rect():
|
||
"""Позиция активного окна (Windows: через pygetwindow, Linux: wmctrl)."""
|
||
if platform.system() == "Windows":
|
||
try:
|
||
import pygetwindow as gw
|
||
w = gw.getActiveWindow()
|
||
if w:
|
||
return (w.left, w.top, w.width, w.height)
|
||
except Exception:
|
||
pass
|
||
return None
|
||
try:
|
||
import subprocess
|
||
out = subprocess.run(["xdotool", "getactivewindow", "getwindowgeometry"], capture_output=True, text=True, timeout=2)
|
||
if out.returncode != 0:
|
||
return None
|
||
# Parse "Position: 100,200 (screen: 0)\nDimensions: 400x300"
|
||
pos = dim = None
|
||
for line in out.stdout.strip().splitlines():
|
||
if line.startswith("Position:"):
|
||
part = line.split("(", 1)[0].replace("Position:", "").strip()
|
||
a, b = part.split(",")
|
||
pos = (int(a.strip()), int(b.strip()))
|
||
elif line.startswith("Dimensions:"):
|
||
part = line.split(":", 1)[1].strip()
|
||
w, h = part.split("x")
|
||
dim = (int(w), int(h))
|
||
if pos and dim:
|
||
return (pos[0], pos[1], dim[0], dim[1])
|
||
except Exception:
|
||
pass
|
||
return None
|
||
|
||
|
||
if __name__ == "__main__":
|
||
print("Координаты обновляются в реальном времени. Остановка: Ctrl+C")
|
||
try:
|
||
while True:
|
||
time.sleep(0.2)
|
||
x, y = get_cursor_pos()
|
||
rect = get_active_window_rect()
|
||
if rect:
|
||
rel_x = x - rect[0]
|
||
rel_y = y - rect[1]
|
||
print(f"\rЭкран: ({x}, {y}) | Относительно окна: ({rel_x}, {rel_y}) ", end="", flush=True)
|
||
else:
|
||
print(f"\rЭкран: ({x}, {y}) ", end="", flush=True)
|
||
except KeyboardInterrupt:
|
||
print("\nГотово.")
|