-
Каким еще образом можно из вторичного потока инициировать вызов метода в контексте главного потока кроме как Control.Invoke?
Дело в том, что основной поток - это плугин к офисному приложению и в моем распоряжении нет ни одного экземпляра Control.
-
Варианты - свой контрол у плагина, например невидимый - Application.AddMessageFilter - WndProc и SendMessage (или PostMessage)
-
Невидимый свой контрол не прокатывает, уже пробовал. Выскакивает исключение что-то типа "невозможно вызвать то-то, пока окно не то-то и не то-то". В общем так обмануть у меня не получилось. С сообщениями на мой взгляд самый легкий и логичный способ, но блин как же: 1. отправить сообщение 2. принять его.
Нужно ведь иметь окно и свою оконную процедуру. В вин32 это без проблем, а вот как в дотнете?
-
Так же как и в Win32, найди окно приложения( получи HWND) и вперед - для этого делать вызовы нативных функций системы из соотвествующих длл (ключевое слово Interop). А вот с невидимым контролом - интересно, что именно ты делал и что он тебе не дал сделать, какие сообщения об ошибке?
-
Если инвоук вызывать у "фиктивного" невидимого контрола, то вылетает исключение
Additional info: "Невозможно вызвать Invoke или BeginInvoke для элемента управления до завершения создания дескриптора окна."
То же самое происходит, если я переношу этот код в модуль своей формы и использую саму форму для вызова invoke. Форма показывается модально, но после закрытия не уничтожается, а просто становится невилимой.
-
Делай через Invoke, проще будет. Просто дескриптор может быть не создан до обращения к нему. Сделай в конструкторе своего невидимого окна такую строку IntPtr hwnd=this.Handle; Тогда после вызова конструктора у тебя уже будет готовый дескриптор.
-
|