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