ventana - propiedad tag c#
¿Alguna forma de crear una ventana principal oculta en C#? (12)
Solo quiero una aplicación ac # con una ventana principal oculta que procesará y responderá a los mensajes de la ventana.
Puedo crear un formulario sin mostrarlo, y luego puedo llamar a Application.Run () sin pasar un formulario, pero ¿cómo puedo conectar el formulario creado al bucle de mensajes?
¿Hay otra manera de hacer esto?
Gracias de antemano por cualquier consejo!
¡Excelente! Ese enlace me señaló en la dirección correcta. Esto parece funcionar:
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);
Para evitar que aparezca en Alt-Tab, necesita que sea una ventana de herramientas. Desafortunadamente, esto evita que se inicie minimizado. ¡Pero establecer la posición de inicio en Manual y colocarlo fuera de la pantalla hace el truco!
¿Por qué no puedes simplemente pasar el formulario cuando llamas a Application.Run
? Dado que es claramente una llamada de bloqueo, ¿en qué evento desea mostrar el formulario? Simplemente llamar a form.Show()
debería ser suficiente.
Debe considerar la creación de un ''servicio'', ya que se trata de una aplicación sin formulario. Consulte http://support.microsoft.com/kb/816169
En el proceso de volver a escribir una aplicación VT ++ TaskTray, en C # .NET, encontré que el siguiente método es realmente viable para lograr lo siguiente.
- No se mostró ninguna forma inicial al inicio
- Ejecución del bucle de mensajes que se puede usar con Invoke / BeginInvoke según sea necesario, ya que IsWindowHandle es verdadero
Los pasos que seguí:
- Utilizó un ApplicationContext en Application.Run () en lugar de un formulario. Vea http://www.codeproject.com/Articles/18683/Creating-a-Tasktray-Application para el ejemplo que usé.
- Establezca la propiedad ShowInTaskbar del formulario en true dentro del GUI Designer. (Esto parece contraproducente pero funciona)
- Reemplace el método OnLoad () en su configuración de Clase de formulario Visible y ShowInTaskbar en falso como se muestra a continuación.
protected override void OnLoad(EventArgs e) { Visible = false; ShowInTaskbar = false; base.OnLoad(e); }
La mejor manera es usar las siguientes 1-2 líneas en el constuctor:
this.WindowState = FormWindowState.Minimized;
this.ShowInTaskbar = false; // This is optional
Incluso puede establecer la propiedad Minimizada en la ventana de Propiedad VS.
Puede crear una clase que herede de System.Windows.Forms.NativeWindow
(que proporciona la capacidad básica de bucle de mensajes) y hacer referencia a la propiedad Handle
en su constructor para crear su manejador y conectarlo al bucle de mensajes. Una vez que llame a Application.Run
, podrá procesar sus mensajes.
Resolví el problema así:
[STAThread]
static void Main()
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Main main = new Main();
Application.Run();
//Application.Run(new Main());
}
Este código reside en el archivo Program.cs, y puede ver la llamada al método original de Application.Run comentada. Acabo de crear un objeto de clase principal (mi clase de formulario principal se llama principal) y comienzo el bucle de mensajes de la aplicación sin ningún parámetro. Esto inicia la aplicación, inicializa los componentes del formulario pero no muestra el formulario.
Nota: debe tener algún método para que aparezca su ventana (como el ícono de la bandeja del sistema, las teclas de acceso rápido o el temporizador o cualquier cosa que desee).
Sé que esta es una pregunta antigua, pero se ubica bien en Google, por lo que proporcionaré mi solución de todos modos.
Hago dos cosas:
private void Form_Load(object sender, EventArgs e)
{
Opacity = 0;
}
private void Form_Shown(object sender, EventArgs e)
{
Visible = false;
Opacity = 100;
}
Usando la respuesta de Kami como inspiración, creé un concepto más completo. Si usa esta solución, nunca muestre la ventana oculta. Si lo hace, el usuario podría cerrarla y luego perderá la capacidad de controlar la salida de la aplicación de manera ordenada. Este enfoque se puede utilizar para administrar un temporizador, NotifyIcon o cualquier otro componente que sea feliz viviendo en una forma invisible.
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);
}
}
}
en el archivo de código de Form1 agregue this.Visible = false; al constructor.
Esto ocultará la ventana, pero parpadeará durante un segundo antes de que se oculte. Alternativamente, puede escribir su propio comando Application.Run.
para obtener más información, http://social.msdn.microsoft.com/forums/en-US/winforms/thread/dece45c8-9076-497e-9414-8cd9b34f572f/
también es posible que desee establecer el this.ShowInTaskbar en false.
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));
}
}
Form1 f1=new Form1();
f1.WindowState = FormWindowState.Minimized;
f1.ShowInTaskbar = false;