图像缩略图

getkey

版本2.1 (2.8 KB) JOS(10584)
得到一个键盘按键
4.7
20评级

23下载

更新2019年2月11日

视图版本历史

查看许可证

编辑注意:这个文件被选为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中央文件交换。检索

意见及评分(46

但丁

muhame阿里

这就是我一直在找的东西……谢谢

rik.

很好的提交。我正在浏览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也不存在)

昌洪

JOS(10584)

液体喷射加工

嗨JOS,

我很难停止GetKey绘制一个数字。我尝试过套装(0,'defaultfigurevisible','关闭');并向图形代码添加“可见”,“关闭”,但这些不起作用。

我如何在没有图形窗口的情况下使用这个函数?

谢谢!

MatBzzzz

谢谢! !

默罕默德RSMY

嗨乔斯

谢谢你的盛情款待。我是matlab的新手,不知道如何使用你的函数来帮助我。我需要代码输入“名称”,然后按enter,没有触摸键盘。你能帮个忙吗…谢谢

TG

谢谢,很漂亮地走。虽然,对于键盘控制器实现,最好使用来自Psysctoolbox的Kbcheck,如下所述。

哈维尔·巴尔德斯

S.

JOS(10584)

@奥斯卡,

我建议你在硬盘上创建一个文件夹叫“FEXfiles”之类的。将该文件夹添加到您的matlab路径(请参阅文档如何做)。现在,将从文件交换中下载的文件放到该文件夹中,您应该能够运行它。

奥斯卡亚历杭德罗

对不起,我是新来的,当我下载文件时,我把它放在哪个文件夹里?

Simon Traberg-Larsen

佬司Henrik Bolstad

允许我做批处理工作与按键,也完成工作使用esc键!只是太棒了!

达内尔

伟大的计划。是否有一种方法可以将此程序与getkeywait程序中以前实现的计时器元素合并,以便您可以为每个多按键使用时间限制?

玉兰刘

好工作!然而,由于我正在运行几个并行函数,我真的希望隐藏命令窗口,同时保持数字在顶部…有什么建议吗?我正在尝试使用matlabpool,让我看看是否会工作或不…

Chaowei Chen.

好了,我知道怎么用了。不是我想象的,但我可以解决。谢谢!

Chaowei Chen.

很棒的代码!乔斯。

你能解释一下“获得多个按键的能力”是什么意思吗?

我以为是,当我“释放”我的手指时,GetKey输出控制+ Shift

我目前的印象是,当我点击“control”时,getkey输出“control”。

还没机会按"移位"键呢

JOS(10584)

您可以修改该函数。执行for循环获得两个字符。如果你需要更多的帮助,请发邮件给我。

阿里

在我的应用程序,用户应该写两个不同的字符连续和非常快。如果用户输入字符变慢,也没有问题。然而,当用户快速地接连写出两个不同的字符时,代码无法捕获它们。相反,它一次又一次地只读取其中一个字符。你对此有什么建议吗?谢谢

法汉曼

嘿everone !!
谁能给我一个按键功能和按键功能的代码?
实际上,我想做的是,当一个特定的键,例如向上方向键被按下时,球开始绕圈移动,直到按下这个键。
一旦突出的钥匙,球就会停止在圆圈中移动。
提前感谢:)

法汉曼

在上面的帖子中,“停止移动”,我打算意味着“停止移动在圆圈”,而是在切线方向上移动到圆形路径。希望它澄清我的问题。

JOS(10584)

@andrew b:谢谢!我已经实施了大多数建议。新版本应该很快起来。
“位置”问题(如果有的话)是不容易解决的,因为它似乎依赖于操作系统,显示设置,ML版本…

安德鲁乘坐

伟大的工作。

我做了一些调整,你可能有兴趣执行。

我在图中添加了以下属性:
'numbertitle','关闭'
'position',[0 -40 1 1]
“名称”、“按下一个键的

在Windows上,这将使图形远离屏幕,而不是在任务栏后面。这将有助于确保图形不可见,因为一些用户可能会把他们的任务栏放在屏幕上的其他地方。

用户也可能最大化图形,然后关闭它,这将导致在试图删除图形句柄时出现错误。为了防止这种情况,请使用以下代码:

如果ishandle(跳频)
删除(fh);
结尾

AwedBy Matlab

谢谢乔斯。你知道我如何检测左/右方向键的按键吗?我知道它必须涉及WindowKeyPressFcn的使用,但我不知道如何在语法中使用它,因为在Matlab帮助没有例子!

JOS(10584)

@catalin,一个图形窗口和GUI窗口基本相同,Matlab图。两者都有允许在按下键时执行代码(回调)的属性,并且该图具有焦点。

GETKEY主要用于在命令窗口中执行代码。

AwedBy Matlab

我有与Priyanshu相同的问题,即我需要能够阅读按键,但不失去当前窗口的焦点(这不是GUI,但只是一个图形!)我不知道你建议的解决方案是什么,乔斯,你能详细说明一下吗?

JOS(10584)

@ Priyanshu,这不是为图形用户界面设计的。使用按键回调的gui窗口代替。

Priyanshu阿加瓦尔

这个函数不能很好地与GUI一起工作。一旦在GUI函数的循环中重复调用此函数,当前GUI图的焦点就会丢失。在这种情况下有什么办法可以做吗?

杰夫Vipperman

很好,但我把它放在一个循环中,我使用getkey()赋值给一个向量的第I个值。如果我按下CTRL键(到CTRL- c并跳出循环),它会在每次循环中停止暂停以接受输入。

亚伦

我还应该添加这个函数不等待输入。因此,如果在调用时没有按下键,则会被绕过,这很好地用于循环。

亚伦

嘿伙计们,我知道Tristan并告诉他这个解决方案,并决定我在这里发布,以防任何其他人有这个问题。我下载了Psysctoolbox(http://psychtoolbox.org/wikka.php?wakka=HomePage),它是免费的,它有一个名为KbCheck()的命令。它可以在任何时间读取键盘输入,甚至在无限的while循环期间。我用它驱动一个移动机器人,使用WASD键。注意:KbCheck输出一个奇怪的键代码,使用KbName转换为ASCII。

JOS(10584)

@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不具有此行为,并且可以更灵活,因为它可以在没有图形输出的代码中使用。

Jens Rantil

该计划是不可辩护的,因为它可以使用
(忽略,ignore2、键码)= ginput (1);

杰伊沃恩

对我来说,这工作做得非常好。

乔斯·范德·吉斯特

对Fred Kluger说:你可以在任何你想从用户那里得到一个单键响应的地方使用这个。你可以像使用一样使用它(这需要一个额外的“enter”)

埃里克:? ?

乔斯

弗雷德·克鲁格

我怎么用这个?

Erik Helberg

帕特里克Craston

太棒了!我一直在寻找这样的东西。

乔治·奥曼

只是我在寻找什么。

Dimitri Shvorob.

克里斯,你能详细解释一下吗?运行
'for i = 1:100, a = input('Enter a letter','s'), end',我没有看到任何违规。(多少是这么多?)
Jos,也许你可以写一个伴随函数来输出按下的键,而不是等待一个,作为INPUT?我真的不知道任何方式-包括通过'currentkey'数字属性-在Matlab中做那,一个解决方案将是非常有帮助的。
谢谢你。

克里斯-布朗

R13中的输入函数包含一个错误,在循环中不刷新键盘缓冲区,这意味着在这么多调用之后,键盘将停止工作。

因此,getkey对我特别有用。谢谢你给我这个机会。

MATLAB版本兼容性
创建R2018b
与任何版本兼容
平台兼容性
窗户 苹果系统 Linux.

社区寻宝

找到Matlab Central中的宝藏,并发现社区如何帮助您!

开始狩猎!