问题描述
我正在尝试运行一个在 PsychtoolBox-3 中编码的程序,该程序应该注册一个按键。但是当我运行它时,即使只是命令窗口中的这一部分,它也不会响应 E、P 键(或任何键),我必须使用 Ctrl-C 停止操作。我尝试将其更改为 {e,p}(这是我使用 KbName('KeyNames') 找到的名称),但它不起作用。 相同的代码适用于我主管的计算机 - 我使用的是装有 OS 11.1 的 Mac。
KbName('unifyKeyNames');
keyresp = KbName({'E','P'});
key = 0;
while ~key
[key,tkey] = CheckKeyPress(keyresp);
end
CheckKeyPress 就是这个函数(它可以工作 - 给出输出 0):
function [key,tkey] = CheckKeyPress(whichkeys)
if nargin < 1 || isempty(whichkeys)
whichkeys = 1:256;
end
key = 0;
[iskeydown,tkey,keys] = KbCheck(-1);
if any(keys(whichkeys))
key = find(keys(whichkeys),1);
end
end
我也试过查看 PsychHID('Devices') 并且我的键盘在那里(没有其他键盘)。
感谢您的帮助!
解决方法
解决了!这是一个简单的 mac 问题:)
在我尝试 KbQueueCreate 并收到一条错误消息后,我在另一个线程上发现了相同的消息 - 唯一的问题是我必须允许 Matlab 访问我笔记本电脑上的键盘输入。
设置 - 安全和隐私 - 输入监控
,MacOs 总是一个很大的痛点。我使用此代码:
close all
clear all
clc
ListenChar(0);
Devices=PsychHID('Devices');
keyboardsIDs = [];
for iiD = 1:numel(Devices)
try
KbQueueCreate(Devices(iiD).index);
KbQueueStart(Devices(iiD).index);
keyboardsIDs(end+1,1) = Devices(iiD).index;
end
end
stopScript = 0;
while ~stopScript
for iiD = 1:numel(keyboardsIDs)
[keyIsDown,firstPress]=KbQueueCheck(keyboardsIDs(iiD));
if keyIsDown
keyID = find(firstPress)
disp(keyID)
if any(keyID ==20),stopScript =1; end
end
end
end
for iiD = 1:numel(keyboardsIDs)
KbQueueStop(keyboardsIDs(iiD));
end
ListenChar();
更新
这是一个有点肮脏的解决方法,但它适用于任何情况。
按“q”退出循环