测试是否在Julia中按下了键

问题描述

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

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

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

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

我在Julia中找到了几个参考来检测何时按下了一个键,但是我没有找到一个可以测试当前是否按下了一个键的参考。

你知道我该怎么做吗?

这是为什么我要这样做的一个最小示例。 您可以找到here格式的文件,该文件可以在焦点所在的窗口中写入“ azerty”。如果在终端中键入以下命令,则会按预期在其中键入“ azerty”:

cnee --replay  -sp 0 -f ./recorded_macro.xnl

为了在任何窗口(不仅是终端)中写“ azerty”,我创建了执行该命令的键盘快捷键Ctrl+Shift+H。如果使用快捷方式,则在执行命令时很可能会按下键CtrlShift(除非我很快使用快捷方式),而不是键入“ azerty”,而是焦点将得到Ctrl+Shift+aCtrl+Shift+zCtrl+Shift+eCtrl+Shift+rCtrl+Shift+tCtrl+Shift+y,这将触发窗口中的操作,但不会写入“ azerty”。

因此,我想改为使用此快捷方式启动python脚本,该脚本等待CtrlShift在执行cnee命令之前未被按下。再次注意,等待键与侦听器一起释放不是解决方案,因为如果我快速使用快捷键,则可能无法在python脚本开始时按下键CtrlShift(并且因此在执行不需要的cnee命令之前,我将不得不再次按CtrlShift

解决方法

下面的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,:destroy)
    showall(win)
    wait(cond)
end

keypresswindow()