2010-04-21 1 views
41

Ho un'applicazione console scritta in C# che è pianificata per essere eseguita ogni 15 minuti circa utilizzando l'Utilità di pianificazione integrata di Windows.Come eseguire un'applicazione console .NET in background

Ogni volta che viene eseguita, la console nera si apre per la durata della sua esecuzione e quindi si chiude. Non sto scrivendo nulla sulla console. C'è un modo per farlo funzionare in background?

+0

Non dall'app della console stessa, penso che dovresti chiedere a Superuser come configurarlo nello Scheduler. –

risposta

46

facile!

Sembra difficile da credere, ma funziona come un fascino. Ho usato questo per alcuni progetti di installazione, quando si desidera eseguire attività personalizzate senza segni di esso.

  • Creare il progetto come progetto di applicazione Windows (questa è la parte difficile).
  • Non effettuare mai chiamate in qualsiasi forma. Basta continuare a esattamente come nell'applicazione console

    class Program 
    { 
        static void Main(string[] args) 
        { 
         // Just don't call Application.Run(new frmMain(args)); 
    
         // ... your code 
        } 
    } 
    

Questo perché i progetti di applicazioni Windows sono davvero diverso da console, tranne per la prima forma e riferimenti. È un'esecuzione totalmente nascosta. Provalo!

+0

Non riesco a rendere il codice simile a un codice - sry –

9

Che ne dici di implementare l'app in un servizio di Windows? È possibile impostare l'intervallo su 15 minuti ed eseguire l'operazione nel timer_tick.

1

sporca come qualcosa là fuori, ma (from here):

Il processo dura 3 file. launch.bat, invis.vbs e (il programma ). In launch.bat (questo file esegue automaticamente il programma ), inserire wscript.exe "C:\yourpath\invis.vbs" "your file.bat". In invis.vbs, messo in

CreateObject("Wscript.Shell").Run """" & WScript.Arguments(0) & """", 0, False

E infine nel file, launch.bat, mettere quello che vuoi ...

echo off erase c:\junk.txt. Bene sei fatto. Basta aprire launch.bat.

Tuttavia, funziona come un fascino. Lancia il primo bat (launch.bat), che a sua volta lancia il tuo servizio/eseguibile in modalità invisibile. Quindi, è un rapido blip per il lancio originale, quindi sparito.

9

È possibile utilizzare l'API di Windows per ridurre a icona la casella della console. Altrimenti puoi crearlo come un file EXE di Windows che in realtà non carica un modulo e chiama System.Windows.Forms.Application.Run().

codice per ridurre al minimo la console:

[DllImport("user32.dll")] 
public static extern bool ShowWindow(IntPtr hWnd, int nCmdShow); 

public const int SW_SHOWMINIMIZED = 2; 

IntPtr winHandle = System.Diagnostics.Process.GetCurrentProcess().MainWindowHandle; 
ShowWindow(winHandle, SW_SHOWMINIMIZED); 
+1

Mi stavo preparando per postare questo! Per nascondere la finestra: public const int SW_HIDE = 0; Per ripristinare: public const int SW_RESTORE = 9; – JohnForDummies

2

Viene visualizzato solo se è pianificato l'esecuzione come lo stesso utente al momento connesso. Creare un altro utente sulla macchina con una password ridicolmente lunga, impostarlo come amministratore (solo se necessario) e pianificare l'attività per funzionare come quell'utente

0

Questo è facile. Imposta l'attività da eseguire con un account che non è il tuo account di accesso.

133

Progetto> Proprietà> scheda Applicazione> modifica Tipo di output su "Applicazione Windows".

Niente più finestra della console.

+6

Mi sono imbattuto nello stesso problema, e questa risposta mi ha aiutato molto più di quello accettato. – user17753

+0

concordato - questa è un'ottima risposta - davvero semplice e funziona perfettamente –

+2

Trucco incredibile, grazie :) –

5

Se è già stata creata un'app di console di Windows, è sufficiente modificare il tipo di output della propria app in Applicazione Windows.

Nell'ambito del progetto: Passare a Proprietà> Applicazione Selezionare "Applicazione Windows" come tipo di Uscita.

Questo è l'impatto minimo e puoi mantenere l'Utilità di pianificazione di Windows che esegue la stessa operazione.