如何在Common Lisp中以编程方式移动鼠标?

时间:2019-04-17 21:45:23

标签: common-lisp mouse

该代码应在Windows 10上运行。我尝试过asking on Reddit,但是这些想法仅适用于Unix / Linux。还有CFFI,但我不知道如何将其用于此问题(the documentation I found的主要可用性部分只是与该问题无关的详尽示例)。

我还浏览了Python的SetCursorPos,发现它调用了ctypes.windll.user32.SetCursorPos(x,y),但是我不知道在CL中会是什么样子。

最后,还有CommonQt,但是虽然Qt中似乎有QtCursor :: setPos,但我找不到CL版本。

2 个答案:

答案 0 :(得分:3)

Python示例调用的函数似乎是documented here。它是共享库user32.dll的一部分,您可以使用CFFI加载该库,

(ql:quickload :cffi)

#+win32
(progn
  (cffi:define-foreign-library user32
    (:windows "user32.dll"))
  (cffi:use-foreign-library user32))

#+win32表示仅在Windows上评估。

然后,您可以使用SetCursorPos声明外部CFFI:DEFCFUN函数。根据文档,它接受两个int并返回一个BOOL。 CFFI具有:BOOL类型,但是Windows BOOL实际上是int。您可能可以使用cffi-grovel从某些Windows标头中自动找到typedef,但我将仅在此处直接使用:INT

#+win32
(cffi:defcfun ("SetCursorPos" %set-cursor-pos) (:boolean :int)
  (x :int)
  (y :int))

我在名称中放置了%,以指示这是一个内部函数,不应直接调用它(因为它仅在Windows上可用)。然后,您应该编写一个在不同平台上都可以使用的包装器(实际上,这里没有在其他平台上实现它)。

(defun set-cursor-pos (x y)
  (check-type x integer)
  (check-type y integer)
  #+win32 (%set-cursor-pos x y)
  #-win32 (error "Not supported on this platform"))

现在调用(set-cursor-pos 100 100)会将鼠标移到左上角附近。

答案 1 :(得分:1)

这里有两个问题:

  1. 如何在Windows中移动鼠标
  2. 如何从CL调用该函数。

似乎您已经找到了合适的win32函数,因此面临的挑战是加载相关的库,声明函数名称和类型,然后调用它。不幸的是,我真的无法帮助您。

您可以尝试其他解决方案:

  1. 编写并编译一个简单的C库以调用所需的函数,并查看是否可以从CL调用它(也许这样更容易吗?)
  2. 编写并编译一个简单的C库,看看是否可以计算出如何从CL调用
  3. 用另一种语言编写/查找一些琐碎的程序,以根据参数/ stdin移动鼠标并从CL运行它