- - PR -
SwingのIME制御
1
投稿者 | 投稿内容 |
---|---|
|
投稿日時: 2006-05-25 10:14
はじめまして、安達と申します。
SwingコンポーネントのIME制御について質問させて下さい。 Swingの画面(JFrame)にあるJTextFieldにフォーカスが当たったときにIMEを制御したいと考えています。 「ひらがな」や「半角カタカナ」など、細かく制御したいのですが、 Javaではサポートされていないようです。 そこでJNIを使ってnativeコードを書くことに決めました。 しかし、C++側でImmSetOpenStatus(hWnd,FALSE)としているのに、 IMEがOFFになってくれません。 そもそも、SwingからIME制御をすることは可能なのでしょうか? 私の考えでは、JTextFieldはネイティブのアプリケーション領域に リソースを確保しないので、無理かな?とも思っております。 以下はコードの一部です。 処理はSwing画面から、フォーカスイベント取得後、 C++プログラムまで処理が遷移し、Java側に戻るところまで確認済みです。 ご存知の方がいらっしゃいましたらご教授下さい。 宜しくお願い致します。 ------------------------------------ 環境 ------------------------------------ WinXP SP2 JDK 1.4.2 Visual C++ 6.0 (elipse3.0) ------------------------------------ TestFrame.java ------------------------------------ public class TestFrame extends JFrame{ public static void main(String args[]){ Container container = getContentPane(); JPanel panel = new JPanel(); //テキストコンポーネント JTextField text = new JTextField(); text.addFocusListener(new FocusAdapter(){ public void focusGained(FocusEvent e){ IMEController imeController = new IMEController(); //ここが怪しい・・・ imeController.IMEOff(this); } }); panel.add(text); container.add(panel); //以下画面を開く処理...etc } } ------------------------------------ IMEController.java(JNIクラス) ------------------------------------ public class IMEController{ public native void IMEOff(Object frame); public IMEController(){ System.loadLibrary("IMEController"); } } ------------------------------------ ヘッダファイル(省略) ------------------------------------ ------------------------------------ IMEController.cpp ------------------------------------ #include <windows.h> #include <winuser.h> #include <imm.h> #include <jawt.h> #include <jawt_md.h> #include "s03_item_IMEController.h" /* * Class: s03_item_IMEController * Method: ImeOff * Signature: (Ljava/lang/Object;)Ljava/lang/String; */ JNIEXPORT void JNICALL Java_s03_item_IMEController_ImeOff (JNIEnv *env, jobject obj, jobject frame) { JAWT awt; JAWT_DrawingSurface* ds; JAWT_DrawingSurfaceInfo* dsi; jawt_Win32DrawingSurfaceInfo* dsi_win; jboolean result; jint lock; DWORD dwConv, dwSent, dwTemp; /* HWNDを取得するまで */ awt.version = JAWT_VERSION_1_4; result = JAWT_GetAWT(env,&awt); if(result == JNI_FALSE){ return env->NewStringUTF("FAIL:01"); } ds = awt.GetDrawingSurface(env, frame); if (ds == NULL) { return env->NewStringUTF("FAIL:02"); } lock = ds->Lock(ds); if((lock & JAWT_LOCK_ERROR) != 0) { awt.FreeDrawingSurface(ds); return env->NewStringUTF("FAIL:03"); } dsi = ds->GetDrawingSurfaceInfo(ds); if (dsi == NULL) { ds->Unlock(ds); awt.FreeDrawingSurface(ds); return env->NewStringUTF("FAIL:04"); } dsi_win = (jawt_Win32DrawingSurfaceInfo*)dsi->platformInfo; if(dsi_win == NULL){ return env->NewStringUTF("FAIL:05"); } HWND hwnd = dsi_win->hwnd; /* ここからはIMEのコントロール */ HIMC hImc = ImmGetContext(hwnd); ImmGetConversionStatus(hImc,&dwConv,&dwSent); dwTemp = (IME_CMODE_ALPHANUMERIC | IME_CMODE_ALPHANUMERIC | (dwConv&IME_CMODE_ROMAN)); dwConv = dwTemp; ImmSetConversionStatus(hImc,dwConv,dwSent); if(ImmGetOpenStatus(hImc)){ ImmSetOpenStatus(hImc,FALSE); } ImmReleaseContext((HWND)hwnd,hImc); /* 以下は後処理 */ ds->FreeDrawingSurfaceInfo(dsi); ds->Unlock(ds); awt.FreeDrawingSurface(ds); } ------------------------------------ IMEController.dll(省略) ------------------------------------ 以上 |
|
投稿日時: 2006-05-25 12:21
http://ja.wikipedia.org/wiki/%E3%83%9E%E3%83%AB%E3%83%81%E3%83%9D%E3%82%B9%E3%83%88[ メッセージ編集済み 編集者: これ 編集日時 2006-05-25 12:24 ] |
|
投稿日時: 2006-05-25 14:28
申し訳御座いません、マナー違反だとは知りませんでした。
以後、気をつけるように致します。 |
1