Skip to content

Commit 32f548a

Browse files
committed
增加右边隐藏,修复多显示器问题
增加右边隐藏 修复多显示器问题 增加取消所有窗口隐隐藏状态的按键
1 parent e7f4618 commit 32f548a

File tree

2 files changed

+159
-85
lines changed

2 files changed

+159
-85
lines changed

README.md

+5-1
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@
3333
2. 下载所有`.ahk`文件。
3434
3. 运行 `winautohidev2.ahk`
3535
4. 使用`Ctrl+Left`将窗口屏幕隐藏到左侧,最大化窗口不可隐藏。
36+
5. 使用`Ctrl+F4`取消所有窗口隐藏。
3637

3738
### 方法二
3839

@@ -45,4 +46,7 @@
4546
4. 窗口隐藏后减少占用面积
4647

4748
## Bug记录
48-
1. 多显示仍有问题,当主显示器位于右边时出现
49+
1. 当隐藏窗口和位于其下的窗口为同一应用时出现卡顿
50+
1. 资源管理器隐藏时鼠标移到右键菜单上会导致资源管理器重新隐藏
51+
1. 在多显示器之间窗口移动不够平滑(可能为windows问题)
52+
1. 部分应用窗口宽度获取不准确

winautohidev2.ahk

+154-84
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ SetWinDelay(5)
66

77
; 隐藏时留出的长度以及显示时距离屏幕边缘的长度
88
; 由于DPI关系,margin设置,不同DPI可能不同
9-
margin := 20
9+
margin := 10
1010
showMargin := 0
1111
global margin
1212
global showMargin
@@ -15,13 +15,13 @@ moveDistance := 30
1515
global moveDistance
1616

1717
; 隐藏的窗口
18-
hiddenWindowIds := []
19-
global hiddenWindowIds
18+
hiddenWindowList := []
19+
global hiddenWindowList
2020
; 中间态窗口,鼠标放置暂时显示的窗口
21-
suspendWindowIds := []
22-
global suspendWindowIds
21+
suspendWindowList := []
22+
global suspendWindowList
2323

24-
maxHeight := 1000
24+
maxHeight := 800
2525

2626
; 加入右键菜单
2727
myMenu := A_TrayMenu
@@ -32,15 +32,22 @@ myMenu.Add("Reset all hidden windows", Reset)
3232
Reset(*){
3333
results := getSide()
3434
leftMonitor := results[1]
35+
rightMonitor := results[2]
3536
leftEdge := results[3]
36-
MonitorGet leftMonitor,,&topEdge
37-
dpiValue := getDPI(leftMonitor)
37+
rightEdge := results[4]
38+
MonitorGet leftMonitor,,&leftTopEdge
39+
MonitorGet rightMonitor,,&rightTopEdge
40+
leftDPI := getDPI(leftMonitor)
41+
rightDPI := getDPI(rightMonitor)
3842
; 多显示器支持
3943
global leftEdge
40-
global dpiValue
41-
global topEdge
42-
for i,v in hiddenWindowIds{
43-
WinMove(showMargin+leftEdge,showMargin+topEdge,,,"ahk_id" v)
44+
global rightEdge
45+
global leftTopEdge
46+
global rightTopEdge
47+
global leftDPI
48+
global rightDPI
49+
for i,v in hiddenWindowList{
50+
WinMove(showMargin+leftEdge,showMargin+leftTopEdge,,,"ahk_id" v.id)
4451
}
4552
}
4653

@@ -49,47 +56,46 @@ Reset(*){
4956
SetTimer WatchCursor, 200
5057

5158
WatchCursor(){
52-
; 某些时候会出错
53-
Try
54-
{
55-
DPI.MouseGetPos , , &id, &control
59+
; DPI.MouseGetPos 某些时候会出错
60+
Try{
61+
DPI.MouseGetPos , , &ahkId, &control
5662
; 判断是否为中间态,是则不需要移动
57-
isSuspend := suspendWindowIds.Find((v) => (v =id))
58-
if isSuspend > 0{
63+
suspendWindowIndex := suspendWindowList.Find((v) => (v.id =ahkId))
64+
if suspendWindowIndex > 0{
5965
;拖动窗口去除隐藏
60-
if (isWindowMove(id)=1){
61-
isHidden := hiddenWindowIds.Find((v) => (v =id))
62-
hiddenWindowIds.RemoveAt(isHidden)
63-
suspendWindowIds.RemoveAt(isSuspend)
64-
WinSetAlwaysOnTop(0,"ahk_id" id)
65-
; ToolTip("去除隐藏")
66-
; sleep(1000)
67-
; ToolTip
66+
window := suspendWindowList.Get(suspendWindowIndex)
67+
if (isWindowMove(window)=1){
68+
hiddenWindowIndex := hiddenWindowList.Find((v) => (v.id =ahkId))
69+
hiddenWindowList.RemoveAt(hiddenWindowIndex)
70+
suspendWindowList.RemoveAt(suspendWindowIndex)
71+
WinSetAlwaysOnTop(0,"ahk_id" ahkId)
6872
}
6973
}
7074
else{
7175
; 不为中间态时,则若为其他隐藏窗口则不隐藏,接着判断是否为隐藏的窗口
72-
isHidden := hiddenWindowIds.Find((v) => (v =id))
76+
hiddenWindowIndex := hiddenWindowList.Find((v) => (v.id =ahkId))
7377
; 隐藏窗口则显示
74-
if isHidden>0 {
75-
showWindow(id)
78+
if hiddenWindowIndex>0 {
79+
window := hiddenWindowList.Get(hiddenWindowIndex)
80+
showWindow(window)
7681
}
7782
else{
7883
;按顺序隐藏
79-
if suspendWindowIds.Length > 0{
80-
suspendId := suspendWindowIds.Get(suspendWindowIds.Length)
81-
suspendWindowIds.RemoveAt(suspendWindowIds.Length)
82-
hideWindow(suspendId)
84+
if suspendWindowList.Length > 0{
85+
suspendWindow := suspendWindowList.Get(suspendWindowList.Length)
86+
suspendWindowList.RemoveAt(suspendWindowList.Length)
87+
hideWindow(suspendWindow)
8388
}
8489
}
8590
}
91+
8692
; else{
8793
; ; 不为中间态时,则直接隐藏,接着判断是否为隐藏的窗口
88-
; isHidden := hiddenWindowIds.Find((v) => (v =id))
94+
; isHidden := hiddenWindowList.Find((v) => (v =id))
8995
; ; 切换到其他窗口继续隐藏
90-
; if suspendWindowIds.Length > 0{
91-
; suspendId := suspendWindowIds.Get(1)
92-
; suspendWindowIds.RemoveAt(1)
96+
; if suspendWindowList.Length > 0{
97+
; suspendId := suspendWindowList.Get(1)
98+
; suspendWindowList.RemoveAt(1)
9399
; hideWindow(suspendId)
94100
; }
95101
; ; 隐藏窗口则显示
@@ -105,75 +111,140 @@ WatchCursor(){
105111
^Left::{
106112
results := getSide()
107113
leftMonitor := results[1]
114+
rightMonitor := results[2]
108115
leftEdge := results[3]
109-
MonitorGet leftMonitor,,&topEdge
110-
dpiValue := getDPI(leftMonitor)
116+
rightEdge := results[4]
117+
MonitorGet leftMonitor,,&leftTopEdge
118+
MonitorGet rightMonitor,,&rightTopEdge
119+
leftDPI := getDPI(leftMonitor)
120+
rightDPI := getDPI(rightMonitor)
111121
; 多显示器支持
112122
global leftEdge
113-
global dpiValue
114-
global topEdge
123+
global rightEdge
124+
global leftTopEdge
125+
global rightTopEdge
126+
global leftDPI
127+
global rightDPI
115128

116-
id := WinGetID("A")
117-
hideWindow(id)
129+
ahkId := WinGetID("A")
130+
hiddenWindowIndex := hiddenWindowList.Find((v) => (v.id =ahkId))
131+
suspendWindowIndex := suspendWindowList.Find((v) => (v.id =ahkId))
132+
if hiddenWindowIndex >0 {
133+
hiddenWindowList.RemoveAt(hiddenWindowIndex)
134+
}
135+
if suspendWindowIndex > 0{
136+
suspendWindowList.RemoveAt(suspendWindowIndex)
137+
}
138+
hideWindow({id:ahkId,mode:"left"})
118139
}
119-
F4::{
120-
; getWinPos
140+
141+
^Right::{
142+
results := getSide()
143+
leftMonitor := results[1]
144+
rightMonitor := results[2]
145+
leftEdge := results[3]
146+
rightEdge := results[4]
147+
MonitorGet leftMonitor,,&leftTopEdge
148+
MonitorGet rightMonitor,,&rightTopEdge
149+
leftDPI := getDPI(leftMonitor)
150+
rightDPI := getDPI(rightMonitor)
121151
; 多显示器支持
122-
123-
id := WinGetID("A")
124-
window := "ahk_id" id
152+
global leftEdge
153+
global rightEdge
154+
global leftTopEdge
155+
global rightTopEdge
156+
global leftDPI
157+
global rightDPI
125158

126-
; Get window position and size
127-
DPI.WinGetPos(&X, &Y, &W, &H, window)
128-
MsgBox "Window Position: " X ", " Y "`nWindow Size: " W " x " H
159+
ahkId := WinGetID("A")
160+
;判断当前窗口是否已经隐藏,若已存在则删除
161+
hiddenWindowIndex := hiddenWindowList.Find((v) => (v.id =ahkId))
162+
suspendWindowIndex := suspendWindowList.Find((v) => (v.id =ahkId))
163+
if hiddenWindowIndex >0 {
164+
hiddenWindowList.RemoveAt(hiddenWindowIndex)
165+
}
166+
if suspendWindowIndex > 0{
167+
suspendWindowList.RemoveAt(suspendWindowIndex)
168+
}
169+
hideWindow({id:ahkId,mode:"right"})
170+
129171
}
130172

131-
F8::{
132-
getSide()
173+
^F4::{
174+
hiddenCount := hiddenWindowList.Length
175+
Loop hiddenCount {
176+
hiddenWindowList.RemoveAt(hiddenWindowList.Length)
177+
}
133178
}
134179

135180

136-
hideWindow(id){
181+
hideWindow(window){
137182

138-
window := "ahk_id" id
183+
windowText := "ahk_id" window.id
184+
139185
;最大化窗口不可隐藏
140-
if WinExist(window) and WinGetMinMax(window) != 1{
141-
DPI.WinGetPos(&X, &Y, &W, &H,window)
186+
if WinExist(windowText) and WinGetMinMax(windowText) != 1{
187+
DPI.WinGetPos(&X, &Y, &W, &H,windowText)
142188
; 乘以dpi 使用DPI缩放
143-
NewX := -Round(W*dpiValue)+leftEdge+margin
144-
; WinMove(NewX, Y,,,window)
145-
Y :=Max(Y,topEdge)
189+
mode := window.mode
190+
if mode="left"{
191+
NewX := -Round(W*leftDPI)+leftEdge+Round(margin*leftDPI)
192+
Y :=Max(Y,leftTopEdge)
193+
}
194+
else if mode="right"{
195+
NewX := rightEdge-Round(margin*rightDPI)
196+
Y :=Max(Y,rightTopEdge)
197+
}
198+
146199
if H>maxHeight{
147-
WinMove(,Y,,H,window)
200+
WinMove(,Y,,H,windowText)
148201
}
149-
winSmoothMove(newX,Y,window)
150-
WinSetAlwaysOnTop(1, window)
151-
pushTo(hiddenWindowIds,id)
202+
winSmoothMove(newX,Y,windowText)
203+
WinSetAlwaysOnTop(1, windowText)
204+
pushTo(hiddenWindowList,window)
152205
}
153206
}
154207

155-
showWindow(id){
156-
window := "ahk_id" id
157-
DPI.WinGetPos(&X, &Y, &W, &H,window)
158-
NewX := showMargin+leftEdge
208+
showWindow(window){
209+
windowText := "ahk_id" window.id
210+
mode := window.mode
211+
DPI.WinGetPos(&X, &Y, &W, &H,windowText)
212+
if mode="left"{
213+
NewX := showMargin+leftEdge
214+
}
215+
else if mode="right"{
216+
NewX := rightEdge-Round(showMargin*rightDPI)-Round(W*rightDPI)
217+
}
159218
; WinMove(NewX, Y,,,window)
160-
winSmoothMove(newX,Y,window)
161-
pushTo(suspendWindowIds,id)
219+
winSmoothMove(newX,Y,windowText)
220+
pushTo(suspendWindowList,window)
162221
}
163-
isWindowMove(id){
164-
window := "ahk_id" id
165-
DPI.WinGetPos(&X, &Y, &W, &H,window)
222+
isWindowMove(window){
223+
windowText := "ahk_id" window.id
224+
mode := window.mode
225+
DPI.WinGetPos(&X, &Y, &W, &H,windowText)
166226
; 当窗口横坐标大于margin一定程度,认为移动
167-
if (X>showMargin+moveDistance){
168-
return 1
227+
if mode = "left"{
228+
if (X>Round(showMargin*leftDPI)+leftEdge+moveDistance){
229+
return 1
230+
}
231+
else{
232+
return 0
233+
}
169234
}
170-
else{
171-
return 0
235+
else if mode="right"{
236+
if (X<rightEdge-moveDistance-Round(showMargin*rightDPI) - Round(W*rightDPI)){
237+
return 1
238+
}
239+
else{
240+
return 0
241+
}
172242
}
243+
173244
}
174-
; 列表不允许存在相同的值
245+
; 列表不允许存在相同的窗口
175246
pushTo(array,value){
176-
if array.Find((v) => (v =value)) <= 0{
247+
if array.Find((v) => (v.id =value.id)) <= 0{
177248
array.push(value)
178249
}
179250
}
@@ -191,11 +262,11 @@ createArray(a, b,length) {
191262
return arr
192263
}
193264
; 平滑移动
194-
winSmoothMove(newX,newY,window){
195-
DPI.WinGetPos(&X,, ,, window)
265+
winSmoothMove(newX,newY,windowText){
266+
DPI.WinGetPos(&X,, ,, windowText)
196267
arr := createArray(X,NewX,10)
197268
for i,v in arr{
198-
WinMove(v,newY,,,window)
269+
WinMove(v,newY,,,windowText)
199270
}
200271
}
201272

@@ -218,15 +289,14 @@ getSide(){
218289
rightMonitor:=i
219290
}
220291
i+=1
221-
; MsgBox(i "," leftEdgeTemp "," rightEdgeTemp)
222292
}
223293
return [leftMonitor,rightMonitor,leftEdge,rightEdge]
224294
}
225295

226296
getDPI(monitorIndex){
227297
monitorHandles := DPI.GetMonitorHandles()
228298
dpiValue := DPI.GetForMonitor(monitorHandles.Get(monitorIndex))
229-
dpiValue := dpiValue / 120 * 125 / 100
299+
dpiValue := dpiValue / 96
230300
return dpiValue
231301
}
232302

0 commit comments

Comments
 (0)