Matlab WindowKeyPress(又称WindowKeyPress事件和KeyPress FCN)不';t按下“后触发”;alt tab";拿着钥匙一会儿

Matlab WindowKeyPress(又称WindowKeyPress事件和KeyPress FCN)不';t按下“后触发”;alt tab";拿着钥匙一会儿,matlab,matlab-figure,Matlab,Matlab Figure,不幸的是,我在尝试聆听按键事件时遇到了问题。我已经为你做了一个简单的例子,并检查你是否可以重现这个问题 若要复制该图像,请按alt tab两次(从图中调出焦点,然后再次调焦),然后按住一个键一段时间(即3秒钟),然后松开该键。现在按下任意字母键,您将看到它将触发长按住键的释放,或者根本不会触发任何事件 我认为这与java助记符有关,因为其他键如ctrl、alt、cmd等总是会触发按下事件……但这只是一个猜测。我在mac上使用matlab,问题发生在HG1和HG2上。有人知道如何避免这个问题吗 以

不幸的是,我在尝试聆听按键事件时遇到了问题。我已经为你做了一个简单的例子,并检查你是否可以重现这个问题

若要复制该图像,请按alt tab两次(从图中调出焦点,然后再次调焦),然后按住一个键一段时间(即3秒钟),然后松开该键。现在按下任意字母键,您将看到它将触发长按住键的释放,或者根本不会触发任何事件

我认为这与java助记符有关,因为其他键如ctrl、alt、cmd等总是会触发按下事件……但这只是一个猜测。我在mac上使用matlab,问题发生在HG1和HG2上。有人知道如何避免这个问题吗

以下是测试功能:

function tabPlotIssue()

figH=figure(1);

if feature('UseHG2')
  pressListener=addlistener(figH,'WindowKeyPress',...
    @keyPressFcn);                              
  releaseListener=addlistener(figH,'WindowKeyRelease',...
    @keyRelease);                            
else             
  pressListener=addlistener(figH,'WindowKeyPressEvent',...
    @keyPressFcn);
  releaseListener=addlistener(figH,'WindowKeyReleaseEvent',...
    @keyRelease);                            
end              

function keyPressFcn(a,b)
  disp('Pressed a key:')
  if feature('UseHG2')  
    mChar = b.Character;                      
  else
    mChar = b.Source.CurrentCharacter;
  end
  disp(mChar)
  % pressListener.Enabled = 'off'; % This is not needed to reproduce
  % the issue, but it is good in case you don't want to trigger
  % pressed key many times and make the visualization harder.
end

function keyRelease(a,b)
  disp('Released a key:')
  if feature('UseHG2')   
    mChar = b.Character;
  else
    mChar = b.Source.CurrentCharacter;
  end
  disp(mChar)
  % pressListener.Enabled = 'on'; % This is not needed to reproduce
  % the issue, but it is good in case you don't want to trigger
  % pressed key many times and make the visualization harder.
end

end
>> tabPlotIssue
>> Pressed a key: % Here I pressed alt-tab
>> Released a key: % Here I released alt-tab
>> Pressed a key: % Here I pressed q for a short time
q
>> Released a key: % Here I pressed w
q
>> Released a key: % and so on
q
>> Released a key:
q
>> Released a key:
q
>> Released a key:
q
>> Pressed a key: % Pressed alt
>> Released a key: % Released alt
>> Released a key: % Released any other key
>> Released a key: % and so on
>> Released a key:
以及显示问题的输出:

function tabPlotIssue()

figH=figure(1);

if feature('UseHG2')
  pressListener=addlistener(figH,'WindowKeyPress',...
    @keyPressFcn);                              
  releaseListener=addlistener(figH,'WindowKeyRelease',...
    @keyRelease);                            
else             
  pressListener=addlistener(figH,'WindowKeyPressEvent',...
    @keyPressFcn);
  releaseListener=addlistener(figH,'WindowKeyReleaseEvent',...
    @keyRelease);                            
end              

function keyPressFcn(a,b)
  disp('Pressed a key:')
  if feature('UseHG2')  
    mChar = b.Character;                      
  else
    mChar = b.Source.CurrentCharacter;
  end
  disp(mChar)
  % pressListener.Enabled = 'off'; % This is not needed to reproduce
  % the issue, but it is good in case you don't want to trigger
  % pressed key many times and make the visualization harder.
end

function keyRelease(a,b)
  disp('Released a key:')
  if feature('UseHG2')   
    mChar = b.Character;
  else
    mChar = b.Source.CurrentCharacter;
  end
  disp(mChar)
  % pressListener.Enabled = 'on'; % This is not needed to reproduce
  % the issue, but it is good in case you don't want to trigger
  % pressed key many times and make the visualization harder.
end

end
>> tabPlotIssue
>> Pressed a key: % Here I pressed alt-tab
>> Released a key: % Here I released alt-tab
>> Pressed a key: % Here I pressed q for a short time
q
>> Released a key: % Here I pressed w
q
>> Released a key: % and so on
q
>> Released a key:
q
>> Released a key:
q
>> Released a key:
q
>> Pressed a key: % Pressed alt
>> Released a key: % Released alt
>> Released a key: % Released any other key
>> Released a key: % and so on
>> Released a key:

更新:

我已经将keyRelease函数更改为如下所示,但它会停止侦听事件触发器。我注意到它甚至会停止听cmd+w,这个数字对几乎所有的触发器都没有响应。如果你能告诉我,我将不胜感激

function keyRelease(a,b)
  disp('Released a key:')
  if feature('UseHG2')
    mChar = b.Character;
  else
    mChar = b.Source.CurrentCharacter;
  end
  disp(mChar)
  % pressListener.Enabled = 'on'; % This is not needed to reproduce
  % the issue, but it is good in case you don't want to trigger
  % pressed key many times and make the visualization harder.
  delete(pressListener)
  delete(releaseListener) 
  if feature('UseHG2')                                                      
    pressListener=addlistener(figH,'WindowKeyPress',...           
      @keyPressFcn);                              
    releaseListener=addlistener(figH,'WindowKeyRelease',...       
      @keyRelease);                            
  else                                                                      
    pressListener=addlistener(figH,'WindowKeyPressEvent',...
      @keyPressFcn);
    releaseListener=addlistener(figH,'WindowKeyReleaseEvent',...
      @keyRelease);                            
  end                                                                       
end

这可能与按下5次时alt键是mac上暂停键盘的键有关:

系统首选项>通用访问>鼠标和触摸板(或鼠标)> 鼠标键>关闭


顺便说一句,有时候它需要不止一个alt-tab续集。你知道alt会触发菜单,因此你应该小心使用它。还是我没抓住重点?@OlegKomarov好吧……我应该能够做alt tab,这不会影响按下和释放事件的行为。