- PR -

SwingのIME制御

1
投稿者投稿内容
ac
会議室デビュー日: 2006/05/25
投稿数: 2
投稿日時: 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/03/28
投稿数: 18
お住まい・勤務地: 大阪
投稿日時: 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 ]
ac
会議室デビュー日: 2006/05/25
投稿数: 2
投稿日時: 2006-05-25 14:28
申し訳御座いません、マナー違反だとは知りませんでした。
以後、気をつけるように致します。
1

スキルアップ/キャリアアップ(JOB@IT)