diff --git a/.gitignore b/.gitignore index 4ca7dd5..504b18b 100644 --- a/.gitignore +++ b/.gitignore @@ -60,5 +60,4 @@ memory/* restore_commit.txt sche_tasks/ -model_responses.sync-conflict-* QUICK_START.md diff --git a/memory/ljqCtrl.py b/memory/ljqCtrl.py index 7562681..ab1db6d 100644 --- a/memory/ljqCtrl.py +++ b/memory/ljqCtrl.py @@ -1,4 +1,3 @@ -# coding=utf-8 """ CRITICAL: 严禁在此工具链中 import pyautogui (会污染 win32api 导致逻辑冲突)。 ljqCtrl Quick Reference: @@ -10,25 +9,33 @@ ljqCtrl Quick Reference: - MouseDClick(staytime=0.05), MouseClick(staytime=0.05) """ -import os, sys, time, random, math -import win32api, win32con +import os, sys, time, random, math, win32api, win32con import numpy as np dpi_scale = 1 - try: from PIL import ImageGrab, Image, ImageEnhance, ImageFilter, ImageDraw import cv2 except: pass -scr = ImageGrab.grab() -swidth, sheight = scr.size -print('Screen width & height:', swidth, sheight) -cwidth, cheight = map(win32api.GetSystemMetrics, [win32con.SM_CXSCREEN, win32con.SM_CYSCREEN]) -dpi_scale = cwidth / swidth -print('dpi_scale:', dpi_scale) - -time.process_time() +try: + scr = ImageGrab.grab() + swidth, sheight = scr.size + print('Screen width & height:', swidth, sheight) + cwidth, cheight = map(win32api.GetSystemMetrics, [win32con.SM_CXSCREEN, win32con.SM_CYSCREEN]) + dpi_scale = cwidth / swidth + print('dpi_scale:', dpi_scale) +except: + import ctypes + user32 = ctypes.windll.user32 + user32.SetProcessDPIAware() # 确保 DPI 感知 + cwidth = user32.GetSystemMetrics(0) # SM_CXSCREEN + cheight = user32.GetSystemMetrics(1) # SM_CYSCREEN + try: + dpi = user32.GetDpiForSystem() # Windows 10 1607+ + dpi_scale = dpi / 96.0 + except: dpi_scale = 1.0 # 降级方案 + print(f'Screen (RDP disconnected): {cwidth}x{cheight}, dpi_scale: {dpi_scale}') def MouseDown(): win32api.mouse_event(win32con.MOUSEEVENTF_LEFTDOWN,0,0) def MouseUp(): win32api.mouse_event(win32con.MOUSEEVENTF_LEFTUP,0,0) diff --git a/memory/ljqCtrl_sop.md b/memory/ljqCtrl_sop.md index 9070d72..ae36f7e 100644 --- a/memory/ljqCtrl_sop.md +++ b/memory/ljqCtrl_sop.md @@ -41,3 +41,4 @@ ljqCtrl.Click(px, py) - **物理验证**:模拟操作前必须确保窗口已通过 `activate()` 置于前台。 - **偏移量**:所有的相对偏移像素值(如“向右移动 10 像素”)同样需要除以 `dpi_scale`。 - **坐标对齐**: 物理坐标 = 截图坐标;ljqCtrl 自动处理 DPI 换算,禁止手动重复计算。 +- **⚠️ 窗口坐标转换陷阱**:使用 `win32gui.GetWindowRect(hwnd)` 获取的矩形包含标题栏和边框,而截图内容是客户区。点击截图内元素时,必须用 `win32gui.ClientToScreen(hwnd, (0, 0))` 获取客户区原点的屏幕坐标,再加上截图内坐标。禁止直接用 GetWindowRect 左上角 + 截图坐标。 \ No newline at end of file