Можно ли предотвратить процесс, который работает в полноэкранном режиме, от изменения движения указателя мыши? - PullRequest
0 голосов
/ 23 ноября 2018

Я использую последнюю версию Windows 10 для этого примера.Приложение, находясь в определенном состоянии, предотвращает попадание указателя мыши на край экрана, делая его невидимым, выравнивая его по центру и всегда возвращая его в исходное положение при перемещении.Такое поведение наблюдается при запуске простого сценария на языке Python в фоновом режиме, который отслеживает движение мыши.Указатель мыши перемещается только на несколько пикселей в направлении, в котором он перетаскивается, и затем возвращается к центру экрана.

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

Моя первая попытка добиться этого состояла в том, чтобы обнаружить и сложить все незначительные изменения местоположения курсора (который в этом состоянии (960, 600), середина экрана), а затем добавьте их к координатам курсора до входа в это состояние.Здесь основная программа переходит в это состояние центрирования при нажатии клавиши «v»:

# -*- coding: utf-8 -*-
import keyboard
from time import sleep
import win32api, win32con, win32ui
import numpy

keypress = False
key = 'v'
ww= False

while True:
    curpos = win32api.GetCursorPos()
    if ww:
        if curpos != (960, 600)):
            finalpos = numpy.add(finalpos, numpy.subtract(curpos,initpos))
            initpos = curpos    
    if keypress and not keyboard.is_pressed(key):
        sleep(0.01)
        win32api.SetCursorPos(finalpos)
        keypress = False
        pass
        ww= False
    elif keyboard.is_pressed(key) and not keypress:
        initpos = curpos
        finalpos = curpos
        keypress = True
        ww = True

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

1 Ответ

0 голосов
/ 23 ноября 2018

Краткий ответ: Нет

Длинный ответ:

Существует несколько способов реализации блокировки указателя.Наивный способ - скрыть и перецентрировать курсор.Вы эффективно пытаетесь нейтрализовать эффект блокировки указателя.Но приложения, которые делают блокировку указателя, как игра, это желаемый эффект.Поэтому я не понимаю, почему вы хотели бы это сделать.

Проблема, с которой вы сталкиваетесь, - это условия гонки, ваш скрипт и приложение пытаются изменить одно и то же значение;положение курсора мыши.Приложение, которое работает быстрее всех, выигрывает, но в результате получается беспорядок.

Если приложение, которое блокирует указатель, так раздражает, зачем запускать его одновременно на той же машине.Если вам действительно нужно запускать его в фоновом режиме при использовании системы, почему бы не использовать несколько виртуальных рабочих столов и поместить приложение на один рабочий стол, а затем использовать другой.

...