одиночная форма скрыть при запуске

<p>у меня есть приложение с одной формой, и в методе load мне нужно скрыть форму.</p><p>форма будет отображаться сама собой, когда в этом есть необходимость (подумайте в стиле всплывающего окна в стиле outlook 2003), но я не могу понять, как скрыть форму при загрузке без каких-либо проблем.</p><p>какие-либо предложения?</p>

<p>я иду на это из c #, но должно быть очень похоже на vb.net.</p><p>в вашем основном программном файле, в методе main, у вас будет что-то вроде:</p><pre><code>application.run(new mainform()); </code></pre><p>это создает новую основную форму и ограничивает время жизни приложения временем жизни основной формы.</p><p>однако, если вы удалите параметр для application.run (), приложение будет запущено без отображения формы, и вы сможете свободно показывать и скрывать формы сколько угодно.</p><p>вместо того, чтобы скрывать форму в методе load, инициализируйте форму перед вызовом application.run (). я предполагаю, что форма будет иметь notifyicon для отображения значка на панели задач - это можно отобразить, даже если сама форма еще не видна. вызов <code>form.show()</code> или <code>form.hide()</code> из обработчиков событий notifyicon будет показывать и скрывать форму соответственно.</p>

<p>обычно вы делаете это только тогда, когда используете значок в трее или какой-либо другой метод для отображения формы позже, но это будет хорошо работать, даже если вы никогда не отображаете основную форму.</p><p>создайте bool в вашем классе form, который по умолчанию равен false:</p><pre><code>private bool allowshowdisplay = false; </code></pre><p>затем переопределите метод setvisiblecore</p><pre><code>protected override void setvisiblecore(bool value) { base.setvisiblecore(allowshowdisplay ? value : allowshowdisplay); } </code></pre><p>поскольку application.run () устанавливает формы .visible = true после загрузки формы, это будет перехватывать это значение и устанавливать значение false. в приведенном выше случае он всегда будет устанавливать значение false, пока вы не включите его, установив для параметра allowhowdisplay значение true.</p><p>теперь это будет препятствовать отображению формы при запуске, теперь вам нужно снова включить setvisiblecore для правильной работы, установив allowhowdisplay = true. вы захотите сделать это в любой функции пользовательского интерфейса, которая отображает форму. в моем примере это событие левого клика в моем объекте notiyicon:</p><pre><code>private void notifyicon1\_mouseclick(object sender, mouseeventargs e) { if (e.button == system.windows.forms.mousebuttons.left) { this.allowshowdisplay = true; this.visible = !this.visible; } } </code></pre>

<p>я использую это:</p><pre><code>private void mainform\_load(object sender, eventargs e) { if (settings.instance.hideatstartup) { begininvoke(new methodinvoker(delegate { hide(); })); } } </code></pre><p>очевидно, вы должны изменить условие if на ваше.</p>

<pre><code> protected override void onload(eventargs e) { visible = false; // hide form window. showintaskbar = false; // remove from taskbar. opacity = 0; base.onload(e); } </code></pre>

<p>во время создания формы (конструктор, программа main или конструктор форм, в зависимости от ваших целей),</p><pre><code> this.windowstate = formwindowstate.minimized; this.showintaskbar = false; </code></pre><p>когда вам нужно показать форму, предположительно по событию из вашего notifyicon, при необходимости измените ее,</p><pre><code> if (!this.showintaskbar) this.showintaskbar = true; if (this.windowstate == formwindowstate.minimized) this.windowstate = formwindowstate.normal; </code></pre><p>последовательные события show/hide могут проще использовать свойство visible формы или методы show/hide.</p>

<p>попробуйте также скрыть приложение от панели задач.</p><p>для этого используйте этот код.</p><pre><code> protected override void onload(eventargs e) { visible = false; // hide form window. showintaskbar = false; // remove from taskbar. opacity = 0; base.onload(e); } </code></pre><p>благодарю. рухул</p>

<p>я много боролся с этой проблемой, и решение намного проще, чем я. сначала я попробовал все предложения здесь, но потом я не был удовлетворен результатом и исследовал его немного больше. я обнаружил, что если я добавлю:<br></p><pre><code> this.visible=false; /* to the initializecomponent() code just before the */ this.load += new system.eventhandler(this.debugonoff\_load); </code></pre><p>работает просто отлично. но я хотел более простое решение, и оказалось, что если вы добавите:</p><pre><code>this.visible=false; /* to the start of the load event, you get a simple perfect working solution :) */ private void debugonoff\_load(object sender, eventargs e) { this.visible = false; } </code></pre>

<p>вы захотите установить минимизированное состояние окна и показать на панели задач значение false. затем в конце вашей формы загрузить установить состояние окна на максимальный и показать на панели задач в true</p><pre><code> public frmmain() { program.mainform = this; initializecomponent(); this.windowstate = formwindowstate.minimized; this.showintaskbar = false; } private void frmmain\_load(object sender, eventargs e) { //do heavy things here //at the end do this this.windowstate = formwindowstate.maximized; this.showintaskbar = true; } </code></pre>

<p>поместите это в свой program.cs:</p><pre><code>formname formname = new formname (); formname.showintaskbar = false; formname.opacity = 0; formname.show(); formname.hide(); </code></pre><p>используйте это, когда вы хотите отобразить форму:</p><pre><code>var principalform = application.openforms.oftype<formname>().single(); principalform.showintaskbar = true; principalform.opacity = 100; principalform.show(); </code></pre>

<p>переопределить onvisiblechanged в форме</p><pre><code>protected override void onvisiblechanged(eventargs e) { this.visible = false; base.onvisiblechanged(e); } </code></pre><p>вы можете добавить триггер, если вам может понадобиться показать его в какой-то момент</p><pre><code>public partial class mainform : form { public bool hideform = true; ... public mainform (bool hideform) { this.hideform = hideform; initializecomponent(); } ... protected override void onvisiblechanged(eventargs e) { if (this.hideform) this.visible = false; base.onvisiblechanged(e); } ... } </code></pre>

<p>это прекрасно работает для меня:</p><pre><code>[stathread] static void main() { try { frmbase frm = new frmbase(); application.run(); } </code></pre><p>когда я запускал проект, все было скрыто, в том числе на панели задач, если мне не нужно показывать его ..</p>

<p>запуск приложения без формы означает, что вам придется самостоятельно управлять запуском/закрытием приложения.</p><p>лучше всего начинать с невидимой формы.</p>

<pre><code>static void main() { application.enablevisualstyles(); application.setcompatibletextrenderingdefault(false); mainuiform mainuiform = new mainuiform(); mainuiform.visible = false; application.run(); } </code></pre>

<p>вот простой подход:<br> это на c # (на данный момент у меня нет компилятора vb)</p><pre><code>public form1() { initializecomponent(); hide(); // also visible = false can be used } private void form1\_load(object sender, eventargs e) { thread.sleep(10000); show(); // or visible = true; } </code></pre>

<pre><code> static void main() { application.enablevisualstyles(); application.setcompatibletextrenderingdefault(false); form1 form1 = new form1(); form1.visible = false; application.run(); } private void exittoolstripmenuitem\_click(object sender, eventargs e) { this.close(); application.exit(); } </code></pre>

<p>у меня была проблема, похожая на постер, где код для скрытия формы в событии form\_load срабатывал до того, как форма была полностью загружена, что приводило к сбою метода hide () (без сбоев, просто не работал должным образом).</p><p>другие ответы хороши и работают, но я обнаружил, что в общем случае событие form\_load часто имеет такие проблемы, и то, что вы хотите поместить туда, может быть легко добавлено в конструктор или событие form\_shown.</p><p>в любом случае, когда я переместил тот же код, который проверяет некоторые вещи, а затем скрывает форму, когда она не нужна (форма входа в систему при сбое единого входа), она работала, как и ожидалось.</p>

<p>в этом примере поддерживается полная невидимость, а также только notifyicon в системном трее, нет кликов и многое другое.</p><p>подробнее здесь: <a href="http://code.msdn.microsoft.com/thenotifyiconexample">http://code.msdn.microsoft.com/thenotifyiconexample</a> </p>

<p>в качестве дополнения к <a href="https://stackoverflow.com/questions/70272/single-form-hide-on-startup/70296#70296">ответ groky</a> (что на самом деле является лучшим ответом на мой взгляд), мы могли бы также упомянуть класс <a href="http://msdn.microsoft.com/en-us/library/system.windows.forms.applicationcontext.aspx?appid=dev10idef1&l=en-us&k=k%28%22system.windows.forms.applicationcontext.#ctor%22%29;k%28applicationcontext%29;k%28solutionitemsproject%29;k%28targetframeworkmoniker-%22.netframework&k=version=v4.0%22%29;k%28devlang-csharp%29&rd=true">applicationcontext</a> , который также позволяет (как это показано в пример статьи) возможность открывать две (или даже больше) формы при запуске приложения и контролировать время жизни приложения со всеми из них.</p>