WindowKeyPressFcn停止被调用

时间:2015-01-18 16:56:24

标签: matlab user-interface eeglab

我正在对EEGlab的eegplot功能(如vim式导航等)进行一些修改,需要通过WindowKeyPressFcn来完成。
但是,由于某种原因,没有调用回调。我已经调试了一段时间的问题而且有点迷失了。我正在寻找可能出错的建议。不幸的是,eegplot函数很大,很复杂,有些复杂,我无法在一个简单的例子中重现这个问题。因此,我正在寻找关于为什么WindowKeyPressFcn中明确存在的函数句柄可能在某些时候停止使用的一般性建议。

这是我到目前为止所学到的:

  • 如果我在eegplot进入调试模式(在设置函数[eegplot的前半部分]附近设置断点),我至少可以运行WindowKeyPressFcn一次。
  • 然而 - 在调试期间某个时刻停止调用该函数(有时甚至在被调用一次之后)。
  • 如果我在没有调试的情况下运行eegplot(等待它完成并将控制权交还给我),我无法通过按键调用WindowKeyPressFcn。函数句柄仍然存在于图的WindowKeyPressFcn属性中。
  • 当我按一个键时,WindowKeyPressFcn没有被使用,我仍然可以用它来调用:

    figh = gcf;
    fun = get(figh, 'WindowKeyPressFcn');
    ev.Key = 'rightarrow';
    ev.Character = ' ';
    ev.Modifier = [];
    feval(fun, figh, ev);
    

因此,函数句柄可以说是'健康',但由于某些原因,当按下某个键并且图形具有焦点时,它不再被使用。何时以及为何会发生这样的事情?关于我应该检查以解决这个问题的任何想法?

更新
我发现一些窗口监听器有时会阻止WindowKeyPressFcn回调,并尝试了以下解决方案:

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);

1 个答案:

答案 0 :(得分:0)

好的 - 我把它搞定了,尽管解决方案至少可以说是奇怪的。 出于某些神秘的原因,使用linesmoothing未填充的属性会阻止WindowKeyPressFcn被调用。我完全不知道为什么......