通过tcl中的proc - procedure(function)调用键盘键

时间:2018-03-13 12:15:46

标签: linux tcl bind tk sendkeys

在互联网面前,到目前为止,我只能找到与关键相关的事件与前端按钮相关联的反向,而不是调用密钥的前端按钮。明白了?!看:

#!/usr/bin/env wish

button .b1 -text Hello -underline 0
button .b2 -text World -underline 0
bind . {.b1 flash; .b1 invoke}
bind . {.b2 flash; .b2 invoke}
pack .b1 .b2

说明 - 如果按下H按钮,Hello按钮将闪烁。 W也会产生同样的效果;世界

我希望前端[GUI]按钮模拟击键,例如 - F1

enter image description here

  

此Print Screen软件为mp3blaster - learn more..

  

此打印屏幕是开发人员正在工作的GUI:

enter image description here

我在一两个星期前问过这个问题。因为我没有得到任何 合理的答案,我不知道是否有可能,或者没有人知道,或者 无人问津。

我想在UNIX GNU / Linux下发送一个非tcl / tk应用程序的一些密钥 用于非常简单的工具栏控件。对于申请必须 就像在键盘上敲击这些键一样。在VisualBasic中 该函数称为SendKey。是否可以使用tcl / tk执行此操作?

我将使用Windows Script Host和tcom:

描述如何执行此操作

在此示例中,Tcl脚本启动记事本并将密钥发送到应用程序。

包需要tcom

configure wshShell [:: tcom :: bind "WScript.Shell"]
set taskId [$ wshShell Run "notepad.exe"]
$ wshShell AppActivate $ taskId
after 500
$ wshShell SendKeys "The quick brown fox jumped \ n"
$ wshShell SendKeys "{TAB} about the lazy dog."
:: tcom :: release $ wshShell

在UNIX上; Linux如何实现这个???它可以是focus方法,反向bind或第三方应用xvkbdxbindkeysxkeycapsxevxjoypad等...如果tcl / tk没有一个内置命令,可以使用哪些以及如何使用?!

如果有人知道和/或可以澄清我,我会很感激。

2 个答案:

答案 0 :(得分:1)

xdotoolhttp://www.semicomplete.com/projects/xdotool/)可以帮助完成这项任务。

这是一个简短的代码段,可在点击Tk按钮时将Ctrl+Tab发送给Chrome:

#!/usr/bin/env wish

#
# Focus window named $window_name and send the specified key sequence.
#
proc send_key {window_name key_sequence} {
    foreach wid [exec xdotool search --name $window_name] {
        if {![catch {exec xdotool windowfocus $wid}]} {
            exec xdotool key $key_sequence
        }
    }
}

button .f1 \
    -text "Send Ctrl+Tab to Chrome (cycle through browser tabs)"  \
    -command {send_key chrome ctrl+Tab}
pack .f1

在向您发送密钥序列之前,您必须先关注窗口,这有点问题。

答案 1 :(得分:0)

要生成密钥,您需要event generate command

event generate $w <KeyPress-F1> -x $x -y $y

您可能希望将事件定向到焦点窗口,如果您没有更好的位置,则X和Y位置应设置为0(或者使用 - {{1} }和rootx选项以及使用全局坐标的-rooty命令。)

您可以为按键事件设置许多其他字段,但大多数字段并不常用。 (特别是,我认为使用修饰符为生成的事件设置状态字段更容易,而不是明确设置winfo pointerxy选项。)