IME を操作する OpenOffice.org マクロを作ってみた。
Windows 専用である。
フォームへの入力が多少改善されると思う。
フォームではテキストボックスのフォーカス取得イベントにモード切替のマクロを割り当てて使う。
BASICでは InputBox関数の前に呼び出せばいい。
サンプル ドキュメント (imm_sample.odt)
REM ***** BASIC *****
Option Explicit ' 宣言のない変数はエラー
const SYSTEM_WIN32 as long = 1
const SYSTEM_WIN16 as long = 2
const SYSTEM_JAVA as long = 3
const SYSTEM_OS2 as long = 4
const SYSTEM_MAC as long = 5
const SYSTEM_XWINDOW as long = 6
const IME_CMODE_ALPHANUMERIC as long = 0 ' アルファベット
const IME_CMODE_NATIVE as long = 1 ' 日本語(各国語)
const IME_CMODE_JAPANESE as long = 1 ' = IME_CMODE_NATIVE
const IME_CMODE_KATAKANA as long = 2 ' カタカナ/ひらかな
const IME_CMODE_LANGUAGE as long = 3 ' 言語マスク?
const IME_CMODE_FULLSHAPE as long = &h008 ' 全角/半角
const IME_CMODE_ROMAN as long = &h010 ' ローマ字入力
const IME_CMODE_CHARCODE as long = &h020 ' コード入力
const IME_CMODE_HANJACONVERT = &h040 '
const IME_CMODE_SOFTKBD as long = &h080 ' ソフトウェアキーボード
const IME_CMODE_NOCONVERSION as long = &h100 '
const IME_CMODE_EUDC as long = &h200 ' EUDC(ってなんだ?)
const IME_CMODE_SYMBOL as long = &h400 ' シンボル記号(英数の?)
const IME_CMODE_FIXED as long = &h800 '
' ----------------------------------------------------------------------
' sample main
'
Sub Main
immOff
inputBox "ASCII"
immKata
inputBox "カタカナ"
immHIra
inputBox "ひらかな"
immKbd
inputBox "KEYBORD"
immCode
inputBox "CHRCODE"
imm(FALSE)
end sub
' ----------------------------------------------------------------------
' imm32.dll
'
Declare Function ImmGetContext Lib "imm32.dll" (ByVal hWnd as long) as long
Declare Function ImmReleaseContext Lib "imm32.dll" (ByVal hWnd as long, ByVal hIMC as long) as long
Declare Function ImmSetOpenStatus Lib "imm32.dll" (ByVal hIMC as long, ByVal bOpen as long) as long
Declare Function ImmGetOpenStatus Lib "imm32.dll" (ByVal hIMC as long) as long
Declare Function ImmGetConversionStatus Lib "imm32.dll" (ByVal hIMC as long, cmode as long, smode as long) as long
Declare Function ImmSetConversionStatus Lib "imm32.dll" (ByVal hIMC as long, ByVal cmode as long, ByVal smode as long) as long
' ----------------------------------------------------------------------
' IME制御
'
sub imm(sw as long, optional mode as long)
if IsMissing(mode) then mode = IME_CMODE_JAPANESE + IME_CMODE_FULLSHAPE
dim hWND as long
dim hIMC as long
dim PID() as byte
hWND = StarDesktop.ActiveFrame.ContainerWindow.getWindowHandle(PID, SYSTEM_WIN32)
hIMC = ImmGetContext(hWnd)
ImmSetOpenStatus(hIMC, sw)
if (sw) then
dim cmode as long, smode as long
ImmGetConversionStatus(hIMC, cmode, smode)
ImmSetConversionStatus(hIMC, mode, smode)
end if
ImmReleaseContext(hWND,hIMC)
End Sub
' ----------------------------------------------------------------------
' IME ON
sub immOn
imm(TRUE, IME_CMODE_JAPANESE+IME_CMODE_FULLSHAPE)
end sub
' ----------------------------------------------------------------------
' IME OFF
sub immOff
imm(FALSE)
end sub
' ----------------------------------------------------------------------
sub immHira
imm(TRUE, IME_CMODE_JAPANESE+IME_CMODE_FULLSHAPE)
end sub
' ----------------------------------------------------------------------
sub immKata
imm(TRUE, IME_CMODE_JAPANESE+IME_CMODE_KATAKANA+IME_CMODE_FULLSHAPE)
end sub
' ----------------------------------------------------------------------
sub immCode
imm(TRUE, IME_CMODE_JAPANESE +IME_CMODE_FULLSHAPE+ IME_CMODE_CHARCODE)
end sub
' ----------------------------------------------------------------------
sub immKbd
imm(TRUE, IME_CMODE_JAPANESE+IME_CMODE_FULLSHAPE+IME_CMODE_SOFTKBD)
end sub