用Autohotkey实现分屏

来源:互联网 发布:数组和指针的区别 编辑:程序博客网 时间:2024/04/30 14:42

用Autohotkey实现分屏

by Homeway                                                                                                            

                                                                                    


大显示器(比如22英寸),常常需要手动改变窗口大小,以适应操作需要,提高效率。但是手动,不够精确,而且相当浪费时间。但是分屏软件大多收费,而且我自己又特别喜欢portable软件。所以我用Autohotkey编了个分屏软件。


比如如下组合:




------------------------------------------------------------------------------------------------------------------------

【软件界面】


------------------------------------------------------------------------------------------------------------------------

【使用方法】

1.打开splitscreen.exe
2.在任意窗口,按下快捷键Win+j
3.在弹出的窗口中输入对应模式,回车实现分屏
------------------------------------------------------------
输入模式说明:
【常规输入】输入3个数字 $$$
〖111,12$,13$,22$,23$,32$,24$,42$,33$〗
例如132,即Model 13第二块。将屏幕分成1行3列,窗口移动到第二块

【快捷输入】输入2个数字,或1个数字
在argument文件夹中,有配置文件splitscreen.ini
[Model]下:
例如3=13,即输入32,效果等同于【常规输入】的132
[Model0]下:
例如4=132,即输入4,效果等同于【常规输入】的132
------------------------------------------------------------

------------------------------------------------------------------------------------------------------------------------

【配置文件】

于程序所在文件夹新建文件夹argument,在这个argument文件夹中新建splitscreen.ini的设置文件。设置文件中可以配置如何分配屏幕。

原始配置文件内容如下(可根据需要自行修改):

[Model];此处,例如12,表示将屏幕均分成1行2列1=112=123=134=22[Model0];此处,例如122,表示将屏幕均分成1行2列,取第二分块1=1212=1223=1314=1325=133


-----------------软件下载------------------------------------------------------------------------------------------------------

点击下载

注:可能会被杀毒软件报病毒,但绝对无毒。源代码如下,可自行用Autohotkey生成exe

-----------------code-------------------------------------------------------------------------------------------------------

code下载

;#NoTrayIcon ;Modified by Homeay 20120712_1941;Work on MultiMonitor;------Split Screen------------------------------------------------------#j:: ;快捷键 Win + JWinGet, active_ID, ID, A                  ;获取当前窗口IDwinID := GetMonitorNoOfWindow(active_ID)  ;获取当前显示器IDSysGet, MonitorWorkArea, MonitorWorkArea, %winID%;构建图形化输入界面guiW = 600 ; Width of GUI input windowmx := (MonitorWorkAreaLeft + MonitorWorkAreaRight)/2 - guiW/2;Gui, Add, Picture, w450 h-1, %A_ScriptDir%\argument\splitscreen.jpgGui, Add, Picture, w%guiW% h-1, %A_ScriptDir%\argument\splitscreen.jpgGui, Add, Text,section, Model Block:Gui, Add, Edit, vModelBlock ys  ; The ym option starts a new column of controls.Gui, Add, Button, default, OK  ; The label ButtonOK (if it exists) will be run when the button is pressed.Gui, Show, x%mx% yCenter, Split Windowreturn  GuiClose:ButtonOK:Gui, Submit  ; Save the input from the user to each control's associated variable.Gui DestroyStringLen, length, ModelBlock;MsgBox, The length of ModelBlock is %length%.If length =1{IniRead, ModelBlock, %A_ScriptDir%\argument\splitscreen.ini, Model0, %ModelBlock%StringLen, length, ModelBlock}If length = 2{Transform, blockID, Mod, ModelBlock, 10Transform, modelXY, Floor, ModelBlock/10IniRead, modelXY, %A_ScriptDir%\argument\splitscreen.ini, Model, %modelXY%SplitWin(active_ID, modelXY, blockID) ;modelXY 行列,blockID 序号}else If length = 3{Transform, blockID, Mod, ModelBlock, 10Transform, modelXY, Floor, ModelBlock/10SplitWin(active_ID, modelXY, blockID) ;modelXY 行列,blockID 序号}else if length = 4{Transform, blockID, Mod, ModelBlock, 100Transform, modelXY, Floor, ModelBlock/100SplitWin2(active_ID, modelXY, blockID)}Return;-------Functions-----------------------------------------------------GetMonitorNoOfWindow(active_ID){;Get Center point of The WindowWinGetPos, WinXPos, WinYPos, WinWidth, WinHeight, ahk_id %active_ID%WinCenterXPos := WinXPos + WinWidth/2WinCenterYPos := WinYPos + WinHeight/2;Parameters of MonitorsSysGet, MonitorCount, MonitorCount;MonitorNoOfWindow = 1Loop, %MonitorCount%{SysGet, MonitorWorkArea, MonitorWorkArea, %A_Index%;MsgBox, Monitor:`t#%A_Index%`nName:`t%MonitorName%`nLeft:`t%MonitorLeft% (%MonitorWorkAreaLeft% work)`nTop:`t%MonitorTop% (%MonitorWorkAreaTop% work)`nRight:`t%MonitorRight% (%MonitorWorkAreaRight% work)`nBottom:`t%MonitorBottom% (%MonitorWorkAreaBottom% work)If (MonitorWorkAreaLeft < WinCenterXPos) and (WinCenterXPos < MonitorWorkAreaRight){If (MonitorWorkAreaTop < WinCenterYPos)and(WinCenterYPos < MonitorWorkAreaBottom){Return A_Indexbreak}}}}; 均分屏幕,取其一SplitWin(active_ID, modelXY, blockID){;Get Monitor InformationwinID := GetMonitorNoOfWindow(active_ID)SysGet, MonitorWorkArea, MonitorWorkArea, %winID%MonitorWidth := MonitorWorkAreaRight - MonitorWorkAreaLeftMonitorHeight :=MonitorWorkAreaBottom - MonitorWorkAreaTop;Get Model InformationTransform, modelX, Mod, modelXY, 10Transform, modelY, Floor, modelXY/10Transform, blockX, Mod, blockID-1, modelXTransform, blockY, Floor, (blockID-1)/modelX;MsgBox, blockX:%blockX%`nblockY:%blockY%WinWidth := MonitorWidth/modelXWinHeight := MonitorHeight/modelYWinXOffset :=MonitorWorkAreaLeft + WinWidth*(blockX)WinYOffset :=MonitorWorkAreaTop + WinHeight*(blockY);Move the WindowWinMove, ahk_id %active_ID%, , %WinXOffset%, %WinYOffset%, %WinWidth%, %WinHeight%}; 均分屏幕,取其多块SplitWin2(active_ID, modelXY, blockID){;Get Monitor InformationwinID := GetMonitorNoOfWindow(active_ID)SysGet, MonitorWorkArea, MonitorWorkArea, %winID%MonitorWidth := MonitorWorkAreaRight - MonitorWorkAreaLeftMonitorHeight :=MonitorWorkAreaBottom - MonitorWorkAreaTop;Get Model InformationTransform, modelX, Mod, modelXY, 10Transform, modelY, Floor, modelXY/10Transform, blockHorV, Mod, blockID, 10;If blockHorV = 0{blockH = 2blockV = 1}else{blockH = 1blockV = 2}Transform, blockID, Floor, blockID/10Transform, blockX, Mod, blockID-1, modelXTransform, blockY, Floor, (blockID-1)/modelX;MsgBox, blockX:%blockX%`nblockY:%blockY%WinWidth := MonitorWidth/modelX*blockHWinHeight := MonitorHeight/modelY*blockVWinXOffset :=MonitorWorkAreaLeft + MonitorWidth/modelX*(blockX)WinYOffset :=MonitorWorkAreaTop + MonitorHeight/modelY*(blockY);Move the WindowWinMove, ahk_id %active_ID%, , %WinXOffset%, %WinYOffset%, %WinWidth%, %WinHeight%}

------------------------------------------------------------------------------------------------------------------------