Pregunta

Desde Compact Framework Llamadas Show() en el formulario pasó a Application.Run() , que decidió crear mi propio suministro de mensajes.

No tengo idea de cómo puedo hacer eso.

Se apreciará Cualquier ayuda (como un ejemplo simple).

¿Fue útil?

Solución

  • ¿trató de controlar el evento VisibleChanged?

this.Shown += new EventHandler(Form1_Shown);

void Form1_Shown(object sender, EventArgs e)
{
    this.Hide();
}
  • También puede tratar de interceptar el mensaje reemplazando el WndProc .
    protected override void WndProc(ref Message m)
    {
        const int SW_SHOW = 5;
        if (m.Msg == SW_SHOW)
        {
            //DoSomething();
        }

        base.WndProc(ref m);
    }
  • Una típica apariencia de bomba mensaje como siguiente:
MSG msg;
while(GetMessage(&msg, hwnd, 0, 0))
{
    TranslateMessage(&msg);
    DispatchMessage(&msg);
    // DoSomething.
}

Otros consejos

Me pareció que este es un problema mayor de lo que cabría anticipar de una ventana formulario de solicitud. Para mi solución Saqué tres sugerencias de sitio web diferente y encontré esta solución a funcionar muy bien. Para mis necesidades Tengo un servicio de Windows que tiene un componente controlador de interfaz de usuario en la bandeja del sistema. La interfaz de usuario necesita para poner en marcha minimizada con sólo el icono de la bandeja y un menú contextual para el icono. La interfaz de usuario funciona como un diálogo modal cuando se activa, lo que permite al usuario iniciar un largo proceso que se ejecuta en un subproceso de fondo, una vez que comenzó a las necesidades de interfaz de usuario a volver a tomar las respuestas del usuario.

En el constructor de la clase Windows Form I establece la ControlBox en deshabilitado y los botones de minimizar y maximizar:

public SystemTrayApp()
{
    InitializeComponent();
    this.Visible = false;
    // Hide Maximize and Minimize buttons on form
    this.StartPosition = FormStartPosition.CenterScreen;
    this.MaximizeBox = false;
    this.MinimizeBox = false;
}

Las necesidades ControlBox que se permiten para permitir al usuario mover el cuadro de diálogo alrededor de la pantalla, pero no cambiar su tamaño, para desactivar el botón de forma estrecha, X roja en la esquina superior derecha de la forma, he utilizado:

// Force form close button to be disabled
private const int CP_NOCLOSE_BUTTON = 0x200;
protected override CreateParams CreateParams 
{
   get 
   {
      CreateParams cp = base.CreateParams;
      cp.ClassStyle = cp.ClassStyle | CP_NOCLOSE_BUTTON;
      return cp;
   }
}

En el programa principal, donde los estáticas principal, método de aplicación se ejecuta en la puesta en marcha, me cambiaron la Application.Run por defecto a:

static class Program
{
    /// <summary>
    /// The main entry point for the application.
    /// </summary>
    [STAThread]
    static void Main()
    {
        Application.EnableVisualStyles();
        Application.SetCompatibleTextRenderingDefault(false);
        SystemTrayApp systemTrayApp = new SystemTrayApp();
        systemTrayApp.Text = "File Copy Service Controller";

        // Show the instance of the form modally.
        systemTrayApp.ShowInTaskbar = true;
        systemTrayApp.ShowDialog();
        Application.Run();
    }
 }

Ahora mostrar la página de diseño para el formulario de Windows, haga clic derecho en las propiedades del formulario y seleccione, al lado seleccione el botón de eventos para mostrar todos los eventos del formulario. Desplazarse hasta el evento se muestra y haga doble clic, se añadirá un nuevo controlador de eventos a su código fuente. Navegar con el método y el complemento this.Hide() al controlador:

// Runs the first time the application starts
private void SystemTrayApp_Shown(object sender, EventArgs e)
{
   this.Hide();
}

Finalmente abrir la página de propiedades para el proyecto de formularios Windows y seleccione la pestaña de aplicaciones. Bajo Objeto inicial, seleccione la clase del Programa como el objeto de inicio.

Se tendrá que añadir un botón o control de menú para el diálogo para permitir cerrar el formulario sin necesidad de cerrar la aplicación, establecer el botón o menú de control para ocultar la aplicación, dejando que se ejecuta en la bandeja del sistema.

Sustitución del bucle de mensajes en la clase de aplicación no es práctico. Hay mucho más en juego entonces el bucle de mensajes de texto modelo de Windows. No es el verdadero problema de todos modos, las fuerzas de clase Aplicación del Formulario para hacerse visibles con una llamada a ShowWindow (). Eso es necesario porque las formas se inicializan con pereza, sin el ShowWindow () llaman a esto nunca se crea el identificador de ventana nativa.

Este problema es fácil de solucionar en la versión .NET framework regulares anulando SetVisibleCore ():

protected override void SetVisibleCore(bool value) {
  if (!this.IsHandleCreated) {
    this.CreateHandle();
    value = false;  // Prevent becoming visible the first time
  }
  base.SetVisibleCore(value);
}

Pero no creo que está disponible en la FQ Para encontrar una solución, tendrá que explicar exactamente ¿Por qué desea evitar que la interfaz de usuario se muestre. Sin ningún tipo de identificador de ventana creada, una aplicación es por lo general bien muerto. Podría ser tan simple como el retraso de la llamada Application.Run ().

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top