0

我正在尝试运行一个在 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') 并且我的键盘在那里(并且没有其他键盘)。

谢谢你的帮助!

4

2 回答 2

1

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

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

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

于 2021-01-22T15:48:53.393 回答
0

这一直是 MacO 的一大痛点。我使用这段代码:

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

于 2021-01-21T15:21:02.097 回答