为什么 Psychtoolbox 中的 KbCheck 没有注册键盘输入?

Why is KbCheck in Psychtoolbox not registering keyboard input?

我正在尝试 运行 一个用 Psychtoolbox-3 编码的程序,它应该注册一个按键。但是当我 运行 它时,即使只是命令 window 的这一部分,它也不会响应 E、P 键(或任何键),我必须使用 Ctrl-C 停止操作。我尝试将其更改为 {e, p}(这是我使用 KbName('KeyNames') 找到的名称),但它不起作用。 相同的代码适用于我主管的计算机 - 我正在使用 Mac 和 OS 11.1.

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'),我的键盘在那里(没有其他键盘)。

感谢您的帮助!

一直是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'退出循环

已解决!这是一个简单的 mac 问题 :)

在我尝试 KbQueueCreate 并收到一条错误消息后,我在另一个线程上发现了相同的错误消息 - 唯一的问题是我必须允许 Matlab 访问笔记本电脑上的键盘输入。

设置 - 安全和隐私 - 输入监控