WindowKeyPressFcn перестает вызываться
Я работаю над некоторыми модификациями EEGlab's 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 ответ
Хорошо, я все выяснил, хотя решение странно, если не сказать больше. По какой-то таинственной причине, используя linesmoothing
недокументированное свойство предотвращает WindowKeyPressFcn
от вызова. Я понятия не имею, почему...