在Windows命令行上设置应用程序窗口位置

55
我有一个应用程序,它在我的桌面的0x0位置启动。我想把它打开到桌面中央。我不想打开它并使用移动命令将其移动到中心,而是希望我的应用程序立即从中心位置开始运行。
是否有任何通过命令提示符实现这一点的方法?

2
Windows?Linux?桌面环境?编程语言?您是否拥有程序的源代码?请更加具体。 - Anton
嗨Anton,我正在使用Windows。不,我没有源代码,我有一个动画创建器,它的输出是exe文件,但我无法为输出的exe文件设置窗口位置,它总是在0x0位置打开。 - Inside Man
1
@Sorpigal的回答可能会有所帮助;您可以创建一个批处理文件,使用cmdow启动可执行文件并移动它的窗口。 - Anton
我在我的博客上发布了如何使用通用批处理脚本以简单的方式完成此操作。 - parallelsignal
9个回答

36
你需要使用额外的工具,如cmdow.exe才能实现此操作。请特别注意/mov开关。你可以从cmdow启动你的程序,或者先单独运行它,然后调用cmdow来按需移动/调整大小。

1
你必须对此做出决定。如果你不想使用实用程序,那么你实际上必须编写一个使用MoveWindow()的程序。 - Hans Passant
你能给个例子吗?我不知道如何使用带有/mov参数的cmdow。 - barlop
1
@barlop:cmdow不支持“center”,您需要自己计算并将适当的值传递给/mov。您想要在另一个框中居中一个框的公式吗? - sorpigal
1
@Sorpigal 我的意思是只是使用/mov命令行,但我现在明白了...从另一个窗口C:>cmdow "abcdefg" /MOV 4 6,先在C:>title abcdefg<ENTER>。 - barlop
1
如果您键入 cmdow /?,所有内容都将被显示出来。 - dgo
显示剩余4条评论

32

我发现AutoHotKey非常适合窗口定位任务。

这是一个示例脚本。将其命名为notepad.ahk, 然后从命令行运行或双击运行它。

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

它将启动一个应用程序(记事本),然后调整窗口大小,使其在窗口中心具有10像素的边框。


嗨Fuzzy,感谢回复。"it is centered in the window with a 10 pixel border on all sides."是什么意思?这段代码是否会在不同分辨率的电脑上将我的应用程序居中显示在窗口中心并且留有10像素的边框? - Inside Man
请查看WinMove文档。参数X和Y被赋值为10,宽度和高度被赋值为屏幕大小减去20。因此,这取决于您想要在窗口周围留多少空间。如果您想要最大化窗口,请使用WinMaximize函数。 - FuzzyWuzzy
@FuzzyWuzzy 很棒的解决方案!我使用AutoHotKey创建了一个脚本,打开了四个VBALink模拟器实例(用于联机游戏),调整所有窗口大小,使它们各自占据桌面的1/4,并将每个窗口定位在屏幕的不同角落(左上、右上、左下和右下)。它非常好用! - Leonardo Montenegro
嗨Fuzzy,这是个好主意。我已经考虑了我的情况,我想使用cmd.exe运行一个Python脚本,并在Python脚本运行时将cmd窗口移动到特定位置。可惜我找不到方法。如果我按照您发布的方式操作,当命令运行到WinMove时,脚本已经退出了。请给我更多建议好吗?似乎autohotkey不支持多线程。谢谢。 - roachsinai
使用“Window Spy”工具来轻松识别搜索的ahk_class。 - SkorpEN

27

我在寻找解决同样问题的过程中偶然发现了这个问题。

经过一些尝试,我找到了一个答案,它可以按照原帖作者想要的方式工作,并且非常简单易行,但不是很通用。

在桌面或其他位置创建一个快捷方式(您可以使用右键菜单中的“创建快捷方式助手”),将其设置为运行程序“cmd.exe”,并运行它。当窗口打开时,将其定位到您想要的位置。 要保存该位置,请打开属性菜单并点击“保存”。

现在,如果您想要,还可以设置其他属性,如颜色,我强烈建议将缓冲区设置为120-240的宽度,高度为9999,并启用快速编辑模式(为什么不是默认值?!)

现在你有一个可行的快捷方式。为每个您想要以不同位置打开的CMD窗口创建一个这样的快捷方式。

现在说说技巧:windows的CMD START命令可以运行快捷方式。您无法在启动之前以编程方式重新定位窗口,但至少它会出现在您想要的位置,您可以从批处理文件或其他程序中启动它(和其他程序)。

使用cmd /c与快捷方式,您可以创建一个命令,像这样一次启动所有链接的快捷方式:

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

这将以单击的方式打开所有命令窗口到您喜欢的位置,并单独设置属性,如前景色、背景色、字体、管理员模式、快速编辑模式等。现在将该“链接”移到启动文件夹中,您就可以自动还原状态,而不需要任何外部程序。

这是一个相当简单直接的解决方案。它不是通用的,但我相信它将解决大多数阅读此问题的人尝试解决的问题。

最近我这样做了,所以我会在这里发布我的cmd文件:

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

晚些时候编辑:我没有提到,如果运行原始的cmd /c命令时是提升的,则您的每个窗口(如果选择了提升)都可以启动提升,而无需单独重新提示您。这非常方便,因为每次我启动计算机时我都会启动3个cmd窗口和3个其他应用程序。


这是一个聪明的解决方案,谢谢。看起来像是一个可接受的hack,但我认为制作一个带有正确标签的多个快捷方式文件夹,比如monitor0_upperleft、monitor0_upperight等,会稍微改进一下。这些可以在需要时被重复使用,只需简单地调用它们即可。再次感谢,非常感激。 - jacktrader
@jacktrader 这基本上就是我一直在做的事情。你甚至可以编写一个批处理文件,在启动时执行给定目录中的所有脚本。 - Bill K
最近我发现了一件事情,因为需要使用自动脚本进行提权(而不是在脚本中保存凭据)...就是在本地安全策略中设置,在本地策略-->安全选项-->UAC(底部的策略集)中将“以管理员批准模式运行所有管理员”设置为“禁用”,并将“升级提示的行为”设置为“无需提示即可提升”...这将使Windows在管理员身份下自动提升权限..真是太好了。当然还有需要考虑的问题。哈哈。再次感谢。 - jacktrader

5
你可以在这里使用nircmd项目:http://www.nirsoft.net/utils/nircmd.html 示例代码:
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

1
nircmd让我在一台无法安装PowerToys FancyZones的机器上,将所有活动窗口居中于4K显示器上。nircmd win setsize alltop 960 1 1920 2160 - Stefano Spinucci

4

如果您只想在启动时或从桌面快捷方式启动,则Bill K.的答案是最优雅的。

只需打开窗口,右键单击并选择属性。 选择布局 取消选中“让系统定位窗口” 然后点击确定。

现在窗口会在您想要的位置打开。 您可以同时在其他选项卡上设置字体和窗口颜色。 棒极了。


4

这可能应该是在 cmdow.exe 的回答下的评论,但我写了一个简单的批处理文件,以实现对任务栏中可见的所有窗口进行相当复杂且简单的控制。

第一步是运行 cmdow /t 来显示这些窗口的列表。查看列 Image 中的图像名称,然后执行以下命令:

mycmdowscript.cmd imagename

以下是批处理文件的内容:
:: 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

示例用法

:: will set notepad to 500 500

mycmdowscript.cmd notepad siz 500 500

您可以尝试重写此命令以允许对单个命令执行多个操作,但我还没有尝试过。
为了使此功能正常工作,必须将cmdow.exe放置在您的路径中。请注意,当您下载此工具时,您的杀毒程序可能会警告您。过去,恶意软件作者曾使用此工具(我想)来操纵窗口。它本身不会造成伤害。

3

2
我也想做这件事情,然后发现了这个帖子:Positioning CMD Window。它不需要下载任何外部文件,因为它会动态地创建一个小的VBScript来执行所有操作。你只需要在以下部分指定X和Y坐标:Cscript //nologo "%~DP0pos.vbs" "%~F0" 100 50。.vbs脚本也会在执行后被删除,所以没有必要清理任何东西。
将此放置在批处理文件的顶部:
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 ------------------------------------------------------------------------------

请将您自己批处理文件的内容放在这里

最后加上这个:

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 ------------------------------------------------------------------------------

祝您愉快 :)


1
感谢FuzzyWuzzy,使用以下代码(快速且简单的示例,针对1920x1080屏幕分辨率 - 不包括自动宽度和高度计算或函数使用等)在AutoHotKey中实现以下目标: {{link1:enter image description here}}
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

小修改自动计算 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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接