2010-07-13 3 views
1

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

Редактировать: Мне нужно позвонить 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 API не поддерживает непрозрачность и не имеет события OnShown (а не VisibleChanged).

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

+4

Можете ли вы объяснить, почему вам нужно позвонить ShowDialog без него показывает? Возможно, кому-то будет полезно дать вам альтернативный подход. – msergeant

+0

@msergeant согласился. Кажется, что есть основная проблема, которую вы пытаетесь решить, и это одно решение.Но может быть что-то лучше, потому что весь смысл того, что что-то показывать в диалоговом режиме, так это то, что они ничего не могут сделать. – spinon

+0

Да. Вместо того, чтобы сообщать нам, как вы решили решить проблему (что почти наверняка неправильно), расскажите нам, какова фактическая проблема, которую вы пытаетесь решить. – ctacke

ответ

1

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

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

Снова сообщите нам, какова фактическая проблема с корнем, а не трудности, с которыми вы сталкиваетесь с решением, которое вы пытаетесь реализовать.

+0

Не совсем ясно, что проблема с библиотекой третьей стороны (они не очень беспокоятся о проблеме). Учитывая пример кода, который у меня есть в основном вопросе сейчас, похоже, что они не будут зависеть от оконных сообщений, поскольку они не подключаются к каким-либо дескрипторам окон или что-то в этом роде. Я попытался вызвать библиотеку в разных потоках, думая, что есть некоторая проблема с потоками с библиотекой, которая вызывает проблему, но это ничего не делало. – Dennis

+0

Я не могу придумать никаких причин, по которым понадобилось бы Окно, если бы ему не приходилось отправлять сообщения с Windows. Возможно, это делается внутренне, возможно, через них можно получить сообщения ОС. Опять же, вы очень расплывчаты в том, что этот контроль или что он должен делать, поэтому все, что мы можем сделать, это догадываться. Почему бы вам не сказать нам, что такое этот контроль и что он должен делать? – ctacke

+0

никогда не недооценивать силу третьей стороны, чтобы сделать что-то совершенно безумное. Те из нас, кто вынужден заниматься главным образом другим кодом, должны были иметь дело с множеством вещей, которые сделали третьи стороны, которые соответствуют форме: «Нет необходимости в том, чтобы X был необходим, но мы делаем это в любом случае, хотя X является антипаттером. –

0

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

http://christian-helle.blogspot.com/2007/06/programmatically-minimize-application.html

+0

Существует не 'OnShown' на компактном фреймворке и нет значения перечисления' FormWindowState.Minimized'. – Dennis

+0

Я могу только вызвать 'ShowWindow' после создания дескриптора окна, который выполняется в' ShowDialog'. Но тогда я мог бы просто использовать 'Hide()', что означает, что я вернусь к тому, что я делаю сейчас. :( – Dennis

+0

Хотелось бы, чтобы был способ создать собственный 'ShowDialog()', но у меня есть ощущение, что .NET использует кучу внутренних и родной материал, чтобы сделать эту работу для реальной версии, поэтому я не знаю, как легко было бы повторно реализовать это. – Dennis

Смежные вопросы