在屏幕上的 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)
我正在使用一个使用鼠标驱动程序发送鼠标输入的项目,例如
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)