首页 > 解决方案 > 测试是否在 Julia 中按下了某个键

问题描述

我想使用键盘快捷键启动一个 julia 脚本Ctrl+Shift+H

当脚本启动时,按键CtrlShift可能仍被按下(取决于我移开手指的速度)。

我想确保在执行脚本的其余部分之前释放这两个键。为此,我需要测试是否按下了键。

请注意,释放键时触发事件是不够的,因为脚本启动时可能不会按下键。

我找到了几个参考来检测 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+tCtrl+Shift+y将触发窗口中的操作,但不会写入“azerty”。

所以,我想用这个快捷方式启动一个 python 脚本,在执行命令之前等待Ctrl并且不被按下。再次注意,等待与侦听器一起释放的键不是解决方案,因为如果我快速使用快捷方式,则在 python 脚本开始时可能不会按下键(因此我必须在执行之前再次按下我不想要的 cnee 命令)。ShiftcneeCtrlShiftCtrlShift

标签: juliashortcutkeyevent

解决方案


下面的 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()

推荐阅读