Я пытаюсь использовать некоторую комбинацию автоматического позиционирования курсора c с pyWinhook для реализации обтекания курсора на многоэкранном настольном компьютере. В конце концов, я надеюсь расширить возможности кода для переноса на другую систему, когда попаду в крайний правый или крайний левый край экрана, но сейчас я опускаю биты сети, пытаясь заставить его функционировать на одной system.
Изначально я собрал этот простой скрипт, используя pyauto gui, для выполнения обтекания:
import pyautogui
MAX_X, MAX_Y = pyautogui.size()
MAX_X -= 1
MAX_Y -= 1
def detect_wrap():
x, y = pyautogui.position()
if x >= MAX_X:
pyautogui.moveTo(0,y)
elif x <= 0:
pyautogui.moveTo(MAX_X,y)
elif y >= MAX_Y:
pyautogui.moveTo(x, 0)
elif y <= 0:
pyautogui.moveTo(x, MAX_Y)
return
print(pyautogui.size())
while True:
detect_wrap()
, который прекрасно работает, но имеет раздражающий бесконечный l oop при в конце, поэтому я попытался найти способ сделать это более аккуратно, наткнулся на pyWinhook и pythoncom и придумал аналогичный скрипт, чтобы попытаться добиться того же. Однако, когда я это сделал, вместо того, чтобы прыгать с дальнего дна на верх, в крайнее правое положение слева, et c. сценарий застрял по краям и остался там. Хотя я не уверен почему. Я вставил несколько печатных выражений, чтобы попытаться пролить свет и увидел, что мышь действительно переместилась к противоположной границе, но что-то продолжало возвращать ее go. Я углубился в pyauto gui и выяснил, как он перемещал курсор (используя ctypes.windll.user32.SetCursorPos (xpos, ypos)), поэтому я взял pyauto gui из уравнения. То, что у меня осталось, выглядит следующим образом (учтите, это незавершенное производство):
import win32api
import pyWinhook as pyHook
import pythoncom
import ctypes
import win32api, win32con
import win32.win32gui as win32gui
import os, sys, time
SCREEN_WIDTH = 0 # This will actually be set later, when we know the size of the attached screen(s)
SCREEN_HEIGHT = 0 # This will actually be set later, when we know the size of the attached screen(s)
XMAX = 0 # This will actually be set later, when we know the size of the attached screen(s)
YMAX = 0 # This will actually be set later, when we know the size of the attached screen(s)
XMIN = 1
YMIN = 1
def setWrapPos(xpos, ypos, border):
win32gui.ReleaseCapture()
if border == 'left':
xpos = SCREEN_WIDTH - 1
elif border == 'top':
ypos = SCREEN_HEIGHT - 1
elif border == 'right':
xpos = XMIN
elif border == 'bottom':
ypos = YMIN
else:
print('ERROR: Illegal border passed to setWrapPos()')
ctypes.windll.user32.SetCursorPos(xpos, ypos)
time.sleep(0.01)
return
def onclick(event):
print('Detected mouseclick at (%d,%d)' % event.Position)
return True
def trackMouse(event):
hm.UnhookMouse()
flags, hcursor, coords = win32gui.GetCursorInfo()
xpos, ypos = coords
print("Mouse at (%d, %d)" % (xpos, ypos))
if (xpos <= XMIN):
setWrapPos(xpos, ypos, 'left')
elif (ypos <= YMIN):
setWrapPos(xpos, ypos, 'top')
elif (xpos >= XMAX):
setWrapPos(xpos, ypos, 'right')
elif (ypos >= YMAX):
setWrapPos(xpos, ypos, 'bottom')
flags, hcursor, coords = win32gui.GetCursorInfo()
xpos, ypos = coords
print("Mouse moved to (%d, %d)" % (xpos, ypos))
hm.HookMouse()
return True
def onWinCombo(event):
if event.Key == 'X':
print('Lcontrol-X was detected. Exiting.')
hm.UnhookMouse()
hm.UnhookKeyboard()
os._exit(0)
else:
hm.KeyDown = onKeyboardEvent
return False
def noMoreCombo(event):
hm.KeyDown = onKeyboardEvent
hm.KeyUp = None
return False
def onKeyboardEvent(event):
print('Keyboard action detected, ' + str(event.Key) + ' was pressed.')
if str(event.Key) == 'Lcontrol':
print('Lcontrol detected.')
hm.KeyDown = onWinCombo
hm.KeyUp = noMoreCombo
return True
curr_right = 0
mons = win32api.EnumDisplayMonitors()
i = 0
while i < win32api.GetSystemMetrics(win32con.SM_CMONITORS):
minfo = win32api.GetMonitorInfo(mons[i][0])
if minfo['Monitor'][2] > SCREEN_HEIGHT:
SCREEN_HEIGHT = minfo['Monitor'][3]
print("Monitor #" + str(i+1) + ": " + str(minfo['Monitor'][2] - curr_right) + "x" + str(minfo['Monitor'][3]))
i += 1
curr_right += minfo['Monitor'][2]
minfo = win32api.GetMonitorInfo(mons[i-1][0])
SCREEN_WIDTH = minfo['Monitor'][2]
XMAX = SCREEN_WIDTH - 1
YMAX = SCREEN_HEIGHT - 1
hm = pyHook.HookManager()
hm.SubscribeMouseAllButtonsDown(onclick)
hm.SubscribeMouseMove(trackMouse)
hm.KeyDown = onKeyboardEvent
hm.HookMouse()
hm.HookKeyboard()
pythoncom.PumpMessages()
Код работает, но, что бы я ни пробовал, я не могу показаться чтобы курсор не отскочил назад к границам, а не перепрыгнул на другую сторону. У меня закончились идеи, поэтому я подумал, что, может быть, кто-то здесь подумает о том, что происходит.
Заранее спасибо за понимание.