0

残念ながら、キーを押すイベントをリッスンしようとすると問題が発生します。最小限の例を作成し、この問題を再現できるかどうかを確認しました。

それを再現するには、alt-tab を 2 回押し (図からフォーカスを外し、再度フォーカスするため)、キーをしばらく (つまり 3 秒間) 押し続けて離します。任意の文字キーを押すと、長押しキーからのリリースがトリガーされるか、イベントがまったくトリガーされないことがわかります。

ctrl、alt、cmd などの他のキーは常にプレスイベントをトリガーするため、Java ニーモニックと関係があると思いますが、それは単なる推測です。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:

アップデート:

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
4

1 に答える 1