用AutoHotkey輕鬆製作螢幕小鍵盤

處於中文輸入法狀態時按〔Ctrl+逗點〕會在螢幕右下角顯示常用符號的小鍵盤,透過這個小鍵盤我們能簡單的輸入符號,若覺得這個小鍵盤提供的符號太少,也可以到PCMan網站下載標點符號輸入程式,尤其標點符號輸入程式彙集許多分門別類的符號,是相當方便的小工具,然而卻無法自訂符號,為了測試與練習AutoHotkey的功能,我利用AutoHotkey的SmartGUI.exe拉了一個Form,加上處理的指令後再用Ahk2Exe.exe產生成執行檔。如果你有在使用AutoHotkey,則本文可視為學習文章,若只想使用則直接下載執行檔即可。

製作操作視窗

1. 首先啟動AutoHotkey安裝資料夾裡的SmartGUI.exe,再於視窗面板上按右鍵選擇「Add Button」以加入一個按鈕。

2. 移動游標將按鈕放好位置後必須再按第二次以決定按鈕大小,此處按鈕是3x3大小。

3. 把滑鼠移到按鈕區域裡,按右鍵可針對此元件做操作,如複製、移動位置、刪除等,在此我們選用【Change Label】以改變按鈕的標題,第一個按鈕的標題是全形逗點。

4. 製造好第一個按鈕後用右鍵功能表裡的【Duplicate Control】複製別的按鈕,重覆此步驟直到你需要的按鈕與符號都放置完畢。

5. 在面板上放置按鈕如下。最後在面板的空白處用【右鍵功能表→Save GUI】,再指定資料夾與檔名my_symbols.ahk後即能儲存起來,後續再編輯此檔案以加入其餘指令。

產生後的my_symbols.ahk內容如下:

; Generated using ~SmartGUI Creator 3.5

Gui, Add, Button, x6 y43 w30 h30,, 
Gui, Add, Button, x36 y43 w30 h30,。
Gui, Add, Button, x66 y43 w30 h30,、
Gui, Add, Button, x96 y43 w30 h30,;
Gui, Add, Button, x126 y43 w30 h30,:
Gui, Add, Button, x6 y73 w30 h30,○
Gui, Add, Button, x36 y73 w30 h30,◎
Gui, Add, Button, x66 y73 w30 h30,㊣
Gui, Add, Button, x96 y73 w30 h30,⊙
Gui, Add, Button, x126 y73 w30 h30,ˇ
Gui, Add, Button, x6 y103 w30 h30,☆
Gui, Add, Button, x36 y103 w30 h30,★
Gui, Add, Button, x66 y103 w30 h30,●
Gui, Add, Button, x96 y103 w30 h30,※
Gui, Add, Button, x126 y103 w30 h30, ■
Gui, Show, x390 y148 h184 w219, Generated using SmartGUI Creator 3.5
Return

GuiClose:
ExitApp

指令說明與編修

我們以其中一行指令 Gui, Add, Button, x36 y103 w30 h30,★ 來做說明。AutoHotkey的視窗控制元件是以 Gui, Add 命令加入,第三個參數Button則指定要加入的是按鈕元件,後面再接此元件的X座標、Y座標、寬度與高度,最後一個★則是標題,當我們點擊此按鈕時,其觸發的處理程式名稱為 Button★,以此類推㊣按鍵的處理程式名稱是 Button㊣。我們用以下語法就能加入按鈕的處理程式:

Button★:
Clipboard = ★   ; 把★存入剪貼簿
Send ^v   ; 送出〔Ctrl+V〕按鍵,把剪貼簿內容貼上
return

這裡有個視窗焦點的問題要先解決。當my_symbols.ahk執行後,取得焦點的作用中視窗變成是my_symbols.ahk自己,而要貼上★符號的則是另一個程式(記事本或Word等,在此假我們使用的是記事本),因此我們必須讓焦點切換到記事本好讓★符號貼上,為了讓my_symbols.ahk能切換回記事本,則啟動時必須先取得記事本的處理ID(Process ID):

  WinGet, k_ID, ID, A   ; 取得作用中視窗的Process ID,存入k_ID變數

再於Button★裡用WinActivate命令把焦點切換回k_ID代表的視窗(即記事本):

Button★:
  WinActivate, ahk_id %k_ID%   ; 切換焦點回k_ID代表的視窗
  Clipboard = ★   ; 把★存入剪貼簿
  Send ^v   ; 送出〔Ctrl+V〕按鍵,把剪貼簿內容貼上
  return

另外,我們可以用下列指令讓my_symbols.ahk視窗一直停駐在螢幕最上方:

  Gui +AlwaysOnTop

my_symbols.ahk視窗的顯示指令如下,將視窗顯示在座標(600, 400)位置處:

  Gui, Show, x600 y400 h234 w369, 螢幕中文符號

產生執行檔的方法

如果你有安裝AutoHotkey系統的話,雙擊my_symbols.ahk就能執行並檢視執行結果。接著進入DOS視窗並切換到AutoHotkey安裝資料夾/Compiler資料夾,把my_symbols.ahk複製到此資料夾,並使用Ahk2Exe.exe將my_symbols.ahk轉換成my_symbols.exe,執行my_symbols.exe就不需要安裝AutoHotkey系統能拷貝給朋友了:

Ahk2exe.exe /in "my_symbols.ahk" /icon "任何一個Icon檔.ico"

檔案下載

  • 螢幕中文符號執行檔(不需安裝AutoHotkey系統)
    1. 執行後在System Tray出現【簡】圖示
    2. 在要插入符號的程式裡按〔Win+S〕則顯示螢幕中文符號視窗
    3. 已知問題:切換到別的程式要使用時,必須再啟動螢幕中文符號視窗一次

      2011/12/18補充:
      QQQ網友提示可以用熱鍵取得先前視窗的ID並存入k_ID,讓小鍵盤能輸出到新的k_ID,請檢視文章最後面QQQ網友的寫法建議。我稍微修改了sym.ahk與symbols.ahk,請更新測試。

  • 編修過的AutoHotkey腳本檔壓縮檔
    1. 主腳本:〔Win+S〕設定在此,要更換按鍵須修改此檔
    2. 符號Gui腳本:大部份內容皆由SmartGUI.exe產生
    3. 公用函數腳本:送出符號與括號的函數腳本

##

您可能也會有興趣的類似文章

簡睿

服務於軟體業的資訊老兵。興趣廣泛,學習力佳,樂於分享所知所學。

您可能也會喜歡…

16 個回應

  1. 潘文良表示:

    簡睿‥
      你好!
      本人只因一個興趣、一個理想,而走上編輯台語字詞典之路。
      每覺輸入台語注音符號,或者有調符羅馬字拼音符號,乃至國際音標,甚感不便,而希望能有類似「螢幕小鍵盤」之輸入工具,但因對寫程式,一竅不通,心有餘而力不足。
      因在網上搜尋,有緣見此《用AutoHotkey輕鬆製作螢幕小鍵盤》——
    看來這工具,當可滿足個人之需求。
      在網上搜尋“AutoHotkey”,料夾裡的也無所謂“SmartGUI.exe”。
      不知是否能將該程式寄送?好能達成心願!
      祝‥
    平安喜樂!
                      阿文
                        2016.02.22.一 0 02:43:27

    ◎輸入吳守禮台語注音——希望能自製螢幕小鍵盤
     http://mypaper.pchome.com.tw/avun01/post/1340601909

    潘文良〈阿文〉
    a_vun@yahoo.com.tw

  2. jony.tw表示:

    感謝板主分享

    隨著時間推進現在(20120830)有Unicode的版本 AutoHotkey_L v1.1.07.03

    剛開始用AHK沒多久…參考版主的2008版本做為練習
    思考測試後_找到解決方案

    ;全域版
    Gui, Add, Button, x0 y0 w30 h30 , ,
    Gui, Add, Button, xp+30 yp w30 h30 , 。
    Gui, Add, Button, xp+30 yp w30 h30 , ;
    Gui, Add, Button, xp+30 yp w30 h30 , ①
    Gui, Add, Button, xp+30 yp w30 h30 , ②
    Gui, Add, Button, xp+30 yp w30 h30 , ③
    Gui, Add, Button, xp+30 yp w30 h30 , ④
    Gui, Add, Button, xp+30 yp w30 h30 , ⑤
    Gui +AlwaysOnTop -MaximizeBox -Resize +ToolWindow
    Gui, Show, w240 h30, MyButtons
    return

    Button,:
    m打字(“,”)
    return

    Button。:
    m打字(“。”)
    return

    Button;:
    m打字(“;”)
    return

    Button①:
    m打字(“①”)
    return

    Button②:
    m打字(“②”)
    return

    Button③:
    m打字(“③”)
    return

    Button④:
    m打字(“④”)
    return

    Button⑤:
    m打字(“⑤”)
    return

    GuiClose:
    ExitApp

    m打字(MyText)
    {
    Gui Hide
    sleep 5
    sendinput %MyText%
    Gui, Show
    }

    ;不需要用Clipboard了..清掉原copy或備份ClipboardAll很累!Sendinput可以直接送出Unicode文字
    ;不需要找正在編輯文字的窗口代碼_把gui窗hide掉再送字就好。
    ;函數名 變數名 第二字起可以用中文命名

  3. QQQ表示:

    ;大大可以的話,把我的建議加在你文章…
    ;看了樓上某位大大的抓取輸出視窗的代碼,想到熱鍵可單用ALT鍵即可~

    ALT:: ;按ALT,取得等下要輸出的視窗,如記事本(這裡用熱鍵比較奇怪)
    WinGet, k_ID, ID, A ; 取得作用中視窗的Process ID,存入k_ID變數
    traytip,,按ALT,取得等下要輸出的視窗 `n 你選擇的視窗代碼是 %k_ID% ;工作匣提示
    tooltip,你選擇的視窗代碼是 %k_ID%,如何用滑鼠選視窗,我不會! ;滑鼠提示
    return

    ;不過某樓大大講的好,這裡用滑鼠比較好,我想沒人在用沒有中鍵的滑鼠!!!

    mButton:: ;中鍵,記錄等下要輸出的視窗
    WinGet, k_ID, ID, A ; 取得作用中視窗的Process ID,存入k_ID變數
    traytip,,按ALT,取得等下要輸出的視窗 `n 你選擇的視窗代碼是 %k_ID% ;工作匣提示
    tooltip,你選擇的視窗代碼是 %k_ID%,如何用滑鼠選視窗,我不會! ;滑鼠提示
    return

  4. Easter表示:

    請問大哥
    我要如何辨別這個剪貼簿視窗的ID
    就像這裡的筆記本視窗叫K_ID
    需要自己取抓取,定義嗎?
    謝謝您

  5. 簡睿表示:

    @Marcosa:

    這兩天忙著幫網站搬家,回覆遲了,敬請見諒。

    小鍵盤有個嚴重問題,當點小鍵盤上的按鈕時,作用中的視窗(Active window)會變成是小鍵盤,而不是剛剛使用的應用程式,我先前的作法是在啟用小鍵盤時把當時的視窗代碼(第1個程式)存入k_ID,小鍵盤的輸出就會跑到k_ID所代表的視窗上。

    當小鍵盤已出現後,再開啟另一個應用程式(第2個程式),因k_ID仍是第1個程式,小鍵盤的輸出只會跑到第1個程式裡。

    我還沒找到解決方法,目前只能在開啟第2個程式後再啟用小鍵盤一次,以變更k_ID為第2個程式,好讓按鈕輸出到第2個程式。

    • Marcosa表示:

      簡睿大哥

      千萬別這樣說,由於您的文章已經讓我多學了很多,我很感謝你,我的目的是要減少公司同事們的工作量,所以我勢在必行。
      我在這個連結 http://ahk.5d6d.com/thread-2995-1-1.html 看到有人回覆說資源管理器地址檔似乎可以達到我的需求,您可否與我ㄧ起研究呢?讓這個小鍵盤的功能發揮到極致吧,或是說~用其它軟體也能達到相同功用的話,我也是會去嘗試的。

  6. Marcosa表示:

    Hi 簡睿,

    感謝你提供腳本給大家參考,我最近必須要寫一個螢幕小鍵盤來解決我的困擾,剛好瀏覽到你的網站便來此拜訪,經過三小時的努力我不得不放棄,因為我下載你給的腳本在用Ahk2exe.exe匯出成.exe檔後開啟,結果會出現一些錯誤訊息,我想還是需要麻煩你幫我在檢查一次,我能將我所遇到的問題透過MSN或E-mail轉寄給你嗎?
    願你寫程式的功力越來越好~Thanks ! ! !

    • 簡睿表示:

      會是Autohotkey版本的問題嗎?我由本頁下載sym.ahk,symbols.ahk.functions.exe,再用ahk2exe /in sym.ahk 能正常產生sym.exe,也能執行。

      我的Autohotkey版本是1.0.48.03

      • Marcosa表示:

        已確認問題是Autohotkey版本。
        再請教您幾個問題:
        1.假設輸入三次1,在畫面上如何才能看到111 ?
        2.目前這個Scrip好像會把輸出資料丟到原畫面,假設我在A資料夾開啟螢幕小鍵盤,我在B資料夾開啟純文字檔按任一輸出件資料會丟回A資料夾,不會在B資料夾的純文字檔中顯示,我改怎麼寫才能達到後者所敘述的功能?
        PS:我在程式語言這方面沒有任何經驗,懇請詳述~感謝。

        • 簡睿表示:

          Sorry, 還是不懂你的需求。因為你輸出的是英文與數字而不是中文,因此直接用Send輸出就可以了,不必透過剪貼簿。例如以下用Send 1就能輸出1:

          Button1:
          WinActivate, ahk_id %k_ID% ; 切換焦點回k_ID代表的視窗
          ;;Clipboard = 1 ; 把★存入剪貼簿
          ;;Send ^v ; 送出〔Ctrl+V〕按鍵,把剪貼簿內容貼上
          send 1
          Return

          • Marcosa表示:

            簡睿大哥

            我的腳本必須先按鍵盤A才能鎖住輸出視窗,我希望輸出是用滑鼠游標指定而不用按鍵盤A,就是當我將滑鼠點網頁欄再按SIRB能在網頁欄輸出SIRB,當我在純文字檔中按QURE就會輸出QURE,請教您我該怎麼改呢?
            Gui +AlwaysOnTop
            WinGet, k_ID, ID, A
            Gui, Font, S16 CDefault, Tahoma
            Gui, Add, Button, x2 y4 w70 h30,SIRB
            Gui, Add, Button, x72 y4 w90 h30,QURE

            Gui, Show, x390 y148 h130 w265, 螢幕小鍵盤
            Return

            A::
            WinGet, k_ID, ID, A
            return

            ButtonSIRB:
            WinActivate, ahk_id %k_ID%
            ;;Clipboard = SIRB
            ;;send ^v
            send SIRB
            Return

            ButtonQURE:
            WinActivate, ahk_id %k_ID%
            ;;Clipboard = QURE
            ;;Send ^v
            send QURE
            Return

            GuiClose:
            ExitApp

  7. yehmy表示:

    請問版主,我想學做螢幕小鍵盤,英數符號應該沒問題,可是如何輸入中文?

  8. yehmy表示:

    謝謝教學!
    到PCMan網站下載標點符號輸入程式,現在”可以”自訂符號了.

    • 簡睿:表示:

      哎喲,原來是我沒有仔細看它的說明。

      只要修改symbols.txt就能自訂要使用的符號了。謝謝您的提示。

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *