Вызовите ShowDialog () без фактического отображения формы - PullRequest
1 голос
/ 13 июля 2010

Мне нужно позвонить ShowDialog() на моем Form без его фактического отображения диалогового окна (оставьте Visible на false). К сожалению, VisibleChanged событие не происходит, как это происходит в полной структуре. Я также не могу переопределить свойство Visible. Самое близкое, что я могу придумать, это переопределить OnLoad и вызвать Hide в новом потоке (поскольку видимость формы устанавливается после ее загрузки). Это, очевидно, сумасшедший взлом (не говоря уже о том, что он выглядит очень плохо, так как вы можете видеть, как форма рисуется, а затем скрывается на экране), но я действительно не могу найти другой способ сделать это. Есть идеи?

Редактировать: мне нужно позвонить ShowDialog(), потому что я работаю с ошибочной сторонней библиотекой, которая работает только тогда, когда вызывается в форме, подобной этой, и в моем сценарии у меня нет необходимости или желания какого-либо пользовательского интерфейса. Я подтвердил ошибку с третьей стороной, но в настоящее время у них нет ресурсов, чтобы решить эту проблему, поэтому я застрял с каким-то сумасшедшим обходным путем.

Edit2: Вот более конкретная информация о моей проблеме:

Это работает:

MyForm_OnLoad(...)
{
    thirdPartyLib.StartUp(MyCallback);
}

private void MyCallback(...)
{
    // Do some work with the data passed in.
}

Это не:

public static void Main()
{
    thirdPartyLib.StartUp(MyCallback);
    // Sleep for a bit to allow the library to fire the callback.
    // Normally, the callback is triggered several times a second.
    Thread.Sleep(20000);
}

private void MyCallback(...)
{
    // This callback is never invoked by the library.
}

Так что единственный способ заставить вещи работать - это использовать библиотеку в Form. К сожалению, я не хочу отображать форму в своем приложении, поэтому я пытаюсь использовать форму, чтобы утешить библиотеку, но не отображать ничего, чтобы приспособить мое приложение. Я открыт для предложений.

Обратите внимание, что API-интерфейс winforms компактной платформы не поддерживает прозрачность и не имеет события OnShown (ни VisibleChanged).

Edit3: Извините, ребята, я не собираюсь быть расплывчатым, я просто не хотел потеряться в деталях, которые не были актуальны. Сторонняя библиотека захватывает изображения со специальной камеры, подключенной через USB. Функция обратного вызова запускается с парой различных параметров, чтобы указать текущее состояние и данные изображения с камеры.

Ответы [ 2 ]

1 голос
/ 14 июля 2010

Похоже, что сторонняя библиотека использует для отправки сообщений Windows сообщения, хотя вы до сих пор не до конца понимаете, в чем именно заключается проблема, и, кажется, слишком сосредоточены на подходе, который вы выбрали, который я до сих пордумаю, что это неправильно.

Если причина, по которой вам нужен элемент управления в окне, заключается в том, что он использует сообщения Windows для диспетчеризации, то вы, вероятно, можете обойти проблему с помощью MessageWindow, чтобы утопитьсообщениями или через ваши собственные вызовы GetMessage / TranslateMessage / DispatchMessage.

Опять же, расскажите нам, какова реальная корневая проблема, а не трудности, с которыми вы сталкиваетесь с решением, которое вы пытаетесь реализовать.

0 голосов
/ 14 июля 2010

Вот способ минимизировать форму, поскольку у вас нет FormWindowState.Minimized, доступного в компактной среде.

http://christian -helle.blogspot.com / 2007/06 / программно-свернуть-application.html

...