我希望在移动鼠标时不断跟踪鼠标,或者至少每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回来了吗?为什么是这样? getmouse只能在点击等事件后工作吗?如果是这样,是否不可能连续跟踪鼠标?
getmouse()点击以切换来源
返回鼠标的坐标。
这将从队列中读取并弹出鼠标事件数据
查看BUTTON *,ALL_MOUSE_EVENTS和REPORT_MOUSE_POSITION常量
REPORT_MOUSE_POSITION
似乎是关键,但我真的不知道如何使用这些常量。 getmouse(REPORT_MOUSE_POSITION)
无法正常工作。如果那是非常重要的话,那就很好了,但那里没有太多的文档。
答案 0 :(得分:1)
您需要将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 getch
when KEY_MOUSE
m = getmouse
winx.addstr "Mouse Position: #{m.x} #{m.y} #{m.z}"
end
不幸的是,在我的系统中,这只会在我点击时报告鼠标移动,所以根据你的curses实现/终端,你可能会失去运气。
如果您不太害怕C,我建议您阅读ncurses C文档。 Ruby的curses库基本上是它的直接翻译。
答案 1 :(得分:0)
根据TLDP护士文档,您需要在鼠标掩码中使用REPORT_MOUSE_POSITION Asa常量。试试这个:
mousemask(REPORT_MOUSE_POSITION|BUTTON1_CLICKED|BUTTON2_CLICKED|BUTTON3_CLICKED|BUTTON4_CLICKED)
这告诉curses将鼠标位置报告为事件。
答案 2 :(得分:0)
请参阅Mouse movement events in NCurses的答案。
鼠标事件报告在很大程度上取决于终端模拟器(在iTerm2中的Mac上,我必须在首选项中“启用xterm鼠标报告”),以及如上所述的TERM设置(我必须像{{1一样启动ruby) }})
此外,在致电TERM=xterm-1003 ruby curses_mouse.rb
之前,您必须致电getch
并测试KEY_MOUSE
。例如,如果您只对鼠标事件感兴趣:
getmouse
另外,将c = getch
case c
when KEY_MOUSE
m = getmouse
end
添加到|REPORT_MOUSE_POSITION
来电。