2010-05-07 6 views
11

Ho un programma che deve essere seduto in background e quando un utente si connette a una sessione RDP farà un po 'di installazione dell'ambiente quindi avvia un programma. Quando il programma è chiuso, eseguirà alcune operazioni di manutenzione e disconterà la sessione.Come rendere un programma non visualizzato in Alt-Tab o sulla barra delle applicazioni

L'attuale modo in cui lo sto facendo è che il server terminal avvia questa applicazione. Questo è costruito come applicazione Windows Form tenere la finestra console da rivelare:

public static void Main() 
{ 
    //(Snip...) Do some setup work 

    Process proc = new Process(); 
    //(Snip...) Setup the process 
    proc.Start(); 
    proc.WaitForExit(); 

    //(Snip...) Do some housecleaning 

    NativeMethods.ExitWindowsEx(0, 0); 
} 

Mi piace molto questo perché non v'è alcuna voce nella barra delle applicazioni e non c'è niente che mostra in alt-tab. Comunque per fare questo ho rinunciato all'accesso a funzioni come void WndProc(ref Message m) Quindi ora non riesco ad ascoltare i messaggi di Windows (come WTS_REMOTE_DISCONNECT o WTS_SESSION_LOGOFF) e non ho un handle da usare per bool WTSRegisterSessionNotification(IntPtr hWnd, int dwFlags); Vorrei che il mio codice fosse più robusto così da farà la pulizia della casa se l'utente si disconnette o si disconnette dalla sessione prima che chiuda il programma.

Qualche raccomandazione su come posso avere la mia torta e mangiarla anche io?

risposta

10

È possibile creare una finestra nascosta che si utilizza per gestire i messaggi.

using System; 
using System.Windows.Forms; 

namespace WindowsApplication1 
{ 
    class Program 
    { 
    [STAThread] 
    static void Main(string[] args) 
    { 
     Application.Run(new MessageWindow());   
    } 
    } 

    class MessageWindow : Form 
    { 
    public MessageWindow() 
    { 
     this.ShowInTaskbar = false; 
     this.WindowState = FormWindowState.Minimized; 
     // added by MusiGenesis 5/7/10: 
     this.FormBorderStyle = FormBorderStyle.FixedToolWindow; 
    } 

    protected override void WndProc(ref Message m) 
    { 
     base.WndProc(ref m); 
    } 
    } 
} 
+0

Provato, si presenta in Alt-Tab. Questa è la mia soluzione di backup, ma mi piacerebbe molto quella che non appare nel menu alt-tab. –

+0

Se si dispone di questo set come applicazione Windows, non dovrebbe essere visualizzato in Alt-Tab. –

+1

Ho aggiunto una riga che farà funzionare (e manterrai la finestra fuori dalla lista Alt-Tab). – MusiGenesis

7

Vai a questa domanda: Best way to hide a window from the Alt-Tab program switcher?

ho provato tutte le soluzioni, ma non importa quello che faccio la finestra mostra ancora nella lista Alt-Tab (sto facendo funzionare Vista).

In Windows Mobile, si imposta la proprietà Text di un modulo su bianco per tenerlo fuori dall'elenco dei programmi in esecuzione (l'equivalente WinMo dell'elenco alt-tab). Forse questo funzionerà per te, ma ne dubito.

Aggiornamento: OK, questo fa lavoro, dopo tutto. Se si crea e si visualizza un modulo con il suo FormBorderStyle impostato su FixedToolWindow e il suo ShowInTaskbar impostato su false, verrà visualizzato non nell'elenco Alt-Tab.

7

incollare questo, nel codice:

protected override CreateParams CreateParams 
     { 
      get 
      { 
       CreateParams pm = base.CreateParams; 
       pm.ExStyle |= 0x80; 
       return pm; 
      } 
     } 

Semplice come quello. Funziona perfettamente su win7 64bit e cosa è più importante - non richiede, per cambiare lo stile del bordo del modulo (ho creato un'applicazione simile a un widget quindi impostare lo stile su fixedToolWindow non era un'opzione, con questa soluzione è ancora senza bordi e invisibile per alt scheda).

+0

L'ho fatto e ora il modulo sembra come se avessi impostato FormBorderStyle su FixedToolWindow – foxneSs