HSP3でマシン語を使用してサブクラス化してみました。
HSP2では今回の件は根本的に不利なのでHSP3を使用してください。
参考
http://yokohama.cool.ne.jp/chokuto/urawaza/mcn/index.html
http://www.winapi-database.com/Message/WM/WM_IME_STARTCOMPOSITION.html
http://www.winapi-database.com/Message/WM/WM_IME_COMPOSITION.html
http://www.winapi-database.com/Message/WM/WM_IME_ENDCOMPOSITION.html
#uselib "user32.dll"
#func CallWindowProc "CallWindowProcA" var, int, int, int, int
#cfunc GetWindowLong "GetWindowLongA" int, int
#func SetWindowLong "SetWindowLongA" int, int, int
#func DestroyWindow "DestroyWindow" int
#func SendMessage "SendMessageA" int, int, int, int
; 定数の定義
#const GWL_WNDPROC -4
#const WM_IME_STARTCOMPOSITION 0x10d
#const WM_IME_ENDCOMPOSITION 0x10e
#const WM_IME_COMPOSITION 0x10f
; メッセージフック
oncmd gosub *OnImeStartComposition, WM_IME_STARTCOMPOSITION
oncmd gosub *OnImeComposition, WM_IME_COMPOSITION
oncmd gosub *OnImeEndComposition, WM_IME_ENDCOMPOSITION
; マシン語の作成
dim fncode, 26
fncode( 0) = 0x51ec8b55, 0x45c75756, 0x000000fc, 0xfc758b00, 0x830c7d8b
fncode( 5) = 0x2e7402ff, 0x7410ff83, 0x0cff811f, 0x76000001, 0x0fff812c
fncode(10) = 0x77000001, 0x1475ff24, 0x571075ff, 0xff1476ff, 0x15eb0c56
fncode(15) = 0xff0875ff, 0xc0330856, 0x76ff1aeb, 0xfffc6a10, 0x56ff0875
fncode(20) = 0x1475ff04, 0x571075ff, 0xff0875ff, 0x16ff1076, 0xc2c95e5f
fncode(25) = 0x00000010
; 関数のポインタを格納
pfn = varptr(fncode)
procdata(0) = varptr(CallWindowProc), varptr(SetWindowLong)
procdata(2) = varptr(DestroyWindow), varptr(SendMessage)
; インプットボックス作成
sdim buf
input buf
id = stat
; ウィンドウプロシージャを取得
inp_hwnd = objinfo(id, 2)
procdata(4) = GetWindowLong(inp_hwnd, GWL_WNDPROC)
procdata(5) = hwnd
p = varptr(procdata)
memcpy fncode, p, 4, 9
; サブクラス化
SetWindowLong inp_hwnd, GWL_WNDPROC, pfn
stop
; IME 入力開始
*OnImeStartComposition
return
; IME 入力中
*OnImeComposition
return
; IME 入力終了
*OnImeEndComposition
return