У меня есть надстройка Excel, написанная на Delphi, в которой есть форма VCL с TMemo.
Когда я пытаюсь ввести текст в заметку, вместо этого вводится Excel.
Когда я запускаю модальную форму (ShowModal
), все работает нормально, но, очевидно, невозможно одновременно работать с главным окном Excel и окном надстройки.
Кажется, что проблема в точности похожа на этот вопрос: Немодальная форма не может получать ввод с клавиатуры в надстройке Excel, разработанной Delphi
Этот ответ предлагает обработать WM_PARENTNOTIFY
, поэтому я попробовал следующее:
TMyForm = class(TForm)
...
procedure OnParentNotify(var Msg: TMessage); message WM_PARENTNOTIFY;
И в этой процедуре пробовали такие вещи, как SetFocus
, WinApi.Windows.SetFocus(self.Handle)
, SetForeGroundWindows
, SetActiveWindow
, но, похоже, это не сработало.
Другие предложения, которые я прочитал: запустить пользовательский интерфейс в другом потоке (что, конечно, невозможно с VCL) и установить клавиатуру с SetWindowsHookEx
. Очевидно, это даст нам события нажатия клавиш, но не уверен, что с ними делать.
Я не использую сторонние инструменты, такие как Add-In Express, а просто реализую IDTExtensibility2
.
РЕДАКТИРОВАТЬ: дополнительные исследования показывают, что Office использует интерфейс под названием IMsoComponent и IMsoComponentManager в качестве способа отслеживания активного компонента в приложении. Visual Studio использует их как IOleComponent и IOleComponentManager .
Эта ссылка и Эта одна предлагает зарегистрировать новый пустой IOleComponent / IMsoComponent.
EDIT : MCVE можно получить здесь , это наименьший возможный код Excel AddIn, который запустит форму VCL с TEdit. Редактирование теряет фокус клавиатуры, как только лист активен.