Подтвердить что ты не робот

Любой способ создать скрытое главное окно в С#?

Мне просто нужно приложение С# со скрытым главным окном, которое будет обрабатывать и отвечать на сообщения окна.

Я могу создать форму, не показывая ее, а затем вызывать Application.Run() без передачи в форме, но как я могу связать созданную форму в цикле сообщений?

Есть ли еще один способ сделать это?

Заранее благодарим за любые советы!

4b9b3361

Ответ 1

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

        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, вам нужно, чтобы это окно инструментов. К сожалению, это предотвращает его сведение к минимуму. Но установка стартовой позиции в ручную и ее расположение на экране делает трюк!

Ответ 2

В процессе перезаписи приложения VС++ TaskTray в С#.NET я нашел следующий способ, действительно выполнимый для достижения следующего.

  • Никакая начальная форма не была отложена при запуске
  • Запуск цикла сообщений, который может использоваться с Invoke/BeginInvoke по мере необходимости, как IsWindowHandle.

Последовательность шагов:

  • Используется ApplicationContext в Application.Run() Вместо формы. См. http://www.codeproject.com/Articles/18683/Creating-a-Tasktray-Application для примера, который я использовал.
  • Установите для свойства Form ShowInTaskbar значение true в GUI Designer. (Это кажется контрпродуктивным, но оно работает)
  • Отмените метод OnLoad() в настройке класса формы Видимый и ShowInTaskbar на false, как показано ниже.
protected override void OnLoad(EventArgs e)
    {
        Visible = false; 
        ShowInTaskbar = false; 
        base.OnLoad(e);
    }

Ответ 3

Я знаю, что это старый вопрос, но он хорошо зарекомендовал себя в google, поэтому я все равно предоставил свое решение.

Я делаю две вещи:

private void Form_Load(object sender, EventArgs e)
{
    Opacity = 0;
}

private void Form_Shown(object sender, EventArgs e)
{
    Visible = false;
    Opacity = 100;
}

Ответ 4

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

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

Вы даже можете установить свойство Minimized в окне VS Property.

Ответ 5

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

Ответ 6

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

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

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

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

Ответ 7

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

Ответ 8

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

Ответ 9

Используя ответ Ками как вдохновение, я создал более полную концепцию. Если вы используете это решение, никогда не показывайте скрытое окно. Если вы это сделаете, пользователь может закрыть его, а затем вы потеряли возможность контролировать выход приложения упорядоченным способом. Этот подход может использоваться для управления таймером, 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);
        }
    }
}

Ответ 10

Form1 f1=new Form1();
f1.WindowState = FormWindowState.Minimized;
f1.ShowInTaskbar = false;

Ответ 11

в файле кода Form1 добавьте this.Visible = false; к конструктору.

Это скроет окно, но оно будет мигать в течение секунды, прежде чем оно будет скрыто. В качестве альтернативы вы можете написать свою собственную команду Application.Run.

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

также вы можете установить для this.ShowInTaskbar значение false.

Ответ 12

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