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

Posted

技术标签:

【中文标题】通过命令行设置应用程序的窗口位置【英文标题】:Set The Window Position of an application via command line 【发布时间】:2011-12-20 02:39:10 【问题描述】:

我有一个应用程序从桌面的 0x0 位置开始。我想在我的桌面中心打开它。我不想打开它并使用移动命令将其移动到中心位置,只想让我的应用程序立即在中心位置启动。

有没有办法通过命令提示符来做到这一点?还有什么办法吗?

【问题讨论】:

Windows? Linux?桌面环境?语言?你有程序的来源吗?请更具体。 嗨 Anton,我正在使用 Windows。不,我没有源,我有一个动画创建器,它的输出是 exe,但我无法设置输出 exe 的窗口位置,它总是在 0x0 位置打开。 @Sorpigal 的回答可能会有所帮助;您可以创建一个批处理文件来启动可执行文件并使用cmdow 移动它的窗口。 我在my blog上发布了如何使用通用批处理脚本以任何简单的方式完成此操作 【参考方案1】:

您需要一个额外的实用程序,例如cmdow.exe 来完成此操作。具体看/mov 开关。您可以从cmdow 启动程序或单独运行它,然后调用cmdow 以根据需要移动/调整它的大小。

【讨论】:

感谢您的回复,但是您能给我将我的应用程序移到桌面中心的代码吗? 你必须下定决心。如果您不想使用实用程序,那么您实际上必须编写一个使用 MoveWindow() 的程序。 你能举个例子吗?我看不到如何将 cmdow 与 /mov 一起使用 @barlop:cmdow 不支持“中心”,您必须自己计算并将适当的值传递给/mov。您是否想要将一个框置于另一个框内的公式? @Sorpigal 我的意思只是命令行使用 /mov 但我现在明白了.. 做 C:\>title abcdefg 然后从另一个窗口 C:\>cmdow "abcdefg" / MOV 4 6【参考方案2】:

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

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

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

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

【讨论】:

嗨 Fuzzy,感谢您的回复,您所说的“它在窗口中居中,四周都有 10 像素的边框”是什么意思。此代码是否以不同分辨率在所有计算机上的窗口中心打开我的应用程序? 查看WinMove 文档。参数 X 和 Y 的值是 10,宽度和高度的值是:屏幕尺寸 - 20。所以这取决于你想要在窗口周围有多少空间。如果您想最大化窗口,请改用WinMaximize 函数。 @FuzzyWuzzy 很好的解决方案!使用 AutoHotKey,我创建了一个脚本,打开四个 VBALink emulator 实例(用于网络游戏),调整所有窗口的大小以使每个窗口占据桌面的 1/4,并将每个窗口定位在我的不同角落屏幕(左上、右上、左下和右下)。它就像一个魅力! 嗨 Fuzzy,这是个好主意。我考虑过我的情况,我想使用 cmd.exe 运行 python 脚本,在 python 脚本运行时将 cmd 窗口移动到特殊位置。可悲的是,我找不到方法。如果我按照你发布的那样做,当命令运行到WinMove 时,脚本已经退出。请给我更多建议吗?似乎自动热键不支持多线程。谢谢。 使用“Window spy”来轻松识别搜索到的 ahk_class【参考方案3】:

我只是在寻求做同样的事情时发现了这个问题。

经过一些试验,我发现了一个符合 OP 想要的方式的答案,并且非常简单,但不是很通用。

在您的桌面或其他地方创建一个快捷方式(您可以使用右键菜单中的创建快捷方式助手),将其设置为运行程序“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 这就是我一直在做的事情。您甚至可以编写一个批处理文件来在启动时执行给定目录中的所有脚本。 我最近发现的一件事,因为需要具有提升的自动脚本(无需在脚本中保存凭据).. 是在本地安全策略中设置,在本地策略 --> 安全选项 -- > UAC(底部策略集)并将在管理员批准模式下运行所有​​管理员设置为“已禁用”和提升提示的行为...“不提示提升”.. 如果您是管理员,则将 Windows 设置为自动提升。这么棒的发现。当然,也有需要考虑的地方。哈哈。再次感谢。【参考方案4】:

如果您只想在启动时启动一个窗口或从桌面上的快捷方式启动,Bill K. 的回答是最优雅的。

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

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

【讨论】:

【参考方案5】:

这可能应该是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 必须位于您的路径中。请注意,当您下载它时,您的 AV 程序可能会对您大喊大叫。该工具 (I guess) 过去曾被恶意软件作者用来操纵窗口。它本身无害。

【讨论】:

【参考方案6】:

如果您乐于运行批处理文件和几个小帮助程序,这里发布了完整的解决方案:How can a batch file run a program and set the position and size of the window? - Stack Overflow (asked: May 1, 2012)

【讨论】:

【参考方案7】:

您可以在这里使用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

【讨论】:

nircmd 允许我在无法安装 PowerToys 的机器上将所有活动窗口集中在 4K 显示器上 FancyZones nircmd win setsize alltop 960 1 1920 2160【参考方案8】:

感谢 FuzzyWuzzy,在 AutoHotKey 中设置以下代码(1920x1080 屏幕分辨率的 Quick & Dirty 示例 - 无需自动计算宽度和高度或使用函数等) 实现以下目标:

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

【讨论】:

【参考方案9】:

我也想这样做并遇到了这个帖子: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 ------------------------------------------------------------------------------

享受:)

【讨论】:

以上是关于通过命令行设置应用程序的窗口位置的主要内容,如果未能解决你的问题,请参考以下文章

CMD是啥``在哪里打开```

adb 命令获取当前界面的位置

Ubuntu 下 Terminal,怎么设置开始的位置

第52课 命令行参数的应用

Kubernetes命令行工具--kubectl管理

Win7怎么使用命令行启动和停止Windows服务程序