首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何以编程方式生成鼠标事件?

如何以编程方式生成鼠标事件?
EN

Stack Overflow用户
提问于 2012-06-20 16:32:47
回答 2查看 745关注 0票数 5

在SLIME中有两个非常有用的函数:slime-copy-or-inspect-presentation-at-mouseslime-presentation-menu。但是必须用事件参数来调用它们。为了生成一个偶数,我需要做很多后勤工作(计算“鼠标”当前指向的对象的打印表示所占用的区域,行和列--这是我真的不想做的事情,因为Emacs中肯定有一些东西已经计算出来了。

那么,有一种简单的方法来生成“假”鼠标事件吗?因为在编辑器中只使用鼠标做两件事情,否则不需要鼠标感觉.不是很聪明。:)

编辑

以下是我尝试过的:

代码语言:javascript
复制
(define-key lisp-mode-map (kbd "C-x ?")
  #'(lambda ()
      (interactive)
      (message "called")
      (slime-copy-or-inspect-presentation-at-mouse
       `(mouse-2 ;; button
     (,(selected-window) ;; window
      ,(point) ;; position
      (0 . 0) ;; window-relative pixel
      0 ;; timestamp
      nil ;; object
      ,(point) ;; text position 
      (,(current-column) . ;; column
       ,(line-number-at-pos (point))) ;; line
      nil ;; image
      (0 . 0) ;; object-relative pixel
      (1 . 1))))))
(define-key lisp-mode-map (kbd "C-x SPC")
  #'(lambda ()
      (interactive)
      (message "called")
      (slime-presentation-menu
       `(mouse-3 ;; button
     (,(selected-window) ;; window
      ,(point) ;; position
      (0 . 0) ;; window-relative pixel
      0 ;; timestamp
      nil ;; object
      ,(point) ;; text position 
      (,(current-column) . ;; column
       ,(line-number-at-pos (point))) ;; line
      nil ;; image
      (0 . 0) ;; object-relative pixel
      (1 . 1))))))

这实际上可以让我了解到它显示菜单的程度,但是当slime-presentation-menu调用任何绑定到菜单项的函数时,他们都会发现它们不是用“真正的”鼠标事件调用的,抛出和退出。:(

EDIT2

实际上,我认为这是因为x-popup-menu,当您用鼠标或键盘选择菜单项时,它会分派不同的事件.阿罗瑞。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-06-21 15:39:00

希望绑定到鼠标的命令,请单击“接受事件参数”。这是一个列满了诸如点击按钮、位置、窗口等内容的列表。参见21.7.4单击Elisp手册中的事件

下面是一个伪造滚动轮事件的简单示例:

代码语言:javascript
复制
(mwheel-scroll `(mouse-5 ;; button
                 (,(selected-window) ;; window
                  ,(point) ;; position
                  (0 . 0) ;; window-relative pixel
                  0 ;; timestamp
                  nil ;; object
                  ,(point) ;; text position 
                  (,(current-column) . ;; column
                   ,(line-number-at-pos (point))) ;; line
                  nil ;; image
                  (0 . 0) ;; object-relative pixel
                  (1 . 1)))) ;; object size

下面是一个真实事件的例子:

代码语言:javascript
复制
'(mouse-4
  (#<window 374 on *scratch*>
   120
   (6 . 10)
   1301935153
   nil
   120
   (0 . 0)
   nil
   (6 . 10)
   (7 . 15)))
票数 4
EN

Stack Overflow用户

发布于 2016-02-07 18:38:47

posn-at-point所做的几乎是正确的。下面是一种将其输出与真正的鼠标事件进行比较的方法:

代码语言:javascript
复制
(defun my/test-posn (e)
  (interactive "e")
  (message "%S\n%S" e `(down-mouse-3 ,(posn-at-point))))

(global-set-key [down-mouse-3] #'my/test-posn)

输出:

代码语言:javascript
复制
(down-mouse-3 (#<window 73 on blah> 3152 (0 . 594) 145393072 nil 3152 (0 . 33) nil (1 . 4) (8 . 18)))
(down-mouse-3 (#<window 73 on blah> 3152 (0 . 594) 0         nil 3152 (0 . 33) nil (0 . 0) (8 . 18)))
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11124050

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档