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

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

class MyView(TemplateView):
    name = 'my_view'

Вы можете получить к нему доступ в своем шаблоне с помощью {{ view.name }}.

21
задан Joel Coehoorn 25 March 2009 в 23:17
поделиться

9 ответов

Отлично! Та ссылка указала на меня в правильном направлении. Это, кажется, работает:

        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);

Чтобы помешать ему обнаруживаться в Alt-Tab, Вам нужен он, чтобы быть окном инструментов. К сожалению, это препятствует тому, чтобы он запустился минимизированный. Но установка положения запуска к Руководству и расположению его вне экрана добивается цели!

19
ответ дан 29 November 2019 в 06:27
поделиться

Лучший способ состоит в том, чтобы использовать следующие 1-2 строки в constuctor:

this.WindowState = FormWindowState.Minimized;
this.ShowInTaskbar = false; // This is optional

Можно даже установить свойство Minimized в Окне свойств VS.

8
ответ дан 29 November 2019 в 06:27
поделиться

Можно создать класс, который наследовался System.Windows.Forms.NativeWindow (который обеспечивает основную возможность цикла сообщения), и сошлитесь Handle свойство в его конструкторе, чтобы создать его дескриптор и сцепить его в цикл сообщения. После того как Вы звоните Application.Run, Вы сможете обработать сообщения от него.

5
ответ дан 29 November 2019 в 06:27
поделиться
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));
    }
}
2
ответ дан 29 November 2019 в 06:27
поделиться

в файле кода Form1 добавляют это. Видимый = ложь; конструктору.

Это скроет окно, но оно высветится в течение секунды, прежде чем оно будет скрыто. Кроме того, можно записать собственное Приложение. Команда выполнения.

для большего количества информации http://social.msdn.microsoft.com/forums/en-US/winforms/thread/dece45c8-9076-497e-9414-8cd9b34f572f/

также можно хотеть установить это. ShowInTaskbar ко лжи.

-1
ответ дан 29 November 2019 в 06:27
поделиться

Почему Вы не можете только передать форму, когда Вы звоните Application.Run? Учитывая, что это - ясно блокирующийся вызов, на том, какое событие Вы хотите показать форме? Просто вызов form.Show() должен быть достаточно.

1
ответ дан 29 November 2019 в 06:27
поделиться

Необходимо посмотреть на создание 'сервиса', поскольку это - приложение без формы. См. http://support.microsoft.com/kb/816169

-1
ответ дан 29 November 2019 в 06:27
поделиться

Я решил проблему следующим образом:

[STAThread]
static void Main()
{
    Application.EnableVisualStyles();
    Application.SetCompatibleTextRenderingDefault(false);
    Main main = new Main();
    Application.Run();
    //Application.Run(new Main());
}

Этот код находится в файле Program.cs, и вы можете увидеть комментарий к исходному вызову метода Application.Run из. Я просто создаю объект класса Main (мой основной класс формы называется Main) и запускаю цикл сообщений приложения без каких-либо параметров. Это запускает приложение, инициализирует любые компоненты формы, но не отображает форму.

Примечание: у вас должен быть какой-то способ отображения вашего окна (например, значок на панели задач, горячая клавиша, таймер или что-нибудь еще, что вам может понравиться).

4
ответ дан 29 November 2019 в 06:27
поделиться

Используя ответ Ками в качестве вдохновения, я создал более полную концепцию. Если вы используете это решение, никогда не показывайте скрытое окно. Если вы это сделаете, пользователь может закрыть его, и тогда вы потеряете возможность упорядоченного управления выходом из приложения. Этот подход можно использовать для управления Timer, NotifyIcon или любым другим компонентом, который счастлив жить в невидимой форме.

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);
        }
    }
}
1
ответ дан 29 November 2019 в 06:27
поделиться
Другие вопросы по тегам:

Похожие вопросы: