【发布时间】:2015-09-19 23:01:35
【问题描述】:
我想在用户按住控制键并在图形窗口上按下回车键时进行捕捉。注意:这是编辑器中“评估当前部分”的默认键。
参见下面的示例代码:
function test
f = figure;
f.KeyPressFcn = @myKeyPressFcn;
end
function myKeyPressFcn ( hFig, event )
cm = hFig.CurrentModifier();
if ~isempty ( cm )
fprintf ( 'CurrentKey: %s:%s\n', cm{1}, hFig.CurrentKey );
else
fprintf ( 'CurrentKey: %s\n', hFig.CurrentKey );
end
end
要重现将上述内容保存在编辑器中的活动文件中并运行该功能 - 需要打开编辑器(这很重要!!)。
当图形处于活动状态时,按任意键 -> 所选键被写入终端窗口。但是,如果您按住 Control 并按 enter(return)键,那么这不会被捕获,而是 Matlab 会尝试在编辑器中“评估当前部分”(或以前称为的单元格)(无论图中是否有重点)。这当然会抛出错误......
我已联系 Matlab 支持,这是“预期行为!”。我可以(几乎)明白为什么它可能是演示的好主意 - 但对于在 Matlab 中运行的专业应用程序,我个人认为这个“功能”是一个错误!
注意事项
- 当编辑器关闭时,图中捕获到 control+enter
- 在已部署的应用程序中,会捕获 control+enter。
- 如果我手动更改 Evaluate Current Section 快捷方式,则会捕获 control+enter。
我已经尝试了很多方法来解决这个问题,但都没有奏效,例如隐藏编辑器或将编辑器启用状态设置为 false(这些都不是可接受的解决方案 - 我试图看看我可以做什么一个小测试用例...):
function test
desktop = com.mathworks.mde.desk.MLDesktop.getInstance;
jEditor = desktop.getGroupContainer('Editor').getTopLevelAncestor;
jEditor.setVisible(false);
jEditor.setEnable(false);
f = figure
f.KeyPressFcn = @myKeyPressFcn;
uiwait(f);
jEditor.setVisible(true);
jEditor.setEnable(true);
end
我可以让它工作的唯一方法是在启动 GUI 时关闭所有编辑器文件,然后在 GUI 关闭时再次打开它们(这不是一个可接受的解决方案...... - 原因相当明显!! )
我确实考虑过尝试临时修改“评估当前部分”的快捷键(Preferences-Keyboard-Shortcuts) -> 但还没有找到从命令行执行此操作的方法,然后将其设置回来完成后再次。如果速度很快,您可以在用户按下并释放控制键时执行此操作。
那我在问什么:
如果可能的话,我需要一个适用于任何地方的任何人的解决方案 - 就好像我可以让它工作一样,它将包含在 my Matlab GUI Toolbox 的一个新附加功能中。 - 世界各地的人们都在使用它。
- 您知道如何从命令行修改键盘快捷键吗?如果知道的话!
- 还有其他建议吗?
- 我的另一个想法是将我的快捷键更改为不同的组合键 - 但其中的乐趣在哪里! :)(如果某处的某个用户将执行当前单元格更改为我的新组合,我仍然会遇到问题......)
附言感谢您阅读这篇文章! :)
【问题讨论】:
-
在我看来,这在较新的 MATLAB 版本中已修复。 (在 MATLAB 2016b、Ubuntu 16.04 上测试)
-
刚刚在 R2019a、Win10 上测试过。它不会“评估单元格”,但也不会触发“输入”键的事件。
标签: matlab keyboard keyboard-shortcuts enter