Я пытаюсь написать специализированную экранную клавиатуру (OSK) для приложения, которое пишу на C #.Чтобы облегчить это, я создал форму, в которой есть несколько кнопок, представляющих клавиши, и щелчок по ним вызывает SendKeys
и отправляет соответствующие ключи.
Эта форма принадлежит открытому главному окну.при первом запуске приложения, используя свойство Owner
.Таким образом, OSK выскакивает всякий раз, когда пользователь фокусирует приложение, и он остается поверх главного окна, если говорит, что главное окно перетаскивается поверх него.
Это все прекрасно работает, но у меня есть модальные диалогичто я также хочу использовать с OSK, я попытался создать его в отдельном потоке, в комплекте с его собственным циклом сообщений (через Application.Run
), чтобы его можно было использовать с любыми модальными диалогами в основном потоке.
Проблема в том, что, очевидно, нахождение в отдельном потоке может вызвать InvalidOperationException
s из-за перекрестных вызовов.Один конкретный пример этого - при вызове Application.Run(osk)
из нового потока возникает ошибка перекрестного потока, потому что он пытается обновить дескриптор окна с владельцем (главное окно).
Мой вопрос:Возможно ли иметь форму собственности в теме, которая отделена от владельца безопасным способом?И, если это не удастся, возможно ли эмулировать характеристики собственной формы (а именно быть всегда сверху только для основного окна и появляться, когда основное окно сфокусировано)?
Спасибо, и извините, если этосбивает с толку.