3

我想在鼠标移动时连续跟踪鼠标,或者至少每 0.5 秒跟踪一次:

require "curses"
include Curses



init_screen
start_color
init_pair(COLOR_BLUE,COLOR_BLUE,COLOR_WHITE)
init_pair(COLOR_RED,COLOR_RED,COLOR_WHITE)
crmode
noecho
stdscr.keypad(true)

close = false

begin
  mousemask(BUTTON1_CLICKED|BUTTON2_CLICKED|BUTTON3_CLICKED|BUTTON4_CLICKED)

  count = 0

  while( count < 10 )

        sleep 0.5

          m = getmouse


          winx = Window.new(7,30,10,10)
          winx.keypad = true
          winx.box(?|, ?-, ?+)
          winx.setpos(2,3)
          winx.addstr "Loop Count: " + count.to_s
          winx.setpos(3,3)
          winx.addstr "Mouse Position: " + m.inspect



          winx.refresh


          count += 1
  end


refresh
ensure
    close_screen
end

我想我已经很接近了,但由于某种原因,getmouse 返回 nill 吗?为什么是这样?getmouse 是否仅在单击等事件后才起作用?如果是这样,是不是不可能持续跟踪鼠标?

这来自红宝石文档

getmouse() 点击切换源

返回鼠标的坐标。

这将从队列中读取并弹出鼠标事件数据

请参阅 BUTTON*、ALL_MOUSE_EVENTS 和 REPORT_MOUSE_POSITION 常量

REPORT_MOUSE_POSITION这里似乎很关键,但我真的不知道如何使用这些常量。getmouse(REPORT_MOUSE_POSITION)不起作用..对不起,如果这主要是nooby,但那里没有太多文档。

4

3 回答 3

3

您需要添加REPORT_MOUSE_POSITION到您的mousemask

mousemask(BUTTON1_CLICKED|BUTTON2_CLICKED|BUTTON3_CLICKED|BUTTON4_CLICKED|REPORT_MOUSE_POSITION)

或者也许只是

mousemask(ALL_MOUSE_EVENTS)

Curses 在与按键相同的流中处理鼠标点击。因此,您需要使用getch.

在您的情况下,我建议设置getch为非阻塞读取stdscr.timeout=0并添加 case 语句:

case getch
when KEY_MOUSE
  m = getmouse
  winx.addstr "Mouse Position: #{m.x} #{m.y} #{m.z}"
end

不幸的是,在我的系统上,这只在我单击时报告鼠标移动,因此根据您的 curses 实现/终端,您可能会不走运。

如果您不太害怕 C,我建议您阅读 ncurses C 文档。Ruby 的 curses 库基本上是它的直接翻译。

于 2013-10-15T15:04:53.270 回答
1

请参阅NCurses 中鼠标移动事件的答案

鼠标事件报告在很大程度上取决于终端模拟器(在 iTerm2 中的 Mac 上,我必须在首选项中“启用 xterm 鼠标报告”),以及如上所述的 TERM 设置(我必须像启动 ruby​​ 一样TERM=xterm-1003 ruby curses_mouse.rb

此外,您必须在调用之前调用getch并测试。例如,如果您只对鼠标事件感兴趣:KEY_MOUSEgetmouse

c = getch
case c
when KEY_MOUSE
  m = getmouse
end

另外,添加|REPORT_MOUSE_POSITION通话mousemask

于 2013-10-15T15:42:48.470 回答
1

根据 TLDP 护士文档,您需要在鼠标掩码中使用 REPORT_MOUSE_POSITION 作为常量。尝试这个:

mousemask(REPORT_MOUSE_POSITION|BUTTON1_CLICKED|BUTTON2_CLICKED|BUTTON3_CLICKED|BUTTON4_CLICKED)

这告诉curses 将鼠标位置报告为一个事件。

于 2013-10-15T15:06:29.493 回答