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

问题描述

我正在尝试运行一个在 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”退出循环