编辑注意:这个文件被选为MATLAB中心本周精选
CH = getkey等待单个按键并返回ASCII码。它
接受所有ASCII字符,包括退格(8),空格(32),
输入(13),等等,可以在键盘上输入。
非ascii键(ctrl, alt, ..)返回NaN。CH是双键。
CH = getkey(N)等待N次按键并返回它们的ASCII码。
GetKey(1)与GetKey不具有参数。
getkey('non-ascii')或getkey(N, 'non-ascii')使用non-documented
Matlab功能是返回一个描述按下的键的字符串。
通过这种方式,ctrl、alt、tab等键也可以区分。
返回的是一个字符串(当N = 1时)或字符串的单元格数组。
[CH, T] = getkey(…)也返回从
功能和每个按键。但是,这不是非常准确的。
此功能是在C中的“getch”的替代方法。它使用模态,
但不可见窗口,它确实显示在任务栏。
C语言关键词:KBHIT,KEYPRESS,GETKEY,GETCH
示例1 - 获取单个ASCII键
fprintf('\nPress任意键:');
Ch = getkey;
fprintf('%c \ n',ch);
示例2 - 等待特定密钥
fprintf('\nPress the Ctrl-key within 3 press: ');
Ch = GetKey(3,'非ASCII')
if ismember('control', ch), fprintf('OK\n');
其他流('……错误的键…\n');结尾
例3 -打字游戏
S = 'abcdefghjiklm';
FPRINTF('键入“%s”尽可能快... \ n',s);
[c,t] = getKey(numel);
C = char(C);T = T(end)-T(1);
if ~ = (S, C), fprintf('哎呀!!”);结尾
fprintf('你在%.2f秒中输入的%s“。\ n',c,t);
参见input, uiwait
getKeywait(文件交换)
作者注意:14年后仍然强劲;-)
乔斯(10584)(2021)。getkey(//www.tatmou.com/matlabcentral/fileexchange/7465-getkey), MATLAB中央文件交换。检索。
这就是我一直在找的东西……谢谢
很好的提交。我正在浏览2019年的评论,我注意到这篇文章。
我有个建议让这个图形在功能上隐形。如果我将图形的Units属性设置为Pixels并使用以下代码作为Position,我不会看到它:mon=max(get(0,'MonitorPositions'),1);pos=[mon(3:4) 1 1]
通过查看该函数,我还注意到一件小事:尽管有注释文本,但该函数与v6.5不兼容。它将toc与一个输入一起使用,这个输入从v7.1(可能是v7.0)开始就没有记录,从R2008b开始就有记录。如果你想保持兼容性,你将不得不使用现在的功能。(narginchk也不存在)
@LJM不幸的是,你不能隐藏窗口。我的答案是https://uk.mathworks.com/matlabcentral/answers/374079-how-do-i-set-the-getkey-figure-as-invisible
嗨JOS,
我很难停止GetKey绘制一个数字。我尝试过套装(0,'defaultfigurevisible','关闭');并向图形代码添加“可见”,“关闭”,但这些不起作用。
我如何在没有图形窗口的情况下使用这个函数?
谢谢!
谢谢! !
嗨乔斯
谢谢你的盛情款待。我是matlab的新手,不知道如何使用你的函数来帮助我。我需要代码输入“名称”,然后按enter,没有触摸键盘。你能帮个忙吗…谢谢
谢谢,很漂亮地走。虽然,对于键盘控制器实现,最好使用来自Psysctoolbox的Kbcheck,如下所述。
@奥斯卡,
我建议你在硬盘上创建一个文件夹叫“FEXfiles”之类的。将该文件夹添加到您的matlab路径(请参阅文档如何做)。现在,将从文件交换中下载的文件放到该文件夹中,您应该能够运行它。
对不起,我是新来的,当我下载文件时,我把它放在哪个文件夹里?
允许我做批处理工作与按键,也完成工作使用esc键!只是太棒了!
伟大的计划。是否有一种方法可以将此程序与getkeywait程序中以前实现的计时器元素合并,以便您可以为每个多按键使用时间限制?
好工作!然而,由于我正在运行几个并行函数,我真的希望隐藏命令窗口,同时保持数字在顶部…有什么建议吗?我正在尝试使用matlabpool,让我看看是否会工作或不…
好了,我知道怎么用了。不是我想象的,但我可以解决。谢谢!
很棒的代码!乔斯。
你能解释一下“获得多个按键的能力”是什么意思吗?
我以为是,当我“释放”我的手指时,GetKey输出控制+ Shift
我目前的印象是,当我点击“control”时,getkey输出“control”。
还没机会按"移位"键呢
您可以修改该函数。执行for循环获得两个字符。如果你需要更多的帮助,请发邮件给我。
在我的应用程序,用户应该写两个不同的字符连续和非常快。如果用户输入字符变慢,也没有问题。然而,当用户快速地接连写出两个不同的字符时,代码无法捕获它们。相反,它一次又一次地只读取其中一个字符。你对此有什么建议吗?谢谢
嘿everone !!
谁能给我一个按键功能和按键功能的代码?
实际上,我想做的是,当一个特定的键,例如向上方向键被按下时,球开始绕圈移动,直到按下这个键。
一旦突出的钥匙,球就会停止在圆圈中移动。
提前感谢:)
在上面的帖子中,“停止移动”,我打算意味着“停止移动在圆圈”,而是在切线方向上移动到圆形路径。希望它澄清我的问题。
@andrew b:谢谢!我已经实施了大多数建议。新版本应该很快起来。
“位置”问题(如果有的话)是不容易解决的,因为它似乎依赖于操作系统,显示设置,ML版本…
伟大的工作。
我做了一些调整,你可能有兴趣执行。
我在图中添加了以下属性:
'numbertitle','关闭'
'position',[0 -40 1 1]
“名称”、“按下一个键的
在Windows上,这将使图形远离屏幕,而不是在任务栏后面。这将有助于确保图形不可见,因为一些用户可能会把他们的任务栏放在屏幕上的其他地方。
用户也可能最大化图形,然后关闭它,这将导致在试图删除图形句柄时出现错误。为了防止这种情况,请使用以下代码:
如果ishandle(跳频)
删除(fh);
结尾
谢谢乔斯。你知道我如何检测左/右方向键的按键吗?我知道它必须涉及WindowKeyPressFcn的使用,但我不知道如何在语法中使用它,因为在Matlab帮助没有例子!
@catalin,一个图形窗口和GUI窗口基本相同,Matlab图。两者都有允许在按下键时执行代码(回调)的属性,并且该图具有焦点。
GETKEY主要用于在命令窗口中执行代码。
我有与Priyanshu相同的问题,即我需要能够阅读按键,但不失去当前窗口的焦点(这不是GUI,但只是一个图形!)我不知道你建议的解决方案是什么,乔斯,你能详细说明一下吗?
@ Priyanshu,这不是为图形用户界面设计的。使用按键回调的gui窗口代替。
这个函数不能很好地与GUI一起工作。一旦在GUI函数的循环中重复调用此函数,当前GUI图的焦点就会丢失。在这种情况下有什么办法可以做吗?
很好,但我把它放在一个循环中,我使用getkey()赋值给一个向量的第I个值。如果我按下CTRL键(到CTRL- c并跳出循环),它会在每次循环中停止暂停以接受输入。
我还应该添加这个函数不等待输入。因此,如果在调用时没有按下键,则会被绕过,这很好地用于循环。
嘿伙计们,我知道Tristan并告诉他这个解决方案,并决定我在这里发布,以防任何其他人有这个问题。我下载了Psysctoolbox(http://psychtoolbox.org/wikka.php?wakka=HomePage),它是免费的,它有一个名为KbCheck()的命令。它可以在任何时间读取键盘输入,甚至在无限的while循环期间。我用它驱动一个移动机器人,使用WASD键。注意:KbCheck输出一个奇怪的键代码,使用KbName转换为ASCII。
@Tristan:或许GetKey不是这里最好的选择。您可以创建自己的钥匙窗口并在代码中使用该键。这是一个例子:
figure = figure('name','press some keys');
集(figh, windowkeypressfcn”、“集(gcbf,“用户数据”,得到(gcbf“CurrentCharacter”))”);
套(FIGH,'WindowKyreleaseFCN','Set(GCBF,''Userdata',''')');
T0 =时钟;
fprintf('\nKeys pressed in 5 seconds:\n');
暂停 ;
当etime(clock,t0) < 5时,
curkey = get(figh,'userdata');
如果~ isempty (h),
流(% c, curkey);
结尾
暂停(.05);
结尾
流(' \ n ');
删除(figh);
我正在驾驶一个有getkey的虚拟机器人手臂。它有效,但如果我持有钥匙,它会崩溃。有谁知道一种允许连续输入的方法?
好工作。为我工作
对于Jens Rantil: GETKEY并不像代码所暗示的那么简单。例如,GINPUT需要一个轴(如果不存在,将创建一个轴),并且只能捕获几个键。
GetKey不具有此行为,并且可以更灵活,因为它可以在没有图形输出的代码中使用。
该计划是不可辩护的,因为它可以使用
(忽略,ignore2、键码)= ginput (1);
对我来说,这工作做得非常好。
对Fred Kluger说:你可以在任何你想从用户那里得到一个单键响应的地方使用这个。你可以像使用一样使用它(这需要一个额外的“enter”)
埃里克:? ?
乔斯
我怎么用这个?
太棒了!我一直在寻找这样的东西。
只是我在寻找什么。
克里斯,你能详细解释一下吗?运行
'for i = 1:100, a = input('Enter a letter','s'), end',我没有看到任何违规。(多少是这么多?)
Jos,也许你可以写一个伴随函数来输出按下的键,而不是等待一个,作为INPUT?我真的不知道任何方式-包括通过'currentkey'数字属性-在Matlab中做那,一个解决方案将是非常有帮助的。
谢谢你。
R13中的输入函数包含一个错误,在循环中不刷新键盘缓冲区,这意味着在这么多调用之后,键盘将停止工作。
因此,getkey对我特别有用。谢谢你给我这个机会。