stylesheet

2020-09-23

AutoHotKeyで変換/無変換キーを有効利用

中古で安く手に入れたThinkpadの一体型パコパコパッドが、アレなもんで...。余ってる変換/無変換キーを活用するAutoHotKeyスクリプトを書いてみた。
このスクリプトを起動しておくと、変換/無変換キー/かなキーでそれぞれ右/左/中クリックを行うことができる。
また、同じキーで日本語入力のON/OFFを行うモードもつけているので、そちらの気がある方も便利に使えるのではと思う。

だだし、このスクリプトはUSキーマップ環境で日本語キーボードを使っている変態さん向けのプログラムだ。
完全な日本語環境では、いろいろとキーバインドが衝突して、動作に支障をきたす可能性があるので注意されたし。

ソースコードはシングルファイル jpkb.ahk

本来は動作モードに応じてトレイアイコンを変更する機能があるのだが、アイコンファイルなしでも動作するように該当部分はコメントアウトしておいた。 完全版はGitHubで公開している。 実行はAutoHotKeyへ読み込ませるだけだ。

AutoHotKeyのインストールさえも面倒な場合は、こちらに実行ファイル化(EXE)したものを用意しているので利用して欲しい。

ちなみにオープンソースで、WTFPLライセンスでの公開だ。
ふざけたライセンスだが、ふざけて作ったのでしょうがない。


/*
            DO WHAT THE FUCK YOU WANT TO PUBLIC LICENSE
                    Version 2, December 2004
  
 Copyright (C) 2020 Nihon Yamori (https://yamori-jp.blogspot.com)
 
 Everyone is permitted to copy and distribute verbatim or modified
 copies of this license document, and changing it is allowed as long
 as the name is changed.
  
            DO WHAT THE FUCK YOU WANT TO PUBLIC LICENSE
   TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
  
  0. You just DO WHAT THE FUCK YOU WANT TO.
*/

; @IME.ank
ime_set(SetSts, WinTitle="A") {
	ControlGet,hwnd,HWND,,,%WinTitle%
	if	(WinActive(WinTitle))	{
		ptrSize := !A_PtrSize ? 4 : A_PtrSize
	    VarSetCapacity(stGTI, cbSize:=4+4+(PtrSize*6)+16, 0)
	    NumPut(cbSize, stGTI,  0, "UInt")   ;	DWORD   cbSize;
		hwnd := DllCall("GetGUIThreadInfo", Uint,0, Uint,&stGTI)
	             ? NumGet(stGTI,8+PtrSize,"UInt") : hwnd
	}

    return DllCall("SendMessage"
            , UInt, DllCall("imm32\ImmGetDefaultIMEWnd", Uint,hwnd)
            , UInt, 0x0283  ;Message : WM_IME_CONTROL
            ,  Int, 0x006   ;wParam  : IMC_SETOPENSTATUS
            ,  Int, SetSts) ;lParam  : 0 or 1
}

set_mode(mode) {
    _mode := mode
    update()
}

update() {
    IniWrite, %_mode%, %_ini_name%, settings, mode
    ; ico := "icon/" . _mode . ".ico"
    ; Menu, TRAY, Icon, %ico%
    Menu, TRAY, UnCheck, %MODE_CLICK%
    Menu, TRAY, UnCheck, %MODE_IME%
    Menu, TRAY, UnCheck, %MODE_BYPASS%
    Menu, TRAY, Check, %_mode%
}

mouse_click_alt(button, alt, down_or_up) {
    b := GetKeyState("Alt") ? alt : button
    MouseClick, %b%, , , , , %down_or_up%
}

#SingleInstance, Force
SetWorkingDir, %A_ScriptDir%
#InstallKeybdHook
#InstallMouseHook
#UseHook
SetKeyDelay -1
SetMouseDelay -1

lock_sc07b = 0
lock_sc079 = 0
lock_sc070 = 0

global MODE_CLICK := "Click"
global MODE_IME := "IME"
global MODE_BYPASS := "Bypass"

Menu, TRAY, Add
Menu, TRAY, Add, %MODE_CLICK%, do_click, +Radio
Menu, TRAY, Add, %MODE_IME%, do_ime, +Radio
Menu, TRAY, Add, %MODE_BYPASS%, do_bypass, +Radio

SplitPath, A_ScriptName, , , , script_name
global _ini_name := script_name . ".ini"
global _mode := MODE_CLICK
IniRead, _mode, %_ini_name%, settings, mode, %_mode%

update()
Return


do_click: 
    set_mode(MODE_CLICK)
Return

do_ime:
    set_mode(MODE_IME)
Return
    
do_bypass:
    set_mode(MODE_BYPASS)
Return


; 無変換キー
*sc07b::
    If (lock_sc07b) Return
    lock_sc07b = 1
    Switch (_mode) {
        case MODE_CLICK: mouse_click_alt("Left", "X1", "D")
    }
Return

*sc07b up::
    lock_sc07b = 0
    Switch (_mode) {
        case MODE_CLICK: mouse_click_alt("Left", "X1", "U")
        case MODE_IME: ime_set(0)
    }
Return

; 変換キー
*sc079::
    If (lock_sc079) Return
    lock_sc079 = 1
    Switch (_mode) {
        case MODE_CLICK: mouse_click_alt("Right", "X2", "D")
    }
Return

*sc079 up::
    lock_sc079 = 0
    Switch (_mode) {
        case MODE_CLICK: mouse_click_alt("Right", "X2", "U")
        case MODE_IME: ime_set(1)        
    }
Return

; かなキー
*sc070::
    If (lock_sc070) Return
    lock_sc070 = 1
    If (!GetKeyState("Alt")) {
        Switch (_mode) {
            case MODE_CLICK: mouse_click_alt("Middle", "Middle", "D")
        }
    }
Return

*sc070 up::
    lock_sc070 = 0
    If (!GetKeyState("Alt")) {
        Switch (_mode) {
            case MODE_CLICK: mouse_click_alt("Middle", "Middle", "U")
        }
    }
    Else {
        Switch (_mode) {
            case MODE_CLICK: Gosub do_ime
            case MODE_IME: Gosub do_bypass
            case MODE_BYPASS: Gosub do_click
        }        
    }    
Return

マウスクリックのドラッグ対応にあたって、「変換」キーと「かな」キーに対してはKeyWaitコマンドが使えないようなので、Upホットキーを使ってそれっぽく実装してみた。KeyWaitが使えないのは、使用しているキーマップによるのかもしれない。

使い方にかえて README.md

ふざけて作った割に、README.mdも書いた。
これをみればキーバインドが一目瞭然だ。


# jpkb.ahk

変換/無変換キーの動作を変更するAutoHotKeyスクリプト。

- AutoHotKey: 1.1.33.02 (https://www.autohotkey.com/)
- Language:   Japanese
- Platform:   NT
- Author:     Nihon Yamori http://yamori-jp.blogspot.com    


## 起動と終了

バイナリ版はjpkb.exeを実行、ahkスクリプト版はautohotkeyでjpkb.ahkを開く。
プログラムの終了は、トレイアイコンの右クリックメニューから「Exit」を選択。


## モードの切り替え

各モード間の切り替えは、「Alt+かな」ショートカットキーを使用するかトレイアイコンの右クリックメニューから選択。

- Alt+かな:   次のレイアウトへ切り替え


## CLICK モード

変換/無変換キーでマウスクリックのエミュレートを行うモード。
初回起動時のデフォルトモード。

- 無変換:     左クリック
- 変換:       右クリック
- カタカナ:   中クリック
- Alt+無変換: 拡張ボタン1クリック (戻る)
- Alt+変換:   拡張ボタン1クリック (進む)


## IME モード

変換/無変換キーでIMEを切り替えるモード。

- 無変換:     IMEオフ
- 変換:       IMEオン


## Bypass モード

何もしないモード。

以上。
DO WHAT THE F@CK YOU WANT W/O ME!!

リンク