Как можно двигать мышь программно в Common Lisp? - PullRequest
1 голос
/ 18 апреля 2019

Код должен работать на Windows 10. Я попытался , спрашивая на Reddit , но идеи только для Unix / Linux.Есть также CFFI, но я не понимал, как использовать его для этой проблемы (основная часть юзабилити документации, которую я нашел - это просто сложный пример, не связанный с этой проблемой).

Я также просмотрел SetCursorPos в Python и обнаружил, что он вызывает ctypes.windll.user32.SetCursorPos (x, y), но я понятия не имею, как это будет выглядеть в CL.

И, наконец,есть CommonQt, но, хотя в Qt, похоже, есть QtCursor :: setPos, я не смог найти версию CL.

Ответы [ 2 ]

3 голосов
/ 18 апреля 2019

Функция, вызываемая примером Python, выглядит как , документированная здесь .Это часть общей библиотеки 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 для автоматического поиска typedef из какого-то заголовка Windows, но я просто буду использовать :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 голос
/ 18 апреля 2019

Здесь есть две проблемы:

  1. Как переместить мышь в Windows
  2. Как вызвать эту функцию из CL.

Кажется, вы выяснили, что существует подходящая функция win32, поэтому задача состоит в том, чтобы загрузить соответствующую библиотеку, объявить имя и тип функции и затем вызвать ее. К сожалению, я не могу вам в этом помочь.

Некоторые другие решения, которые вы можете попробовать:

  1. Напишите и скомпилируйте тривиальную библиотеку C, чтобы вызвать нужную функцию, и посмотрите, сможете ли вы вызвать ее из CL (может, это проще?)
  2. Напишите и скомпилируйте тривиальную библиотеку C и посмотрите, сможете ли вы решить, как ее вызвать из CL
  3. Напишите / найдите простую программу на другом языке для перемещения мыши на основе аргументов / stdin и запускайте ее из CL
...