WindowKeyPressFcn 停止被调用
WindowKeyPressFcn stops being called
我正在对 EEGlab 的 eegplot
功能(例如 vim 式导航等)进行一些修改,这些修改需要通过 WindowKeyPressFcn
.
但是,由于某种原因没有调用回调。我已经调试这个问题一段时间了,有点迷路了。我正在寻找有关可能出错的建议。不幸的是,eegplot
函数很大、很复杂并且有些令人费解,我无法在一个简单的示例中重现该问题。因此,我正在寻找关于为什么 WindowKeyPressFcn
中明确存在的函数句柄可能会在某个时候停止使用的一般性建议。
这是我到目前为止学到的东西:
- 如果我在
eegplot
中进入调试模式(在设置函数 [eegplot 的前半部分] 附近设置断点)我能够 运行 WindowKeyPressFcn
至少一次。
- 但是 - 该函数在调试期间的某个时刻停止被调用(有时甚至在仅被调用一次之后)。
- 如果我 运行
eegplot
没有调试(即等待它完成并 return 控制给我)我无法通过按 a 来调用 WindowKeyPressFcn
钥匙。函数句柄仍然存在于图中的 WindowKeyPressFcn
属性。
当我按下一个键时 WindowKeyPressFcn
没有被使用时,我仍然可以调用它:
figh = gcf;
fun = get(figh, 'WindowKeyPressFcn');
ev.Key = 'rightarrow';
ev.Character = ' ';
ev.Modifier = [];
feval(fun, figh, ev);
所以函数句柄可以说是 'healthy',但由于某种原因,当按下一个键并且图形具有焦点时,它不再被使用。什么时候以及为什么会发生这样的事情?关于我应该检查以了解此问题的事情有什么想法吗?
更新:
我发现 WindowKeyPressFcn 回调有时会被某些 window 监听器阻止,并尝试了以下解决方案:
hManager = uigetmodemanager(gcf);
set(hManager.WindowListenerHandles,'Enable','off');
它不起作用 - 当我按下一个键时仍然没有调用 WindowKeyPressFcn。 :(
更新 2:
另一件事不起作用:
chld = get(gcf, 'Children');
tp = get(chld, 'type');
chld = chld(strcmp(tp, 'uicontrol'));
set(chld, 'KeyPressFcn', @eegplot_readkey_new)
(eegplot_readkey_new
是我用来对按键做出反应的函数)
更新 3:
还有一个不工作:
addlistener(gcf, 'WindowKeyPress', @eegplot_readkey_new);
好的 - 我想出来了,尽管至少可以说这个解决方案很奇怪。
由于某些神秘原因,使用 linesmoothing
未记录的 属性 会阻止 WindowKeyPressFcn
被调用。我完全不知道为什么...
我正在对 EEGlab 的 eegplot
功能(例如 vim 式导航等)进行一些修改,这些修改需要通过 WindowKeyPressFcn
.
但是,由于某种原因没有调用回调。我已经调试这个问题一段时间了,有点迷路了。我正在寻找有关可能出错的建议。不幸的是,eegplot
函数很大、很复杂并且有些令人费解,我无法在一个简单的示例中重现该问题。因此,我正在寻找关于为什么 WindowKeyPressFcn
中明确存在的函数句柄可能会在某个时候停止使用的一般性建议。
这是我到目前为止学到的东西:
- 如果我在
eegplot
中进入调试模式(在设置函数 [eegplot 的前半部分] 附近设置断点)我能够 运行WindowKeyPressFcn
至少一次。 - 但是 - 该函数在调试期间的某个时刻停止被调用(有时甚至在仅被调用一次之后)。
- 如果我 运行
eegplot
没有调试(即等待它完成并 return 控制给我)我无法通过按 a 来调用WindowKeyPressFcn
钥匙。函数句柄仍然存在于图中的WindowKeyPressFcn
属性。 当我按下一个键时
WindowKeyPressFcn
没有被使用时,我仍然可以调用它:figh = gcf; fun = get(figh, 'WindowKeyPressFcn'); ev.Key = 'rightarrow'; ev.Character = ' '; ev.Modifier = []; feval(fun, figh, ev);
所以函数句柄可以说是 'healthy',但由于某种原因,当按下一个键并且图形具有焦点时,它不再被使用。什么时候以及为什么会发生这样的事情?关于我应该检查以了解此问题的事情有什么想法吗?
更新:
我发现 WindowKeyPressFcn 回调有时会被某些 window 监听器阻止,并尝试了以下解决方案:
hManager = uigetmodemanager(gcf);
set(hManager.WindowListenerHandles,'Enable','off');
它不起作用 - 当我按下一个键时仍然没有调用 WindowKeyPressFcn。 :(
更新 2:
另一件事不起作用:
chld = get(gcf, 'Children');
tp = get(chld, 'type');
chld = chld(strcmp(tp, 'uicontrol'));
set(chld, 'KeyPressFcn', @eegplot_readkey_new)
(eegplot_readkey_new
是我用来对按键做出反应的函数)
更新 3:
还有一个不工作:
addlistener(gcf, 'WindowKeyPress', @eegplot_readkey_new);
好的 - 我想出来了,尽管至少可以说这个解决方案很奇怪。
由于某些神秘原因,使用 linesmoothing
未记录的 属性 会阻止 WindowKeyPressFcn
被调用。我完全不知道为什么...