julia - 测试是否在 Julia 中按下了某个键
问题描述
我想使用键盘快捷键启动一个 julia 脚本Ctrl+Shift+H
。
当脚本启动时,按键Ctrl
和Shift
可能仍被按下(取决于我移开手指的速度)。
我想确保在执行脚本的其余部分之前释放这两个键。为此,我需要测试是否按下了键。
请注意,释放键时触发事件是不够的,因为脚本启动时可能不会按下键。
我找到了几个参考来检测 Julia 中何时按下某个键,但我没有找到一个来测试当前是否按下了某个键。
你知道我怎么能做到吗?
这是我为什么要这样做的一个最小示例。您可以在此处找到cnee 格式的文件,该文件可以在具有焦点的窗口中写入“azerty”。如果您在终端中键入以下命令,则会按预期在其中键入“azerty”:
cnee --replay -sp 0 -f ./recorded_macro.xnl
为了在任何窗口(不仅仅是终端)中写入“azerty”,我创建了一个Ctrl+Shift+H
执行此命令的键盘快捷键。如果我使用快捷键Ctrl
,则在执行命令时可能会按下键和键Shift
(除非我非常快速地使用快捷键),而不是键入“azerty”,具有焦点的窗口将获得Ctrl+Shift+a
, Ctrl+Shift+z
, Ctrl+Shift+e
, Ctrl+Shift+r
,Ctrl+Shift+t
和Ctrl+Shift+y
将触发窗口中的操作,但不会写入“azerty”。
所以,我想用这个快捷方式启动一个 python 脚本,在执行命令之前等待Ctrl
并且不被按下。再次注意,等待与侦听器一起释放的键不是解决方案,因为如果我快速使用快捷方式,则在 python 脚本开始时可能不会按下键(因此我必须在执行之前再次按下我不想要的 cnee 命令)。Shift
cnee
Ctrl
Shift
Ctrl
Shift
解决方案
下面的 Gtk 程序将检测在程序启动或获得焦点之前已经按下的 shift、control 和 alt 的释放。请注意,我的键盘至少似乎并不总能检测到多个击键,因此可能取决于您的键盘,您可能只需要检测其中一个版本。
using Gtk
function keypresswindow()
txt = "Press and Release a Key"
state = ""
win = GtkWindow("Key Release Test", 500, 30) |> (GtkFrame() |> ((vbox = GtkBox(:v)) |> (lab = GtkLabel(txt))))
function keyreleasecall(w, event)
event.keyval == 65505 && (state *= "SHIFT ")
event.keyval == 65507 && (state *= "CONTROL ")
event.keyval == 65513 && (state *= "ALT ")
set_gtk_property!(lab, :label, "You have released: $state")
end
signal_connect(keyreleasecall, win, "key-release-event")
cond = Condition()
endit(w) = notify(cond)
signal_connect(endit, win, :destroy)
showall(win)
wait(cond)
end
keypresswindow()
推荐阅读
- python - Apache Spark ALS 算法
- java - 如何在java中的arraylist中添加异常
- python - Tkinter get() 不返回值
- javascript - 为什么我的 JavaScript 无法获取导航对象高度
- javascript - 使用循环向 Firestore 的 get() 添加多个条件,一般 javascript 问题
- python - 使用 PyQt5 实时绘图
- java - 为什么我可以在没有 getter 方法的情况下访问私有实例变量?
- nginx - Nginx 将 url 参数作为标头传递
- c - CS50破解问题。需要有关如何解密 2-4 个字符单词的帮助
- asp.net - 允许匿名访问特定的 aspx 文件不起作用