есть ли способ создать скрытое главное окно в c #?

<p>я просто хочу приложение c # со скрытым главным окном, которое будет обрабатывать и отвечать на сообщения окна.</p><p>я могу создать форму, не показывая ее, и затем могу вызвать application.run (), не передавая форму, но как я могу подключить созданную форму к циклу сообщений?</p><p>есть ли другой способ пойти по этому поводу?</p><p>заранее спасибо за любые советы!</p>

<p>отлично! эта ссылка указала мне в правильном направлении. это похоже на работу:</p><pre><code> form f = new form1(); f.formborderstyle = formborderstyle.fixedtoolwindow; f.showintaskbar = false; f.startposition = formstartposition.manual; f.location = new system.drawing.point(-2000, -2000); f.size = new system.drawing.size(1, 1); application.run(f); </code></pre><p>чтобы он не отображался в alt-tab, вам нужно, чтобы это было окно инструментов. к сожалению, это препятствует тому, чтобы это начало было свернуто. но установив начальную позицию на ручную и расположив ее вне экрана, добьемся цели!</p>

<p>в процессе переписывания vc++ tasktray app в c # .net я обнаружил, что следующий метод действительно работает для достижения следующего.</p><ol> <li>начальная форма не отображается при запуске</li> <li>запуск цикла сообщений, который может использоваться с invoke/begininvoke по мере необходимости, поскольку <strong> iswindowhandle </strong> имеет значение true</li> </ol><p>шаги, которые я выполнил:</p><ol> <li>использовал applicationcontext в application.run () вместо формы. см. <a href="http://www.codeproject.com/articles/18683/creating-a-tasktray-application">http://www.codeproject.com/articles/18683/creating-a-tasktray-application</a> для примера, который я использовал.</li> <li>установите для свойства форма <strong> showintaskbar </strong> значение true в gui designer. (это кажется контрпродуктивным, но это работает)</li> <li>переопределите <strong> метод onload () </strong> в настройках класса формы <strong> visible </strong> и <strong> showintaskbar </strong> в false, как показано ниже.</li> </ol><blockquote> <pre><code>protected override void onload(eventargs e) { visible = false; showintaskbar = false; base.onload(e); } </code></pre></blockquote>

<p>я знаю, что это старый вопрос, но он хорошо зарекомендовал себя в google, поэтому я все равно предоставлю свое решение.</p><p>я делаю две вещи:</p><pre><code>private void form\_load(object sender, eventargs e) { opacity = 0; } private void form\_shown(object sender, eventargs e) { visible = false; opacity = 100; } </code></pre>

<p>лучше всего использовать следующие 1-2 строки в конструкторе:</p><pre><code>this.windowstate = formwindowstate.minimized; this.showintaskbar = false; // this is optional </code></pre><p>вы даже можете увидеть свойство minimized в окне свойств vs.</p>

<p>вы можете создать класс, унаследованный от <code>system.windows.forms.nativewindow</code> (который обеспечивает базовую возможность цикла сообщений), и обратиться к свойству <code>handle</code> в его конструкторе, чтобы создать его дескриптор и подключить его к циклу сообщений. как только вы позвоните <code>application.run</code>, вы сможете обрабатывать сообщения от него.</p>

<p>я решил проблему следующим образом:</p><pre><code>[stathread] static void main() { application.enablevisualstyles(); application.setcompatibletextrenderingdefault(false); main main = new main(); application.run(); //application.run(new main()); } </code></pre><p>этот код находится в файле program.cs, и вы можете увидеть закомментированный исходный вызов метода application.run. я просто создаю объект класса main (мой основной класс формы называется main) и запускаю цикл сообщений приложения без каких-либо параметров. это запускает приложение, инициализирует любые компоненты формы, но не показывает форму.</p><p>примечание: у вас должен быть какой-то метод для отображения вашего окна (например, значок на панели задач, горячая клавиша или таймер или все, что вам может понравиться).</p>

<pre><code>public partial class form1 : form { private bool \_isapplicationrun; public form1(bool applicationrun) { initializecomponent(); \_isapplicationrun = applicationrun; } protected override void setvisiblecore(bool value) { if (\_isapplicationrun) { \_isapplicationrun = false; base.setvisiblecore(false); return; } base.setvisiblecore(value); } } static class program { [stathread] static void main() { application.run(new form1(true)); } } </code></pre>

<p>используя ответ ками как вдохновение, я создал более полную концепцию. если вы используете это решение, никогда не показывайте скрытое окно. если вы это сделаете, пользователь может закрыть его, и тогда вы потеряете возможность упорядоченно управлять выходом из приложения. этот подход можно использовать для управления timer, notifyicon или любым другим компонентом, который счастлив жить в невидимой форме.</p><pre><code>using system; using system.windows.forms; namespace simplehiddenwinform { internal class hiddenform : form { private timer \_timer; private applicationcontext \_ctx; public hiddenform(applicationcontext ctx) { \_ctx = ctx; \_timer = new timer() { interval = 5000, //5 second delay enabled = true }; \_timer.tick += new eventhandler(\_timer\_tick); } void \_timer\_tick(object sender, eventargs e) { //tell the main message loop to quit \_ctx.exitthread(); } } static class program { [stathread] static void main() { var ctx = new applicationcontext(); var frmhidden = new hiddenform(ctx); //pass the application context, not the form application.run(ctx); } } } </code></pre>

<p>почему вы не можете просто передать форму, когда звоните <code>application.run</code>? учитывая, что это явно блокирующий вызов, на каком событии вы хотите показать форму? достаточно просто вызвать <code>form.show()</code>.</p>

<pre><code>form1 f1=new form1(); f1.windowstate = formwindowstate.minimized; f1.showintaskbar = false; </code></pre>