ljqCtrl: 兼容RDP断开场景的屏幕尺寸/DPI获取; ljqCtrl_sop: ClientToScreen避坑; .gitignore清理
This commit is contained in:
committed by
Jiaqing Liang
parent
392747798a
commit
75ddf8fd1d
1
.gitignore
vendored
1
.gitignore
vendored
@@ -60,5 +60,4 @@ memory/*
|
|||||||
restore_commit.txt
|
restore_commit.txt
|
||||||
|
|
||||||
sche_tasks/
|
sche_tasks/
|
||||||
model_responses.sync-conflict-*
|
|
||||||
QUICK_START.md
|
QUICK_START.md
|
||||||
|
|||||||
@@ -1,4 +1,3 @@
|
|||||||
# coding=utf-8
|
|
||||||
"""
|
"""
|
||||||
CRITICAL: 严禁在此工具链中 import pyautogui (会污染 win32api 导致逻辑冲突)。
|
CRITICAL: 严禁在此工具链中 import pyautogui (会污染 win32api 导致逻辑冲突)。
|
||||||
ljqCtrl Quick Reference:
|
ljqCtrl Quick Reference:
|
||||||
@@ -10,25 +9,33 @@ ljqCtrl Quick Reference:
|
|||||||
- MouseDClick(staytime=0.05), MouseClick(staytime=0.05)
|
- MouseDClick(staytime=0.05), MouseClick(staytime=0.05)
|
||||||
"""
|
"""
|
||||||
|
|
||||||
import os, sys, time, random, math
|
import os, sys, time, random, math, win32api, win32con
|
||||||
import win32api, win32con
|
|
||||||
import numpy as np
|
import numpy as np
|
||||||
|
|
||||||
dpi_scale = 1
|
dpi_scale = 1
|
||||||
|
|
||||||
try:
|
try:
|
||||||
from PIL import ImageGrab, Image, ImageEnhance, ImageFilter, ImageDraw
|
from PIL import ImageGrab, Image, ImageEnhance, ImageFilter, ImageDraw
|
||||||
import cv2
|
import cv2
|
||||||
except: pass
|
except: pass
|
||||||
|
|
||||||
scr = ImageGrab.grab()
|
try:
|
||||||
swidth, sheight = scr.size
|
scr = ImageGrab.grab()
|
||||||
print('Screen width & height:', swidth, sheight)
|
swidth, sheight = scr.size
|
||||||
cwidth, cheight = map(win32api.GetSystemMetrics, [win32con.SM_CXSCREEN, win32con.SM_CYSCREEN])
|
print('Screen width & height:', swidth, sheight)
|
||||||
dpi_scale = cwidth / swidth
|
cwidth, cheight = map(win32api.GetSystemMetrics, [win32con.SM_CXSCREEN, win32con.SM_CYSCREEN])
|
||||||
print('dpi_scale:', dpi_scale)
|
dpi_scale = cwidth / swidth
|
||||||
|
print('dpi_scale:', dpi_scale)
|
||||||
time.process_time()
|
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 MouseDown(): win32api.mouse_event(win32con.MOUSEEVENTF_LEFTDOWN,0,0)
|
||||||
def MouseUp(): win32api.mouse_event(win32con.MOUSEEVENTF_LEFTUP,0,0)
|
def MouseUp(): win32api.mouse_event(win32con.MOUSEEVENTF_LEFTUP,0,0)
|
||||||
|
|||||||
@@ -41,3 +41,4 @@ ljqCtrl.Click(px, py)
|
|||||||
- **物理验证**:模拟操作前必须确保窗口已通过 `activate()` 置于前台。
|
- **物理验证**:模拟操作前必须确保窗口已通过 `activate()` 置于前台。
|
||||||
- **偏移量**:所有的相对偏移像素值(如“向右移动 10 像素”)同样需要除以 `dpi_scale`。
|
- **偏移量**:所有的相对偏移像素值(如“向右移动 10 像素”)同样需要除以 `dpi_scale`。
|
||||||
- **坐标对齐**: 物理坐标 = 截图坐标;ljqCtrl 自动处理 DPI 换算,禁止手动重复计算。
|
- **坐标对齐**: 物理坐标 = 截图坐标;ljqCtrl 自动处理 DPI 换算,禁止手动重复计算。
|
||||||
|
- **⚠️ 窗口坐标转换陷阱**:使用 `win32gui.GetWindowRect(hwnd)` 获取的矩形包含标题栏和边框,而截图内容是客户区。点击截图内元素时,必须用 `win32gui.ClientToScreen(hwnd, (0, 0))` 获取客户区原点的屏幕坐标,再加上截图内坐标。禁止直接用 GetWindowRect 左上角 + 截图坐标。
|
||||||
Reference in New Issue
Block a user