HSPポータル
サイトマップ お問い合わせ


HSPTV!掲示板


未解決 解決 停止 削除要請

2007
0106
ななし入力中の日本語10未解決


ななし

リンク

2007/1/6(Sat) 23:00:40|NO.4678

テキストボックスで確定していない日本語の入力中の文字を取得する方法はないでしょうか



この記事に返信する


Irisawa

リンク

2007/1/7(Sun) 04:38:33|NO.4679

http://hsp.tv/play/pforum.php?mode=all&num=4533

の内容をベースに改良したものです。
入力中の文字列が長くなりすぎると末尾が化けることがあるようですのでご注意下さい。
簡単に書いたので何か問題があるかも知れません。
実際にはもう少し工夫した方がいいと思います。


#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 #module #uselib "imm32.dll" #cfunc ImmGetCompositionString "ImmGetCompositionStringA" int, int, var, int #cfunc ImmGetContext "ImmGetContext" int #func ImmReleaseContext "ImmReleaseContext" int, int #const GCS_COMPSTR 0x0008 ; 入力中文字列の取得 #defcfunc GetImeStr int id, local hIMC, local size, local buf hIMC = ImmGetContext(objinfo(id, 2)) size = ImmGetCompositionString(hIMC, GCS_COMPSTR, buf, 0) sdim buf, size size = ImmGetCompositionString(hIMC, GCS_COMPSTR, buf, size) ImmReleaseContext objinfo(id, 2), hIMC return buf #global ; 定数の定義 #const GWL_WNDPROC -4 #const WM_IME_STARTCOMPOSITION 0x10d #const WM_IME_ENDCOMPOSITION 0x10e #const WM_IME_COMPOSITION 0x10f #const WS_VISIBLE 0x10000000 #const WS_CHILD 0x40000000 ; メッセージフック 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) ; インプットボックス作成 y = ginfo(13) / 2 sdim buf mesbox buf, ginfo(12), y, 5 id = stat ; スタティックテキスト winobj "static", "", 0, WS_VISIBLE | WS_CHILD, ginfo(12), y msg = "ここに入力中の文字が表示されます。" sid = stat gosub *setmsg ; ウィンドウプロシージャを取得 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 ; スタティックテキストの文字列を設定 *setmsg sendmsg objinfo(sid, 2), 0xc, 0, msg return ; IME 入力開始 *OnImeStartComposition return ; IME 入力中 *OnImeComposition msg = GetImeStr(id) gosub *setmsg return ; IME 入力終了 *OnImeEndComposition msg = "ここに入力中の文字が表示されます。" gosub *setmsg return



Irisawa

リンク

2007/1/7(Sun) 09:23:47|NO.4680

> 入力中の文字列が長くなりすぎると末尾が化けることがあるようですのでご注意下さい。

これは原因が分かりました。GetImeStrの以下の部分を修正してください。


sdim buf, size


sdim buf, size + 1



ななし

リンク

2007/1/7(Sun) 18:55:02|NO.4688

ウィンドウズメッセージで処理しているのですね
なかなか難しいですがありがとうございます



ななし

リンク

2007/1/7(Sun) 23:17:06|NO.4690

話がかわるのですが
入力ボックスのフォーカスの位置を取得しようと

sendmsg objinfo(0,2),$b0,0,0 a=stat
こうして取得したのですがなぜか65537倍された値が出てしまいます
65537で割れば解決するんですけど気になります
なぜでしょうか



Kpan

リンク

2007/1/8(Mon) 10:14:01|NO.4695

戻り値をチェックしてください。
http://yokohama.cool.ne.jp/chokuto/urawaza/message/EM_GETSEL.html



ななし

リンク

2007/1/8(Mon) 10:41:08|NO.4696

>戻り値の下位ワードは選択されている領域の最初の文字の位置を、
>上位ワードは選択されている領域の最後の文字の次の位置を表します。
選択されたの範囲が取得されるみたいです
上位ワードを取得すればうまくいきそうですがどうやって取得するのでしょうか

ImmGetCandidateListを使って選択候補を取得したいのですが
取得するタイミングがわかりません
WM_IME_NOTIFYメッセージでwParam値がIMN_OPENCANDIDATEの時取得すればいいのですが
IMN_OPENCANDIDATEの数字の値?がわかりません

#const WM_IME_NOTIFY 0x282 #const IMN_OPENCANDIDATE ここ!------------- oncmd gosub *OnImeNotify, WM_IME_NOTIFY,IMN_OPENCANDIDATE ;候補ウィンドウをひらいた
どこかに一覧がのってるサイトとかはないんでしょうか



Irisawa

リンク

2007/1/8(Mon) 11:42:52|NO.4698

GoogleやYahoo!などのサーチエンジンで検索すれば大抵のメッセージの値は調べられます。
他にもPlatform SDKをインストールしてヘッダから調べる方法もありますがファイルが
多いので検索は大変かも知れません。

IMN_OPENCANDIDATEは0x0005です。
http://ag5.net/~prgroad/programming/sharpdevelop/CsEditor/RichTextBoxEx.cs.txt



Kpan

リンク

2007/1/8(Mon) 11:57:26|NO.4699

>上位ワードを取得すればうまくいきそうですがどうやって取得するのでしょうか
普通に検索して調べてください。
http://www.google.co.jp/search?q=HSP+%E4%B8%8A%E4%BD%8D%E3%83%AF%E3%83%BC%E3%83%89+%E5%8F%96%E5%BE%97



ななし

リンク

2007/1/8(Mon) 12:16:23|NO.4700

なるほどありがとうございます

#const WM_IME_NOTIFY 0x0282 #const IMN_OPENCANDIDATE 0x0005 oncmd gosub *OnImeNotify,WM_IME_NOTIFY ---- *OnImeNotify if wparam==IMN_OPENCANDIDATE : end return
こうしたのですが候補が表示されても終了してくれません
なぜでしょうか



TZ9

リンク

2007/1/8(Mon) 18:19:14|NO.4701

>どこかに一覧がのってるサイトとかはないんでしょうか
blueleafさんの公開しているsearch.exeが便利です。
http://hp.vector.co.jp/authors/VA034288/
よくある質問なのでFAQにでも載せておいた方がいいんじゃないでしょうか>おにたまさん



ONION software Copyright 1997-2023(c) All rights reserved.