残念ながら、キーを押すイベントをリッスンしようとすると問題が発生します。最小限の例を作成し、この問題を再現できるかどうかを確認しました。
それを再現するには、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