Любой способ создать скрытое главное окно в С#?
Мне просто нужно приложение С# со скрытым главным окном, которое будет обрабатывать и отвечать на сообщения окна.
Я могу создать форму, не показывая ее, а затем вызывать Application.Run() без передачи в форме, но как я могу связать созданную форму в цикле сообщений?
Есть ли еще один способ сделать это?
Заранее благодарим за любые советы!
Ответы
Ответ 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