-
Notifications
You must be signed in to change notification settings - Fork 0
/
ime-status-bar.ahk
111 lines (93 loc) · 3.54 KB
/
ime-status-bar.ahk
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
#Requires AutoHotkey v2
#SingleInstance Force
#Warn
Persistent
InstallKeybdHook
InstallMouseHook
#Include "%A_ScriptDir%\lib\IME.ahk"
if (!A_IsCompiled) {
TraySeticon(A_ScriptDir . "\ime-status-bar.ico")
}
IME_STATUS_GUI_BAR_WIDTH := 10
ACTIVE_ID := ""
SCREEN_DPI_RATE := A_ScreenDPI / 96 ; 4K 125% = 1.25
GUI_OPT := "+Owner -Caption +AlwaysOnTop -Border"
ImeStatusBarGui := Gui(GUI_OPT)
ImeStatusBarGui.MarginX := 0
ImeStatusBarGui.MarginY := 0
SetTimer(TimerHandler, 100)
TimerHandler() {
try {
UpdateImeStatusBar()
} catch TargetError {
; ignore Error
} catch OSError {
; ignore Error
} catch Error as err {
MsgBox err.Message
}
}
UpdateImeStatusBar() {
hwnd := WinExist("A")
if (!hwnd || hwnd == ImeStatusBarGui.Hwnd || IME_GetSentenceMode() == 0) {
ImeStatusBarGui.Hide()
return
}
activeTitle := WinGetTitle("ahk_id " hwnd)
; if (activeTitle == "" || activeTitle ~= "ファイルの削除" || activeTitle ~= "BSB Pomodoro Timer") {
; ImeStatusBarGui.Hide()
; return
; }
activeClass := WinGetClass("ahk_id " hwnd)
if (activeClass ~= "MultitaskingViewFrame|Shell_TrayWnd|NotifyIconOverflowWindow|Windows.UI.Core.CoreWindow|UnityWndClass|Progman") { ; check process with regex
ImeStatusBarGui.Hide()
return
}
activeProcessName := WinGetProcessName("ahk_id " hwnd)
; if (activeProcessName ~= "PotPlayerMini64.exe|PotPlayer64.exe|ShareX.exe|StarCraft.exe") { ; check process with regex
; ImeStatusBarGui.Hide()
; return
; }
WinGetPos(&imeX, &imeY, &imeWidth, &imeHeight, "ahk_id " hwnd) ; x, y, width, height 가 중복되기때문에 변수명을 변경
if (imeWidth >= A_ScreenWidth) { ; 크롬 전체화면시 비표시(유튜브용)
ImeStatusBarGui.Hide()
return
}
activeId := WinGetPID("ahk_id " hwnd)
imeGet := IME_Get("ahk_id " hwnd)
imeGetConv := IME_GetConvMode("ahk_id " hwnd)
activeId := activeId . "_" . imeGet . "_" . imeGetConv . "_" . imeX . "_" . imeY . "_" . imeWidth . "_" . imeHeight
if (ACTIVE_ID != activeId || (A_TimeIdlePhysical < 5000 && !WinExist("ahk_id " ImeStatusBarGui.Hwnd))) {
ShowImeStatusBar(imeGet, imeGetConv, imeX, imeY, imeWidth, imeHeight, activeTitle, activeClass, activeProcessName)
global ACTIVE_ID := activeId
} else if (A_TimeIdlePhysical > 5000) {
ImeStatusBarGui.Hide()
}
}
ShowImeStatusBar(imeGet, imeGetConv, x, y, width, height, activeTitle := "", activeClass := "", activeProcessName := "") {
if (x == "" || y == "" || width == "" || height == "") {
return
}
if (x > 0) {
x := x - IME_STATUS_GUI_BAR_WIDTH - 4
}
height := Floor(height / SCREEN_DPI_RATE) ; SCREEN_DPI_RATE 100% = 1.0
; 표시 위치 조정
if (!(activeProcessName ~= "AutoHotkey.exe|KakaoTalk.exe|SourceTree.exe|slack.exe|Ditto.exe|EXCEL.EXE|WINWORD.EXE|Code.exe|LINE.exe")) {
x := x + Floor(10 / SCREEN_DPI_RATE)
height := height - Floor(8 / SCREEN_DPI_RATE)
}
if (imeGet = 1 && (imeGetConv = 0 || imeGetConv = 1)) { ; Korean
ImeStatusBarGui.BackColor := "46c9e2" ; blue
} else if (imeGet = 1 && (imeGetConv = 25 || imeGetConv = 9)) { ; Japanese
ImeStatusBarGui.BackColor := "f10f2c" ; red
} else if (imeGetConv = 0) { ; English on Korean
ImeStatusBarGui.BackColor := "facf2c" ; yellow
} else { ; English on Japanese
ImeStatusBarGui.BackColor := "00a32c" ; green
}
ImeStatusBarGui.Opt("+AlwaysOnTop")
ImeStatusBarGui.Show("x" x " y" y " w" IME_STATUS_GUI_BAR_WIDTH " h" height " NoActivate")
WinSetExStyle(+0x20, ImeStatusBarGui) ; not clickable (toggle)
WinSetTransparent(100, ImeStatusBarGui)
}