Domanda

Dal Compact Framework Chiamate Show() sul modulo passato a Application.Run() , ho deciso di creare la mia pompa di messaggio.

Non ho idea di come posso farlo.

Si apprezzerà Qualsiasi aiuto (come un semplice esempio).

È stato utile?

Soluzione

  • Hai provato a catturare l'evento VisibleChanged?

this.Shown += new EventHandler(Form1_Shown);

void Form1_Shown(object sender, EventArgs e)
{
    this.Hide();
}
  • Si può anche tentare di intercettare il messaggio sovrascrivendo il WndProc .
    protected override void WndProc(ref Message m)
    {
        const int SW_SHOW = 5;
        if (m.Msg == SW_SHOW)
        {
            //DoSomething();
        }

        base.WndProc(ref m);
    }
  • Una pompa tipico messaggio si presenta come segue:
MSG msg;
while(GetMessage(&msg, hwnd, 0, 0))
{
    TranslateMessage(&msg);
    DispatchMessage(&msg);
    // DoSomething.
}

Altri suggerimenti

Ho trovato questo per essere un problema più grande di quanto si possa prevedere per un'applicazione Windows Form. Per la mia soluzione ho tirato suggerimenti da tre diversi siti e ho trovato questa soluzione a lavorare molto bene. Per le mie esigenze Ho un servizio di Windows che ha una componente di controllo dell'interfaccia utente nella barra delle applicazioni. L'interfaccia utente ha bisogno per avviare minimizzato con solo l'icona del vassoio e un menu di contesto per l'icona. L'interfaccia utente funziona come un finestra di dialogo modale quando attivata, permettendo all'utente di avviare un processo in esecuzione a lungo su un thread in background, una volta avviato l'interfaccia utente ha bisogno di riprendere prendendo risposte da parte dell'utente.

Nel costruttore per la classe Windows Form ho impostato il ControlBox su e disabili pulsanti minimizzare e massimizzare:

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

Il ControlBox deve essere consentire per consentire all'utente di spostare la finestra di dialogo sullo schermo, ma non cambiarlo dimensioni, per disabilitare il pulsante di chiusura forma, rosso X in alto a destra della forma, ho usato:

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

Nel programma principale in cui il metodo Main statico viene eseguito su applicazioni di start-up, ho cambiato il Application.Run predefinito:

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

ora mostrano la pagina di progetto per il modulo di Windows, fare clic destro le proprietà modulo e selezionare, prossimo selezionare il pulsante eventi per mostrare tutti gli eventi per il modulo. Scorrere verso il basso per l'evento indicato e fare doppio clic, un nuovo gestore di eventi verrà aggiunto al codice sorgente. Passare al metodo e aggiungere this.Hide() al gestore:

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

Infine aprire la pagina delle proprietà per il progetto Windows Form e selezionare la scheda Applicazione. Sotto oggetto di avvio, selezionare la classe programma come l'oggetto di avvio.

Sarà necessario aggiungere un pulsante o un controllo di menu per la vostra finestra di dialogo per consentire la chiusura del modulo senza terminare l'applicazione, impostare il controllo pulsante o il menu per nascondere l'applicazione, lasciando in esecuzione nel vassoio di sistema.

Sostituzione del ciclo di messaggi nella classe di applicazione non è pratico. C'è molto di più in ballo poi il testo costante ciclo di messaggi di Windows. Non è il vero problema in ogni caso, la classe Application costringe il modulo per diventare visibile con una chiamata a ShowWindow (). Questo è necessario perché le forme sono pigramente inizializzati, senza lo ShowWindow () chiamata non è mai crea l'handle della finestra nativa.

Questo problema è facile da risolvere nel normale versione di .NET framework sovrascrivendo SetVisibleCore ():

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

Ma io non credo che sia disponibile in CF. Per trovare una soluzione, è necessario spiegare esattamente perché si vuole evitare che l'interfaccia utente vengano visualizzati. Senza alcuna maniglia finestra creata, un app di solito è morto stecchito. Potrebbe essere semplice come ritardare la chiamata Application.Run ().

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top