2017-05-12 12 views
0

Savez-vous s'il est possible de démarrer un logiciel sur un moniteur spécifique? Et comment cela peut-il être fait? J'ai un serveur node.js sur mon ordinateur (windows 10) et j'ai besoin de démarrer un logiciel externe (je ne peux pas changer de code dans ce logiciel externe, parce que je n'ai que le fichier exe). L'application finale devrait fonctionner sur une configuration avec un vrai moniteur et un second faux moniteur. Sur le premier moniteur est une fenêtre de navigateur en plein écran. Il y a un bouton de démarrage et d'arrêt (ils fonctionnent déjà) pour démarrer et arrêter le logiciel externe. Sur le second moniteur (non visible) devrait démarrer le logiciel externe. Si tout fonctionne de cette façon, je peux me connecter par télécommande sur cet ordinateur et regarder le second écran. Là, je peux utiliser le logiciel externe. Et sur le moniteur (1) de cet ordinateur est toujours seulement la fenêtre du navigateur visible.Démarrer l'exe externe avec node.js sur le deuxième moniteur

Pour tester, j'utilise notepad.exe comme logiciel externe. Si je clique sur Démarrer, le logiciel s'ouvre sur mon moniteur principal (1) mais il devrait démarrer sur le second moniteur.

Merci pour votre aide.

Répondre

0

Il semble que ce n'est pas possible directement. Mais si vous commencez avec node.js un petit programme d'aide, ce n'est pas si difficile. Vous pouvez commencer avec execFile() consulter: nodejs docs

J'ai fait une petite application console C# avec les fonctions suivantes:

[DllImport("user32.dll", EntryPoint = "SetForegroundWindow")] 
    public static extern IntPtr SetForegroundWindow(IntPtr hWnd); 

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

    [DllImport("user32.dll", SetLastError = true)] 
    internal static extern bool MoveWindow(IntPtr hWnd, int x, int y, int nWidth, int nHeight, bool bRepaint); 

J'itérés System.Windows.Forms.Screen.AllScreens et a commencé avec Process mon exécutable. De Process J'ai obtenu le MainWindowHandle et avec cela, il est possible de définir la fenêtre sur l'écran que vous voulez.

static void Main(string[] args) 
    { 
     if (args.Length == 1 && args[0].Equals("h")) 
     { 
      Console.Out.WriteLine("Command: [displayName] [executable] [arguments for executable]"); 
      return; 
     } 

     if (args.Length < 2) 
     { 
      Console.Out.WriteLine("arguments not correct. Should be: [displayName] [executable1] [arguments for executable]"); 
      return; 
     } 

     foreach (var screen in Screen.AllScreens) 
     { 
      Console.Out.WriteLine(screen.DeviceName); 
      if (screen.DeviceName.Equals(args[0])) 
      { 
       var process = new Process(); 

       process.StartInfo.FileName = args[1]; 
       string[] arguments = args.Skip(2) as string[]; 
       if (arguments != null) process.StartInfo.Arguments = string.Join(" ", arguments); 

       process.Start(); 

       var hwnd = process.MainWindowHandle; 
       Console.Out.WriteLine("while get process.MainWindowHandle"); 
       while (!process.HasExited) 
       { 
        process.Refresh(); 
        if (process.MainWindowHandle.ToInt32() != 0) 
        { 
         hwnd = process.MainWindowHandle; 
         break; 
        } 
       } 
       Console.Out.WriteLine("windowHandle: " + hwnd); 

       MoveWindow(hwnd, screen.WorkingArea.X, screen.WorkingArea.Y, screen.WorkingArea.Width, screen.WorkingArea.Height, true); 
       ShowWindow(hwnd, SwMaximize); 
       SetForegroundWindow(hwnd); 
       // Waits here for the process to exit. 
       process.WaitForExit(); 
       return; 
      } 
     } 
     Console.Out.WriteLine("screen not found: " + args[0]); 
    } 
}