Можно ли запретить процессу, работающему в полноэкранном режиме, изменять движение указателя мыши?

В этом примере я использую последнюю версию 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

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


person huehuehuehuehuehuehuehuehuehue    schedule 23.11.2018    source источник


Ответы (1)


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

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

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

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

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

person rioki    schedule 23.11.2018