Question

Il y a une ligne de commande ou méthode .NET qui exécute un processus en arrière-plan cacher une fenêtre, il tente d'ouvrir?

Déjà essayé:

 var process = new Process()
 {
      StartInfo = new ProcessStartInfo()
      {
          CreateNoWindow = true,
          WindowStyle = ProcessWindowStyle.Hidden,
          FileName = TheRealExecutableFileNameHere
      }
 }
 process.Start();

Sans succès jusqu'à présent

Était-ce utile?

La solution

Consultez la Matlab moteur.

Il y a même un intéressant article sur CodeProject, si cette approche correspond à vos besoins .

Autres conseils

J'ai examiné mon code et il semble presque identique à la vôtre:

ProcessStartInfo psi = new ProcessStartInfo(fileName, arguments)
{
   CreateNoWindow = true,
   WindowStyle = ProcessWindowStyle.Hidden,
   UseShellExecute = false,
   RedirectStandardOutput = true                                               
};

Process process = Process.Start(psi);

La seule différence notable (autre que le formatage et quel constructeur PSI nous avons choisi) est mon utilisation de UseShellExecute et RedirectStandardOutput que je devais lire le résultat du processus RAN.

J'ai trouvé le code ci-dessus fonctionne toujours un processus caché sur XP et Vista. cependant, j'ai trouvé, et vous pouvez éprouver la même chose, qu'un processus caché peut lancer un autre processus qui, par défaut n'est pas caché. En d'autres termes, si vous commencez processus caché A et processus A, à son tour, coup d'envoi Processus B, vous avez aucun contrôle sur la façon dont le procédé B sera affiché. Windows que vous avez aucun contrôle peuvent être affichés.

J'espère que cela aide un peu. Bonne chance.

Avez-vous essayé d'utiliser le DOS Microsoft start commande / B commutateur?

commande de démarrage Microsoft DOS

Par exemple,

START /B cmd.exe

Il n'y a pas Je ne sais pas d'une manière purement .Net pour y parvenir.

Alors je pensais à propos du noyau Objets d'emploi , mais n'a trouvé aucune option similaire dans restrictions de l'interface utilisateur .

Alors, la prochaine ( encore non vérifiées ) idée est de créer de processus suspendu, créer un crochet de fenêtres puis, qui surveillera CallWndProc et filtrer les messages WM_SHOW. (Alors, sûrement, reprendre le processus, attendre dans un thread séparé jusqu'à ce qu'il termine, retirez le crochet)

Vous pouvez essayer BackgroundWorker classe dans le Net Framework si vous avez pas déjà. Il est pour l'exécution à long processus en cours d'exécution sur un thread séparé pour les empêcher d'entraver l'interface utilisateur. Donnez-lui un coup d'oeil.

Je sais que cela a été répondu, mais vous pouvez forcer une fenêtre pour cacher des appels non gérés à FindWindow et ShowWindow.

[DllImport("user32.dll")]
public static extern IntPtr FindWindow(string lpClassName, string lpWindowName);

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

psi = new ProcessStartInfo(); // etc..
some_process = Process.Start(psi);
System.Threading.Thread.Sleep(50); // need give the window a chance to be created
IntPtr hWnd = FindWindow(null, "name of the window");
if (hWnd != IntPtr.Zero) ShowWindow(hWnd, 0); // 0 = SW_HIDE

Au lieu kludgy.

Cela dépend si vous voulez commencer l'application réduite au minimum, mais permettent d'interagir avec l'utilisateur si nécessaire, ou si vous voulez interdire tout accès à l'utilisateur, peu importe ce qui se passe.

Dans ce dernier cas, vous pouvez exécuter le processus dans un contexte de bureau différent de l'utilisateur actuel.

Différents contextes de bureau sont utilisés, par exemple, par la boîte de dialogue de connexion et par Vista UAC -. Tout ce qui se passe dans un contexte de bureau est indépendant des autres

Peut-être une approche de marteau de forgeron à votre problème cependant.

J'ai remarqué que si CreateNoWindow = false ne fait absolument rien lorsque le nom de fichier pointe vers un exécutable Windows, si vous avez accès au code source de l'application Winform alors vous pourriez être en mesure de fournir un argument de ligne de commande qui contrôle la valeur par défaut la visibilité de la forme, et faire quelque chose comme cela dans le code de démarrage App Winform:

static void Main(string[] args)
    {
        Application.EnableVisualStyles();
        Application.SetCompatibleTextRenderingDefault(false);
        Form1 form1 = new Form1();

        form1.Load += new EventHandler((s,o) =>
            {
              //check if the form should be shown based on command line arg
                if (args.Contains("dontShowWindow"))
                {
                    //hide it
                    form1.ShowInTaskbar = false;
                    form1.Visible = form1.ShowInTaskbar = false;
                }
            }
        );
        Application.Run(form1);
    }

En vous appelant code, vous pouvez désormais spécifier "dontShowWindow" comme un processus Argument:

 ProcessStartInfo info = new ProcessStartInfo
        {
            CreateNoWindow = false, 
            WindowStyle = ProcessWindowStyle.Hidden,
            UseShellExecute = false, 
            FileName = @"C:\temp\testWinForm.exe",
            Arguments = "dontShowWindow"
        };
        Process.Start(info);

Hope this helps

Un très simple moyen d'y parvenir est de créer un compte de service et exécuter le fichier exécutable dans le contexte de l'utilisateur du compte de service via le planificateur de tâches de Windows.

Vous pouvez utiliser cette CodeProject pour configurer la tâche planifiée:

http://www.codeproject.com/KB/cs/tsnewlib.aspx

Vous pouvez créer le compte de service dans la machine programatically local ou de domaine très facilement avec C #.

http://www.codeproject.com/KB/system/OSUserMangement.aspx http://support.microsoft.com/kb/306273

Les processus en cours d'exécution comme des tâches planifiées dans le cadre d'un autre utilisateur ne semble pas de manière interactive, à moins que l'utilisateur est connecté; d'où l'utilisation d'un compte de service.

public Form1()
    {
        InitializeComponent();
        Form1 fm = new Form1();
        fm.ShowInTaskbar = false;
        fm.Visible = fm.ShowInTaskbar = false;
    }

fonctionne très bien!

Je suppose que vous voulez un processus qui ne sont pas visibles pour les utilisateurs lors de l'exécution.

Vous pouvez essayer ce qui suit pour voir si c'est ce que vous voulez.

  1. Créer une application simple de la console qui maintient en cours d'exécution (et le lancer à tester).
  2. Faites un clic droit sur le projet -> Propriétés -> onglet Application -> Type de sortie -> le changer de "Application console" à l'application Windows
  3. .
  4. Lancer la même application une fois de plus (pour voir si c'est ce que vous voulez).
  5. Fermez l'application via le Gestionnaire des tâches de Windows:)

Il semble que le processus apparaît dans le Gestionnaire des tâches, encore, n'est pas visible dans la barre des tâches. Alt + TAB ne peut pas soulever cette question de processus.

J'espère que vous ne faites aucune application malveillante, si:)

Je pense que ce que vous pourriez vouloir essayer est de créer une nouvelle station de Windows. Consultez cet article qui explique un peu à leur sujet sur msdn.

http://msdn.microsoft.com /en-us/library/ms681928(VS.85).aspx

Vous pouvez rendre le service Windows. Toute fenêtre un service tente d'ouvrir passe juste en session 0, ce qui signifie que l'utilisateur ne peut le voir. Cela vaut pour toutes les fenêtres, donc peut-être ce n'est pas ce que vous cherchez.

Ci-dessous le code a fonctionné pour moi: Plus tôt le processus (bloc-notes) utilisé pour flasher le bloc-notes sur l'écran de bureau pour l'impression, mais il détourner l'attention de l'utilisateur, donc sous le code se cache le processus de bloc-notes en arrière-plan.

                System.Windows.Forms.PrintDialog printDialog = new PrintDialog();
                System.Diagnostics.ProcessStartInfo psi = new System.Diagnostics.ProcessStartInfo(Application.StartupPath + "/PrintingDocketFile/PrintCustomerOrder.txt");
                psi.Verb = "PRINT";

                //Process.Start(psi);
                //psi.CreateNoWindow = true;
                psi.UseShellExecute = false;
                //---------------------------------------------------

                psi.CreateNoWindow = false;
                psi.UseShellExecute = true;
                psi.FileName = Application.StartupPath + "/PrintingDocketFile/PrintCustomerOrder.txt";
                psi.WindowStyle = ProcessWindowStyle.Hidden;
                psi.Arguments =  @"%windir%\system32\notepad.exe"; 
                //Process.Start(psi);
                //------------------------------------------------------

                /////////////////////----------------------------------

                printProcess.StartInfo = psi;
                /////psi.CreateNoWindow = true;

                //psi.FileName = "Application.StartupPath" + "/PrintingDocketFile/PrintCustomerOrder.txt";
                //p.StartInfo.FileName = "Notepad.EXE";
                //p.StartInfo.Arguments = "/i /q \"" + installationPackages[i] + "\"";

                printProcess.Start();

                /////////////////////////-------------------------------
                while (!printProcess.HasExited) ;


                if (!printProcess.HasExited)
                {
                    printProcess.Close();
                }
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top