1. 程式人生 > >Cmdow-一個win32窗口管理命令行工具

Cmdow-一個win32窗口管理命令行工具

窗口大小 stat 最小 簡易 進行 殺毒軟件 this .com github

最近有個需求,將同一個程序運行8個實例,並按照規則在兩個窗口上分布,本以為用bat就可以實現,結果發現沒那麽容易,搜了很久找到了這個工具cmdow.exe,發現這個東西真不錯。

符合了我們項目的需求:單文件,離線可用,免安裝,非常省心。

直接bat裏調用,可以實現很多功能,但是我們這次的需求用bat實現還比較難(bat的for循環裏的賦值結合運算很難搞),於是就結合C#實現了。

簡易入門教程

第一部分

cmdow : 顯示所有進程

cmdow /t : 顯示所有在任務欄上的進程

cmdow /t /p:顯示所有任務欄上的進程並顯示其窗口位置和大小

第二部分

CMDOW /TH | /TV | /CW | /MA | /UW | /AT | /FS | /WM
這幾個都是分布窗口的命令,針對所有窗口的,具體參見官方文檔

第三部分

CMDOW window {[/ACT] [/INA] [/ENA] [/DIS] [/VIS] [/HID] [/MIN] [/MAX] [/RES]} CMDOW window {[/REN newcaption] [/TOP] [/NOT] [/MOV left top] [/SIZ width height] [/CLS] [/END]}

針對具體某一個窗口的操作,只介紹一下我用到的:
首先,怎麽確定是哪個窗口?
通過cmdow /t ,可以看到進程的 Handle(第一列)以及Caption(最後一列)

技術分享圖片

使用 Handle 或者 Caption 都可以指定具體的窗口,但是建議使用Handle,因為是唯一的(Caption可能存在一樣的,例如上圖中的“UE4_Program (64-bit, PCD3D_SM5)"就有兩個實例)

例如設置上圖中UE4_Program (64-bit, PCD3D_SM5)的窗口大小和位置:

cmdow 0x080A30 /siz 500 500

cmdow 0x080A30 /mov 0 0

這種方法可以具體設置到某個實例。

或者:

cmdow "UE4_Program (64-bit, PCD3D_SM5)" /siz 500 500

cmdow "UE4_Program (64-bit, PCD3D_SM5)" /mov 0 0

這種方法只能模糊查找,在兩個UE4的進程中選一個進行設置,註意,因為Caption中含有空格,所以名字要用引號包含起來。

第四部分

其他命令舉例:

/hid可以將進程隱藏,任務欄和系統托盤裏都看不到(難怪cmdow容易被殺毒軟件殺掉,這容易偷偷幹壞事)

/cls將任務關閉

第五部分

此外使用cmdow還可以啟動進程, 格式如下:

CMDOW /RUN [state] file [args] 

其中 state 可以是這三個參數中的一個: /MAX /MIN /HID,分別是最大化,最小化以及隱藏

file就是要執行的可執行文件,如果名稱中包含空格,一樣要用雙引號包裹。 args就是可執行文件的其他參數(程序自己定義的)

第六部分

官方的幾個使用案例:

關閉所有任務欄上的進程:

@echo off
:: Hide this console window so its not shown on taskbar
cmdow @ /hid
for /f %%a in (‘cmdow /t‘) do cmdow %%a /cls
:: Now close this console window
cmdow @ /cls

輸出當前屏幕的尺寸:(level是0的進程是個特殊進程,能通過他獲得當前屏幕分辨率)

@echo off
for /f "tokens=2,10-11" %%a in (‘cmdow /p‘) do (
if "%%a"=="0" set "WIDTH=%%b" & set "HEIGHT=%%c"
)
echo Resolution is %WIDTH%x%HEIGHT%

根據官方的案例,我們也可很容易寫出這樣的功能:
例如,設置所有名稱為RAS_General的進程的窗口大小為800*800,並把窗口位置移動到0,0 點:

@echo off

for /f "tokens=1,9" %%a in (‘cmdow /t‘) do(

if "%%b"=="RAS_General" (

cmdow %%a /siz 800 800

cmdow %%a /mov 0 0

)

)

Cmdow-一個win32窗口管理命令行工具