Быстрое движение мыши с помощью скрипта ненадежно в запланированном времени - PullRequest
0 голосов
/ 16 октября 2018

Я пытаюсь написать кусок кода, который перемещает курсор мыши на экране в указанное место.Вот несколько способов, которыми я пытался добиться этого:

Код ниже используется во всех попытках (песочница отключена):

let mouseCursorPosition = CGPoint.zero;
CGAssociateMouseAndMouseCursorPosition(1)

Попытка 1:

CGWarpMouseCursorPosition(mouseCursorPosition)

Попытка 2:

CGDisplayMoveCursorToPoint(CGMainDisplayID(), CGPoint.zero)

Попытка 3:

let moveEvent = CGEvent(mouseEventSource: nil, mouseType: CGEventType.mouseMoved, mouseCursorPosition: mouseCursorPosition, 
mouseButton: CGMouseButton.left)
moveEvent?.post(tap: CGEventTapLocation.cghidEventTap)

Ожидаемое поведение: обновите положение мыши вместе с курсором на экране.

Каждая попытка до сих пор работает, как ожидалось, если вызывается непосредственно внутри viewDidLoad().Курсор перемещается в требуемое место на экране, как только приложение загружается.Тем не менее, все становится немного странным, когда вызывается внутри scheduledTimer.Используя код ниже:

class ViewController: NSViewController {
    var mouseTimer: Timer!

    override func viewDidLoad() {
        super.viewDidLoad()

        mouseTimer = Timer.scheduledTimer(timeInterval: 5, target: self, selector: #selector(moveCursor), userInfo: nil, repeats: true)
    }

    @objc func moveCursor() {
        print(NSDate().timeIntervalSince1970)

        let mouseCursorPosition = CGPoint.zero;
        CGAssociateMouseAndMouseCursorPosition(1)

        //insert attempt code here
    }
}

Метод moveCursor вызывается каждые 5 секунд (отметка времени появляется каждый раз), однако курсор не перемещается на экране, пока я не перемещаю физическоемышь.Однако, когда я перемещаю мышь, курсор сначала привязывается к последней позиции скрипта.Кажется, что происходит то, что сценарий местоположения зарегистрирован, однако он не обновляется на экране до тех пор, пока не будет запущено какое-либо событие обновления.

Будем весьма признательны за любые мысли по этому поводу.

1 Ответ

0 голосов
/ 16 октября 2018

Я не могу воспроизвести эту проблему в macOS 11.14.Я создал новое приложение Cocoa, используя раскадровки, и отредактировал ViewController.swift так:

import Cocoa

class ViewController: NSViewController {
    var mouseTimer: Timer!

    override func viewDidLoad() {
        super.viewDidLoad()
        mouseTimer = Timer.scheduledTimer(timeInterval: 5, target: self, selector: #selector(moveCursor), userInfo: nil, repeats: true)

    }

    @objc func moveCursor() {
        print(NSDate().timeIntervalSince1970)
        let mouseCursorPosition = CGPoint.zero;
        CGAssociateMouseAndMouseCursorPosition(1)
        CGWarpMouseCursorPosition(mouseCursorPosition)
    }
}

Затем я запустил его под Xcode.Через 5 секунд (и каждые 5 секунд после) печатается метка времени, и курсор переходит в верхний левый угол.Я могу переместить курсор в другое место, и он снова прыгнет.

У меня такое же поведение с или без вызова CGAssociateMouseAndMouseCursorPosition.(Я не уверен, почему вы вызываете это в тесте; 1 - значение по умолчанию.)


Обновлено на основе ваших комментариев, и я все еще не могу воспроизвести:

import Cocoa

class ViewController: NSViewController {
    var mouseTimer: Timer!

    override func viewDidLoad() {
        super.viewDidLoad()
        mouseTimer = Timer.scheduledTimer(timeInterval: 5, target: self, selector: #selector(moveCursor), userInfo: nil, repeats: true)

    }

    @objc func moveCursor() {
        let mouseCursorPosition = CGPoint(x: Int.random(in: 0...500), y: Int.random(in: 0...500))
        print("\(Date().timeIntervalSince1970): \(mouseCursorPosition)")
        CGWarpMouseCursorPosition(mouseCursorPosition)
    }
}

Каждые 5 секунд это заставляет указатель мыши переходить на новое место, независимо от того, перемещаю я указатель мыши или нет.Это идентично вашему коду?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...