標籤:for迴圈 需求 awr 命令列 螢幕 圖片 特殊 evel 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視窗管理命令列工具