---
disqus: jexus-md
title: 自動切換輸入法程式
---
<center>自動切換輸入法程式<div style="font-size:0.5em">*Modify Input Type Automatically*</div></center>
===
> [time=Mon, Jul 31, 2017 5:48 PM]
> [TOC]
其實可以直接看我[github頁面](https://github.com/voidism/Modify-Input-Type-Automatically) ~~只是我覺得這裡排版比較好看~~
## 程式效果
- 使用英文輸入法鍵入兩個中文字之按鍵組合時,會自動切換成中文輸入法,並幫你刪錯字再重新輸入原本想打的字
- 英文效果亦同,但為避免誤換輸入法,只有在輸入字庫中的單字時,才會轉換成英文輸入法,字庫會自動新增單字 (詳見 [關於字庫](https://hackmd.io/s/Sy4AZViU-#關於字庫) )
- 應該有比[微軟內建自動切換](https://answers.microsoft.com/zh-hant/windows/forum/windows_10-ime/windows-10/cda818ad-1081-4165-89cd-6d43349c4b9a)好用87倍
<!--
(內建是只要輸入沒有對應合法中文就直接跳成英文QQ)
-->
![GIF](http://i.imgur.com/s8SDrcZ.gif)
## 環境需求(Windows)
- 有[Python2.7](https://www.python.org/downloads/)
- [PyHook](http://www.lfd.uci.edu/~gohlke/pythonlibs/#pyhook)
(下載 pyHook‑1.5.1‑cp27‑cp27m‑win32.whl
*#如果你python裝的是64bit,可以載amd64的*
然後在檔案目錄`pip install pyHook‑1.5.1‑cp27‑cp27m‑win32.whl`)
- [pythoncom (附在pypiwin32裡面)](https://pypi.python.org/pypi/pypiwin32/219)
(下載 pypiwin32-219-cp27-none-win32.whl
*#如果你python裝的是64bit,可以載amd64的*
然後在檔案目錄`pip install pypiwin32-219-cp27-none-win32.whl`)
- [PyUserInput](https://pypi.python.org/pypi/PyUserInput/)
(下載 PyUserInput-0.1.11-py2-none-any.whl ,然後`pip install PyUserInput-0.1.11-py2-none-any.whl`)
- PyAutoGUI
(有內建,直接`pip install pyautogui`就好)
<!--
- requests
(有內建,直接`pip install requests`就好)
-->
※ 以上建議在[虛擬環境](https://hackmd.io/s/HycT9L68W)中裝設,會比較乾淨
## 前置作業
由於微軟新注音輸入法不是什麼開源的軟體,一般情況下程式沒有方法可以取得當前的輸入法,所以要用PyAutoGUI來偷吃步:
1. 找到工具列右下角顯示中英文輸入法的地方
2. 找到一個像素位置,當中文輸入時是白色,英文輸入時是黑色(白色的RGB值須分別皆大於200)
p.s. 我是選英字撇捺中間的地方
<center class="half">
<img src="https://i.imgur.com/S4X7hl3.png">
<img src="https://i.imgur.com/Sj8buTE.png">
</center>
3. 用[Hook.py]()來查看該像素格的座標位置
(Hook.py需在環境建置好之後才能用)
Hook.py會不斷更新顯示滑鼠游標的座標位置及RGB值:
```python
---
Position: (1361, 1002) #-->座標位置
RGB: (250, 250, 250) #-->RGB值
---
```
4. 將[ModifyInputType.py](https://github.com/voidism/Modify-Input-Type-Automatically/blob/master/ModifyInputType.py)程式碼126行的`pixel=(1683, 1063)`改成你自己取得的pixel位置
5. If it's stupid but it works, it isn't stupid.
:::danger
若使用電腦途中有調整螢幕解析度,除了上述pixel值要重新取得之外,需要登出一次,應用程式才會調整成新的解析度。如果是調小解析度還好,可能不會影響到。但如果調大解析度而未登出一次,會使應用程式抓不到超出原本小解析度範圍的pixel值。
:::
## 啟動
需要把 [字庫](https://github.com/voidism/Modify-Input-Type-Automatically/blob/master/EnWordBase.json) 跟其它程式放到同一資料夾,才能運作
然後就直接執行 `ModifyInputType.py`
如果有使用virtualenv,可以寫一個bat檔,像這樣:
```dockerfile=
@echo off
cmd /k "cd /d C:\path\to\your\virtualenv_location\Scripts & activate & cd /d C:\path\to\to\your\file & python ModifyInputType.py"
```
之後就不用先開虛擬環境再執行囉,可以直接執行或是設定排程。
## 結束
直接關閉視窗
或是輸入`enter, z, x, c, v` 跳出程序回到cmd
## 關於字庫
- 取用自Linux的內建字庫,原有45000餘字,刪去"so", "up", "go"...等會與中文輸入混淆的字( so: "ㄋㄟ", up: "ㄧㄣ", go: "ㄕㄟ"...)
:::success
2017.08.17更新
- 目前程式已更新為可以吃go,so等字,但需在go,so後面打一個空白才能辨別。
- 請下載最新版程式碼[ModifyInputType.py](https://github.com/voidism/Modify-Input-Type-Automatically/blob/master/ModifyInputType.py),並將字庫透過[Dictionary_Add&Del.py](https://github.com/voidism/Modify-Input-Type-Automatically/blob/master/Dictionary_Add%26Del.py)自行增加"go+空白","so+空白"等新字。(或是直接載新版字庫[EnWordBase.json](https://github.com/voidism/Modify-Input-Type-Automatically/blob/master/EnWordBase.json)也可)
- 自行增加"- "入字庫可讓你使用HackMD更方便(在輸入Generic List的時候),但必須確定你平常打字沒有使用一聲"ㄦ"的習慣。
- up: “ㄧㄣ” -> 因為中文打一聲ㄧㄣ也會用到空白,會衝突沒辦法加,如果我哪一天學會ML幫我判斷上下文再加這功能好了QAQ
:::
- 當使用者使用中文輸入法打進一串英文字,但因英文字並不在字庫裡,所以沒有自動切換輸入法時,使用者通常會手動按shift切輸入法,這時剛剛所打的那串英文字會自動新增到字庫裡。因此使用者可藉此新增單字 (單字長度需大於3個字元)
- 另外可藉由[Dictionary_Add&Del.py](https://github.com/voidism/Modify-Input-Type-Automatically/blob/master/Dictionary_Add%26Del.py)的GUI介面來找查或新增刪除字庫內的字
![](http://i.imgur.com/mxGEGIZ.gif)
## 建立捷徑、快捷鍵或釘選到工具列
1. 寫成一個bat檔可以直接執行程式
2. 在bat檔按右鍵建立捷徑,捷徑按右鍵可設定全域快捷鍵,像我是設Ctrl+Alt+" . "(還可以順便改個icon,~~雖然都很難看就是~~)
3. 把捷徑放到`C:\ProgramData\Microsoft\Windows\Start Menu\Program`他就會出現在工具列裡了
4. ~~有沒有比較像一般程式der感覺,讚讚!~~
## Warning
- 若同時使用cmd跑一些運算量較大的程式,與此程式有互相干擾之可能 (較常出現: 執行續順序錯誤導致自動打出來的字有鬼鍵出現)
##
<p><div style="font-size:0.8em">查看我的其他筆記 — — <a href="https://hackmd.io/s/S1IUbxcUW">回到 Jexus.md 首頁</a></div></p>