在屏幕上的 2 点之间以增量方式移动鼠标光标

Moving mouse curser increment by increment between 2 points on screen

我正在使用一个使用鼠标驱动程序发送鼠标输入的项目,例如

from ctypes import *
import time



dd_dll = windll.LoadLibrary('x:\DD94687.64.dll')
time.sleep(2)

st = dd_dll.DD_btn(0) #DD Initialize
if st==1:
    print("OK")
else:
    print("Error")
    exit(101)


#Second argument = positive numbers moves the mouse down, Negative numbers moves the mouse up
#First argument = positive numbers moves the mouse right, negative numbers moves the mouse left

#This will move the curser 5 pixels to the right, and 10 pixels down
def dd_dll.DD_movR(5,10)

it can be found here,我想计算光标增量并将其从屏幕中心(起点)移动到用户指定的另一个点(可能是屏幕上的任何坐标)。

iam 使用 DD_movR() 函数,还有另一个函数 DD_mov() 将光标移动到指定的 X,Y 位置,但由于某种原因它放大了 DD_mov() 给出的任何整数=14=]。所以如果我想将光标移动到 (625,625) 我的输入应该是 (500,500) 。我想使用它们中的任何一个,只要我按增量移动鼠标增量而不是跳转指定位置。 我知道还有其他 methods/libraries 具有相同的功能,但目标 iam 发送鼠标输入以阻止所有这些输入,我发现它正在工作。

因此,您想确定要将光标移动到的下一个位置。

假设我们有一条连接源点和目标点的直线(在你的特定问题中,源点是屏幕的中间,但选择哪个点作为起点并不重要观点)。光标的下一个位置应该与该行大致对齐;并且,它应该 x-position 与前一个点相差 5 个像素。

这样,计算下一个点的x-position就很清楚了。现在你应该利用另一个想法(下一点与直线对齐)来计算它的 y-position。你应该怎么做?

要使用直线,您必须知道它是什么:事实证明,从源点和目标点推导出该直线的方程是微不足道的。可以参考这篇文章https://www.mathsisfun.com/algebra/line-equation-2points.html

请注意,您已经拥有 x-position。只需将其代入该线性方程式,您将得到 y-position(取整)。那将是下一个 y-position.

一旦计算出下一个点的位置,如果您想使用DD_movR,只需做一个减法来找到下一个点和前一个点之间的差异。

此外,您应该检查一个极端情况:当下一个点超过目标点时。要解决此问题,您可以丢弃计算出的下一个点并改用目标点。您的 cursor-moving 程序也应该到此结束。


这是上述想法的 Python 代码。 还有一些特殊情况需要处理。

#source = (x1, y1) : the current position of the cursor
#destination = (x2, y2): the position we want to move the cursor to at the end

def nextX(x1, x2):
    if (x2 >= x1 + 5):
        return x1 + 5
    elif (x2 >= x1):
        return x2
    elif (x2 < x1 - 5):
        return x1 - 5
    else:
        return x2

def slope(x1, y1, x2, y2):
    return (y2 - y1) / (x2 - x1) #TODO: need to handle corner case where x1 == x2

#equation will be y - y1 = slope * (x - x1)
#or equivalently y = slope * x + y1 - slope * x1

def nextY(x1, y1, x2, y2):
    eqSlope = slope(x1, y1, x2, y2)
    y = eqSlope * nextX(x1, x2) + y1 - eqSlope * x1
    return round(y)
    
def move(x1, y1, x2, y2):
    nextPosX = nextX(x1, x2)
    nextPosY = nextY(x1, y1, x2, y2)
    dd_dll.DD_movR(nextPosX - x1, nextPosY - y1)