简体   繁体   English

通过命令行设置应用程序的窗口位置

[英]Set The Window Position of an application via command line

I have an application which start in 0x0 position of my desktop.我有一个从桌面 0x0 位置开始的应用程序。 I want to open it in center of my desktop.我想在我的桌面中央打开它。 I do not want to open it and use a move command to move it into center, just want my app to start immediately in center position.我不想打开它并使用移动命令将它移动到中心,只想让我的应用程序立即在中心位置启动。

Is there any way to do this via command prompt?有没有办法通过命令提示符来做到这一点? Any other way?还有什么办法吗?

You'll need an additional utility such as cmdow.exe to accomplish this.您将需要一个额外的实用程序,例如cmdow.exe来完成此操作。 Look specifically at the /mov switch.专门查看/mov开关。 You can either launch your program from cmdow or run it separately and then invoke cmdow to move/resize it as desired.您可以从cmdow启动您的程序,也可以单独运行它,然后调用cmdow以根据需要移动/调整其大小。

Have found that AutoHotKey is very good for window positioning tasks.发现AutoHotKey非常适合窗口定位任务。

Here is an example script.这是一个示例脚本。 Call it notepad.ahk and then run it from the command line or double click on it.将其命名为 notepad.ahk ,然后从命令行运行它或双击它。

Run, notepad.exe
WinWait, ahk_class Notepad
WinActivate
WinMove A,, 10, 10, A_ScreenWidth-20, A_ScreenHeight-20

It will start an application (notepad) and then adjust the window size so that it is centered in the window with a 10 pixel border on all sides.它将启动一个应用程序(记事本),然后调整窗口大小,使其在窗口中居中,所有边都有 10 像素的边框。

I just found this question while on a quest to do the same thing.我刚刚在寻求做同样的事情时发现了这个问题。

After some experimenting I came across an answer that works the way the OQ would want and is simple as heck, but not very general purpose.经过一些实验,我发现了一个答案,它的工作方式符合 OQ 想要的方式,而且非常简单,但不是很通用。

Create a shortcut on your desktop or elsewhere (you can use the create-shortcut helper from the right-click menu), set it to run the program "cmd.exe" and run it.在桌面或其他地方创建一个快捷方式(您可以使用右键菜单中的创建快捷方式助手),将其设置为运行程序“cmd.exe”并运行它。 When the window opens, position it where you want your window to be.当窗口打开时,将其放置在您希望窗口所在的位置。 To save that position, bring up the properties menu and hit "Save".要保存该位置,请调出属性菜单并点击“保存”。

Now if you want you can also set other properties like colors and I highly recommend changing the buffer to be a width of 120-240 and the height to 9999 and enable quick edit mode (why aren't these the defaults!?!)现在,如果您愿意,您还可以设置其他属性,例如颜色,我强烈建议将缓冲区的宽度更改为 120-240,将高度更改为 9999 并启用快速编辑模式(为什么这些不是默认值!?!)

Now you have a shortcut that will work.现在你有一个可以工作的快捷方式。 Make one of these for each CMD window you want opened at a different location.为要在不同位置打开的每个 CMD 窗口制作其中一个。

Now for the trick, the windows CMD START command can run shortcuts.现在为了诀窍,windows CMD START 命令可以运行快捷方式。 You can't programmatically reposition the windows before launch, but at least it comes up where you want and you can launch it (and others) from a batch file or another program.您无法在启动前以编程方式重新定位窗口,但至少它会出现在您想要的位置,并且您可以从批处理文件或其他程序启动它(和其他)。

Using a shortcut with cmd /c you can create one shortcut that can launch ALL your links at once by using a command that looks like this:使用带有 cmd /c 的快捷方式,您可以创建一个快捷方式,该快捷方式可以使用如下所示的命令一次启动所有链接:

cmd /c "start cmd_link1 && start cmd_link2 && start cmd_link3"

This will open up all your command windows to your favorite positions and individually set properties like foreground color, background color, font, administrator mode, quick-edit mode, etc... with a single click.这将打开所有命令窗口到您喜欢的位置,并通过单击单独设置前景色、背景色、字体、管理员模式、快速编辑模式等属性。 Now move that one "link" into your startup folder and you've got an auto-state restore with no external programs at all.现在将那个“链接”移动到您的启动文件夹中,您就拥有了一个完全没有外部程序的自动状态恢复。

This is a pretty straight-forward solution.这是一个非常直接的解决方案。 It's not general purpose, but I believe it will solve the problem that most people reading this question are trying to solve.这不是通用目的,但我相信它会解决大多数阅读此问题的人试图解决的问题。

I did this recently so I'll post my cmd file here:我最近做了这个,所以我会在这里发布我的 cmd 文件:

cd /d C:\shortucts
for %%f in (*.lnk *.rdp *.url) do start %%f
exit

Late EDIT: I didn't mention that if the original cmd /c command is run elevated then every one of your windows can (if elevation was selected) start elevated without individually re-prompting you.后期编辑:我没有提到如果原始 cmd /c 命令运行提升,那么您的每个窗口都可以(如果选择了提升)开始提升,而无需单独重新提示您。 This has been really handy as I start 3 cmd windows and 3 other apps all elevated every time I start my computer.这非常方便,因为我每次启动计算机时都会启动 3 个 cmd 窗口和 3 个其他应用程序。

This probably should be a comment under the cmdow.exe answer, but here is a simple batch file I wrote to allow for fairly sophisticated and simple control over all windows that you can see in the taskbar.这可能应该是cmdow.exe答案下的cmdow.exe ,但这里是我编写的一个简单的批处理文件,用于对您可以在任务栏中看到的所有窗口进行相当复杂和简单的控制。

First step is to run cmdow /t to display a list of those windows.第一步是运行cmdow /t以显示这些窗口的列表。 Look at what the image name is in the column Image , then command line:查看Image列中的图像名称,然后是命令行:

mycmdowscript.cmd imagename

Here are the contents of the batch file:以下是批处理文件的内容:

:: mycmdowscript.cmd

@echo off
SETLOCAL ENABLEDELAYEDEXPANSION

SET IMAGE=%1
SET ACTION=/%2
SET REST=1
SET PARAMS=

:: GET ANY ADDITIONAL PARAMS AND STORE THEM IN A VARIABLE

FOR %%I in (%*) DO (
   IF !REST! geq 3 (
      SET PARAMS=!PARAMS! %%I
   )
   SET /A REST+=1
)

FOR /F "USEBACKQ tokens=1,8" %%I IN (`CMDOW /t`) DO (
     IF %IMAGE%==%%J (

     :: you now have access to the handle in %%I
     cmdow %%I %ACTION% !PARAMS!

     )
)

ENDLOCAL
@echo on

EXIT /b

example usage示例用法

:: will set notepad to 500 500

mycmdowscript.cmd notepad siz 500 500

You could probably rewrite this to allow for multiple actions on a single command, but I haven't tried yet.您可能会重写它以允许对单个命令执行多个操作,但我还没有尝试过。

For this to work, cmdow.exe must be located in your path.为此, cmdow.exe必须位于您的路径中。 Beware that when you download this, your AV program might yell at you.请注意,当您下载此文件时,您的 AV 程序可能会对您大喊大叫。 This tool has ( I guess ) in the past been used by malware authors to manipulate windows.这个工具( 我猜)过去曾被恶意软件作者用来操纵窗口。 It is not harmful by itself.它本身并无害处。

Bill K.'s answer was the most elegant if you just want to start a window at startup or start from a shortcut on the desktop.如果您只想在启动时启动一个窗口或从桌面上的快捷方式启动,Bill K. 的回答是最优雅的。

Just open the window where you want it, right click and choose properties.只需打开您想要的窗口,右键单击并选择属性。 select Layout uncheck "let system position window" and click OK.选择布局取消选中“让系统定位窗口”,然后单击“确定”。

Window will now open just where you want it.窗口现在将在您想要的地方打开。 You can set font and window colors at the same time on other tabs.您可以在其他选项卡上同时设置字体和窗口颜色。 sweet.甜的。

You can use nircmd project here: http://www.nirsoft.net/utils/nircmd.html您可以在这里使用nircmd项目: http : nircmd

Example code:示例代码:

nircmd win move ititle "cmd.exe" 5 5 10 10
nircmd win setsize ititle "cmd.exe" 30 30 100 200
nircmd cmdwait 1000 win setsize ititle "cmd.exe" 30 30 1000 600

If you are happy to run a batch file along with a couple of tiny helper programs, a complete solution is posted here:如果您乐于运行批处理文件和几个小帮助程序,这里发布了一个完整的解决方案:
How can a batch file run a program and set the position and size of the window? 批处理文件如何运行程序并设置窗口的位置和大小? - Stack Overflow (asked: May 1, 2012) - Stack Overflow(问:2012 年 5 月 1 日)

Thanks To FuzzyWuzzy , set the following code ( Quick & Dirty Example for 1920x1080 screen resolution - without automatic width and height calculation or function use etc ) in AutoHotKey to achive the following :由于FuzzyWuzzy,设置以下代码(快速和肮脏的实施例为1920×1080的屏幕分辨率-无自动宽度和高度的计算或功能使用等)中的AutoHotkey才达到的情况如下: 在此处输入图片说明

v_cmd = c:\temp\1st_Monitor.ps1
Run, Powershell.exe -executionpolicy remotesigned -File %v_cmd%
SetTitleMatchMode 2
SetTitleMatchMode Fast
WinWait, PowerShell
Sleep, 1000
    ;A = Active window - [x,y,width,height]
WinMove A,, 0, 0,1920,500

v_cmd = c:\temp\2nd_Monitor.ps1
Run, Powershell.exe -executionpolicy remotesigned -File %v_cmd%
WinWait, PowerShell
Sleep, 1000
    ;A = Active window - [x,y,width,height]
WinMove A,, 0, 500,960,400

v_cmd = c:\temp\3rd_Monitor.ps1
Run, Powershell.exe -executionpolicy remotesigned -File %v_cmd%
WinWait, PowerShell
Sleep, 1000
    ;A = Active window - [x,y,width,height]
WinMove A,, 960, 500,960,400

SMALL EDIT same code with Auto X / Y screen size calculation [ 4 monitors ] , yet, can be used for 3 / 2 monitors as well. SMALL EDIT自动 X / Y 屏幕尺寸计算 [4 台显示器]相同的代码,但也可用于 3 / 2 台显示器。

Screen_X = %A_ScreenWidth%
Screen_Y = %A_ScreenHeight%

v_cmd = c:\temp\1st_Monitor.ps1
Run, Powershell.exe -executionpolicy remotesigned -File %v_cmd%
SetTitleMatchMode 2
SetTitleMatchMode Fast
WinWait, PowerShell
Sleep, 1000
    ;A = Active window - [x,y,width,height]
WinMove A,, 0, 0,Screen_X/2,Screen_Y/2

v_cmd = c:\temp\2nd_Monitor.ps1
Run, Powershell.exe -executionpolicy remotesigned -File %v_cmd%
WinWait, PowerShell
Sleep, 1000
    ;A = Active window - [x,y,width,height]
WinMove A,, Screen_X/2, 0,Screen_X/2,Screen_Y/2

v_cmd = c:\temp\3rd_Monitor.ps1
Run, Powershell.exe -executionpolicy remotesigned -File %v_cmd%
WinWait, PowerShell
Sleep, 1000
    ;A = Active window - [x,y,width,height]
WinMove A,, 0, Screen_Y/2,Screen_X/2,Screen_Y/2

v_cmd = c:\temp\4th_Monitor.ps1
Run, Powershell.exe -executionpolicy remotesigned -File %v_cmd%
WinWait, PowerShell
Sleep, 1000
    ;A = Active window - [x,y,width,height]
WinMove A,, Screen_X/2, Screen_Y/2,Screen_X/2,Screen_Y/2

I too wanted to do this and came across this thread: Positioning CMD Window .我也想这样做并遇到了这个线程: Positioning CMD Window No external files to download as it creates a small bit of VBScript on the fly to do all the lifting.无需下载外部文件,因为它会动态创建少量 VBScript 来完成所有工作。 All you need to do is specify your X & Y coordinates in the following section: Cscript //nologo "%~DP0pos.vbs" "%~F0" 100 50 .您需要做的就是在以下部分指定您的 X 和 Y 坐标: Cscript //nologo "%~DP0pos.vbs" "%~F0" 100 50 The .vbs script is also removed after it has been executed too so there is no need to tidy anything up. .vbs 脚本在执行后也会被删除,因此无需整理任何内容。

Place this at the top of your batch file:将其放在批处理文件的顶部:

REM - Position the CMD Window Using .VBS -----------------------------------------
REM == MUST BE AT The Begining of The Batch =========
   IF "%~1" == "RestartedByVBS" Goto :Code

   REM Create the VBScript, if not exist
   IF NOT EXIST "%~DP0pos.vbs" (
      (FOR /F "tokens=1*" %%a in ('findstr "^VBS:" ^< "%~F0"') do (
         echo(%%b
      )) > "%~DP0pos.vbs"
   )
   REM Start "" "%~DP0pos.vbs" "%~F0" 100 50
   Cscript //nologo "%~DP0pos.vbs" "%~F0" 100 50
   EXIT /B
:code
DEL /Q "%~DP0pos.vbs"
REM ------------------------------------------------------------------------------

PLACE THE CONTENTS OF YOUR OWN BATCH FILE HERE在此处放置您自己的批处理文件的内容

And this at the bottom:这在底部:

REM - Position the CMD Window Using .VBS -----------------------------------------
:Pos <BatchFileName> <X_Coordinate> <Y_Coordinate>

REM This Function will take three inputs: the name of the Batch file to execute
REM and the X and Y Coordinates to Position its CMD window

VBS: Set objWMIService = GetObject("winmgmts:\\.\root\cimv2")
VBS: Set objConfig = objWMIService.Get("Win32_ProcessStartup")
VBS: objConfig.SpawnInstance_
VBS: objConfig.X = WScript.Arguments(1)
VBS: objConfig.Y = WScript.Arguments(2)
VBS: Set objNewProcess = objWMIService.Get("Win32_Process")
VBS: intReturn = objNewProcess.Create( chr(34) & WScript.Arguments(0) &chr(34)& " RestartedByVBS", Null, objConfig, intProcessID)
REM ------------------------------------------------------------------------------

Enjoy :)享受 :)

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM