Python win32api.SetCursorPos проблема с двумя экранами

Я пытаюсь создать простую программу, которая будет щелкать по определенным координатам каждые x секунд на основе вашего выбора, если вам нужно нажать на левый экран или правый экран. Моя проблема здесь в том, что win32api.SetCursorPos, который перемещается с моим курсором, не перемещается на дополнительный экран (прямо в моем случае). Он остается на главном экране.

И у меня есть еще одна проблема с моим кодом, когда нажата кнопка "Выход" внутри графического интерфейса, окно закроется, но программа все еще работает в фоновом режиме. Я использую функцию self.Destroy(), чтобы убить весь процесс.

Спасибо за совет.

Вот мой код:

import time
import pyautogui
import wx
import threading
import sys
import win32api

class bucky(wx.Frame):

    def __init__(self,parent,id):
        self.positionx = ""
        self.positiony = ""
        wx.Frame.__init__(self,parent,id,'AutoClick 2.0', size=(300,200))
        panel=wx.Panel(self)
        self.buttonpos=wx.Button(panel,label="Left Screen",pos=(30,10),size=(80,40))
        self.buttonpos2=wx.Button(panel,label="Right Screen",pos=(180,10),size=(80,40))
        self.button=wx.Button(panel,label="Start",pos=(120,90),size=(60,30))
        self.button2=wx.Button(panel,wx.ID_EXIT,label="Exit",pos=(120,120),size=(60,30))
        self.Bind(wx.EVT_BUTTON, self.action, self.button)
        self.Bind(wx.EVT_BUTTON, self.closebutton, self.button2)
        self.Bind(wx.EVT_BUTTON, self.position, self.buttonpos)
        self.Bind(wx.EVT_BUTTON, self.position, self.buttonpos2)
        self.Bind(wx.EVT_CLOSE, self.closewindow)


    def position(self, event):
        label = event.GetEventObject().GetLabel()
        if label == "Left Screen":
            self.positionx = 1640
            self.positiony = 183
            self.buttonpos.Disable()
            self.buttonpos2.Enable()
        elif label == "Right Screen":
            self.positionx = 3308
            self.positiony= 186
            self.buttonpos.Enable()
            self.buttonpos2.Disable()

    def closebutton(self,event):
        self.Destroy()

    def closewindow(self,event):
        self.Destroy()

    def action(self,event):
        self.button.Disable()
        def callback():
            while 1:
                pos = pyautogui.position()
                time.sleep(10)
                pos1 = pyautogui.position()
                if (pos1[0] == pos[0]) and (pos1[1] == pos[1]):
                    win32api.SetCursorPos((self.positionx, self.positiony))
                    pyautogui.click()
                else:
                    pass
        t = threading.Thread(target=callback)
        t.start()

if __name__=='__main__':
    app=wx.PySimpleApp()
    frame=bucky(parent=None,id=1)
    frame.Show()
    app.MainLoop()

РЕДАКТИРОВАТЬ: проблема была решена. Спасибо за помощь.

1 ответ

Глядя на это сообщение Reddit, я думаю, что координаты x для дополнительного монитора просто добавляются к разрешению основного монитора (например, если у вас было два монитора 1920x1080, середина второго монитора будет 2880,520)

Попробуйте использовать (win32api.GetSystemMetrics(MONITOR_NUMBER) чтобы увидеть, как представлены различия.

Другие вопросы по тегам