write simple script make how generate example create commands batch bat parameters batch-file launching-application multiple-monitors

parameters - simple - Especifique el monitor al abrir el archivo.(.murciélago)



how to write a simple batch bat file (2)

(Win 7) Para especificar la ubicación para abrir una ventana de CMD, simplemente ejecute el lote o CMD y luego coloque la ventana de CMD donde desee, incluido en qué monitor si tiene más de uno, y luego haga clic con el botón derecho en su barra de título, seleccione Propiedades, y haga clic en Aceptar. La próxima vez que se abra la ventana de CMD utilizando el mismo lote o icono, estará en la nueva ubicación.

El siguiente archivo .bat a continuación simplemente abre dos archivos de texto superpuestos, pero me pregunto si es posible definir una fuente de visualización específica, o si alguien puede ayudar a proporcionar los parámetros correctos.

@echo off START /max /wait NOTEPAD.EXE C:/test/screen1.txt START /max /wait NOTEPAD.EXE C:/test/screen2.txt

Lo que estoy tratando de obtener:

@echo off START /max /wait NOTEPAD.EXE C:/test/screen1.txt "monitor1" START /max /wait NOTEPAD.EXE C:/test/screen2.txt "monitor2"

Entonces, los resultados que estoy tratando de recibir es que screen1.txt se abre en monitor1, y screen2.txt en monitor2.


A menos que la aplicación que está iniciando tenga un modificador de línea de comando para ella, no hay una manera fácil de especificar en qué monitor mostrar una ventana. Hasta donde yo sé, ni el start ni el notepad admiten dicho cambio. La solución más cercana que he encontrado es mover una ventana después de que ya está abierta.

Y mover una ventana tampoco es una tarea fácil. Vea esta publicación para algunas otras opciones. Pero aquí hay un script por lotes que compondrá y vinculará una aplicación C # sobre la marcha para manejar movimientos de ventanas.

@echo off setlocal :: // generate c.cs call :heredoc movewind >"%temp%/c.cs" && goto compile_and_link // syntax: movewind.exe [pid | "window title"] x y using System; using System.Diagnostics; using System.Runtime.InteropServices; class movewind { [DllImport("user32.dll", SetLastError = true)] private static extern bool SetWindowPos(IntPtr hWnd, IntPtr hWndInsertAfter, int x, int y, int cx, int cy, uint uFlags); [DllImport("user32.dll", SetLastError = true)] static extern IntPtr FindWindow(string lpClassName, string lpWindowName); static void Main(string[] args) { int pid; string title; bool res = Int32.TryParse(args[0], out pid); if (res) {title = Process.GetProcessById(pid).MainWindowTitle;} else {title = args[0];} IntPtr handle = FindWindow(null, title); try { SetWindowPos(handle, IntPtr.Zero, Convert.ToInt32(args[1]), Convert.ToInt32(args[2]), 0, 0, 0x41); } catch (Exception e) { Console.WriteLine("Exception caught while attempting to move window with handle " + handle); Console.WriteLine(e); } } } :compile_and_link set "movewind=%temp%/movewind.exe" for /f "delims=" %%I in (''dir /b /s "%windir%/microsoft.net/*csc.exe"'') do ( if not exist "%movewind%" "%%I" /nologo /out:"%movewind%" "%temp%/c.cs" 2>NUL ) del "%temp%/c.cs" if not exist "%movewind%" ( echo Error: Please install .NET 2.0 or newer. goto :EOF ) :: // get left monitor width for /f "tokens=2 delims==" %%I in (''wmic desktopmonitor get screenwidth /format:list'') do set "x=%%I" :: // make sure test environment is in place if not exist "c:/test" mkdir "c:/test" if not exist "c:/test/screen1.txt" >"c:/test/screen1.txt" echo This should be on the left. if not exist "c:/test/screen2.txt" >"c:/test/screen2.txt" echo This should be on the right. :: // syntax: movewind.exe [pid | "window title"] x y start /max notepad.exe "c:/test/screen1.txt" call :movewind "screen1.txt - Notepad" 0 0 start /max notepad.exe "c:/test/screen2.txt" call :movewind "screen2.txt - Notepad" %x% 0 del "%movewind%" :: // end main runtime goto :EOF :: // SCRIPT FUNCTIONS :movewind <title> <x> <y> tasklist /v | find /i "%~1" && ( "%movewind%" "%~1" %~2 %~3 goto :EOF ) || ( ping -n 1 -w 500 169.254.1.1 >NUL goto movewind ) :heredoc <uniqueIDX> :: // https://.com/a/15032476/1683264 setlocal enabledelayedexpansion set go= for /f "delims=" %%A in (''findstr /n "^" "%~f0"'') do ( set "line=%%A" && set "line=!line:*:=!" if defined go (if #!line:~1!==#!go::=! (goto :EOF) else echo(!line!) if "!line:~0,13!"=="call :heredoc" ( for /f "tokens=3 delims=>^ " %%i in ("!line!") do ( if #%%i==#%1 ( for /f "tokens=2 delims=&" %%I in ("!line!") do ( for /f "tokens=2" %%x in ("%%I") do set "go=%%x" ) ) ) ) ) goto :EOF