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


HSPTV!掲示板


未解決 解決 停止 削除要請

2006
1215
クリミアIMEバーの消し方7解決


クリミア

リンク

2006/12/15(Fri) 02:01:15|NO.4115

ユーザーがデスクトップ上に「IMEバー」(もしくはATOKなどの日本語入力バー)
を出していた場合、そこにHSPで作ったプログラムを実行するウインドをひらくと、
「IMEバー」が重なって表示されてしまいジャマです。
さいしょに表示されない場合でも、バーのあった部分にマウスをおくと最前面に
でてきてしまいます。
(特に3Dなどで画面が毎回書き換わる場合はチラついて表示されてしまう)

フル画面を使用してHSPソフトを作っている方はどうやってこれを回避しているのでしょうか?

いろいろ検索してみて、入力のオンオフなどの挙動制御の方法は見つかるのですが、
「IMEバー」そのものの非表示の仕方がみつかりません。

IMEのAPIでその手の操作ができそうな気はするのですが(調査中)
なるべくユーザー側の環境を勝手にさわりたくない(かえたくない)ので
なにか方法があるのでしたら教えていただきたいと思いました。

多分、APIで一時的に非表示(もしくはトレイ格納)にして
HSPアプリ終了時にもとの状態に戻すのかなと推測しているのですが、
そのやり方もまだ判明しません。

なにかわかる方、いらっしゃいましたら教えてください。

(HSP3.1b6使用)



この記事に返信する


Irisawa

リンク

2006/12/15(Fri) 03:32:27|NO.4116

最近のIMEはデフォルトはOff状態でもIMEツールバーは表示されるようになっていてジャマ
なんですよね。
(昔のATOKなんかは非表示設定がデフォルトだったはずなんですが最近ではOff状態でも
表示される設定になっています)

ウィンドウ上でIMEツールバーを表示させない方法はimm32.dllがエクスポートしている
ImmAssociateContextを使用してIME自体を無効化します。

http://msdn.microsoft.com/library/ja/default.asp?url=/library/ja/jpintl/html/_win32_ImmAssociateContext.asp
http://hp.vector.co.jp/authors/VA016117/noime.html
http://homepage1.nifty.com/daccho/program/sdk/ime1.htm

無効状態でもIMEツールバーを表示する設定の場合はどうするのかなどは分かりません。


#uselib "imm32.dll" #cfunc ImmGetContext "ImmGetContext" int #cfunc ImmAssociateContext "ImmAssociateContext" int, int sdim buf objsize 100 pos 0, 0 button "有効にする", *Enable pos 110, 0 button "無効にする", *Disable pos 0 mesbox buf, ginfo(12), ginfo(13) - ginfo(23) id = stat ; IME コンテキストハンドルを取得 hImc = ImmGetContext(objinfo(id, 2)) stop ; IME を有効化 *Enable if hImc ! 0 { hImc = ImmAssociateContext(objinfo(id, 2), hImc) } objsel id stop ; IME を無効化 *Disable if ImmGetContext(objinfo(id, 2)) { hImc = ImmAssociateContext(objinfo(id, 2), 0) } objsel id stop



クリミア

リンク

2006/12/15(Fri) 10:45:11|NO.4121

> Irisawa さん

早速サンプルスクリプトまであげていただきまして
ありがとうございます。

実行してみましたところ、IMEの入力は正しく有効化、無効化、
するのですが、IMEバー自体の表示オンオフには連動なく、
IMEバーの各ボタンが押せなくなるだけでした。

切り出して、自分のソースにも貼ってみたのですが、
バーの表示には変化がありませんでした。

(せめて、IMEバーの表示座標をHSPプログラム側から変更できれば
画面上部のウインドタイトル位置においてチラツキをなくせるのですが。
自分は特にIMEについて設定変更やカスタマイズを行ったおぼえがないので、
たぶん多くのユーザーにも起こりえる状況だと思われます)

自分の作成中のプログラム(ゲーム)では
日本語入力は使用しないマウス操作の内容ですので
さいしょの起動時にIMEバーを消す(デスクトップ上にある場合は)
だけでいいのですが、簡単そうな気もするのにわかりません。

当方はWindowsXP(Home/sp2)です。

どうしてもできない場合はユーザーに事前にトレイに格納しておいてもらうことも
できるのですが、これはくるしいですよね。
(大画面のウインドをもうすこし小さくするか。)

WindowsAPIについては基本知識も乏しいので
(HSP中からこのあたりをさわる作法がよくわかっていない)
紹介していただいた参考ページを理解するには時間がかかりますが、
たぶんこのあたりでまちがいないと思いますのでみてみます。

(どのソフトにも起こりえる事態なのにみなさんどうなさっているのでしょう?
HSP中の命令のなかになにか自動的にこのあたりをケアするモノがあるのでしょうか。)

ゲーム本体とは関係ない部分なのであとまわしにできますので
ほかになにかわかる方がいらっしゃいましたら、情報をよろしくお願いいたします。



Irisawa

リンク

2006/12/19(Tue) 10:34:32|NO.4201

う〜ん、そうですか。
こちらではIMEが無効状態でもIMEツールバーを表示する設定にしない限り正常動作している
ようなんですが...。
他にもっといい方法は知らないのでお力になれずすみません、



クリミア

リンク

2006/12/19(Tue) 17:58:04|NO.4208

> Irisawa さん

ご丁寧にありがとうございました。

ちょっとこれは検証に時間がかかりそうな問題のようなので
あとまわしにしようと思います。

自分のマシン以外をさわる機会に
そこを注意してみるようにしようと思っています。



Irisawa

リンク

2006/12/25(Mon) 17:42:00|NO.4398

できました。これでどうでしょうか。


#uselib "imm32.dll" #cfunc ImmGetDefaultIMEWnd "ImmGetDefaultIMEWnd" int #cfunc ImmGetContext "ImmGetContext" int #cfunc ImmAssociateContext "ImmAssociateContext" int, int #const WM_IME_CONTROL 0x283 #const IMC_CLOSESTATUSWINDOW 0x21 #const IMC_OPENSTATUSWINDOW 0x22 sdim buf objsize 100 pos 0, 0 button "有効にする", *Enable pos 110, 0 button "無効にする", *Disable pos 0 mesbox buf, ginfo(12), ginfo(13) - ginfo(23) id = stat objsel id ; IME コンテキストハンドルを取得 hImeWnd = ImmGetDefaultIMEWnd(hwnd) hImc = ImmGetContext(objinfo(id, 2)) stop ; IME を有効化 *Enable objsel id if hImc ! 0 { hImc = ImmAssociateContext(objinfo(id, 2), hImc) sendmsg hImeWnd, WM_IME_CONTROL, IMC_OPENSTATUSWINDOW, 0 } stop ; IME を無効化 *Disable objsel id if ImmGetContext(objinfo(id, 2)) { hImc = ImmAssociateContext(objinfo(id, 2), 0) sendmsg hImeWnd, WM_IME_CONTROL, IMC_CLOSESTATUSWINDOW, 0 } stop



Irisawa

リンク

2006/12/25(Mon) 17:45:07|NO.4399

と、思ったら、やっぱりダメでした。
本当にどうしたらいいんだろう。(^_^;



クリミア

リンク

2006/12/26(Tue) 11:33:28|NO.4403

> Irisawa さん

ありがとうございました。

あげてくださったサンプル単体で実験してみましたところ
自分の望んでいた動作がこれでうまくいっているようです。

(HGIMG3使用のプログラムでの組み込みテストはまだ不十分です。すみません。
オブジェクト命令と3D画面は共存できないようなので修正の仕方を十分理解できていません。
時間をかければ自分でできると思います。)

(もしかしたら自分が当初心配したほどこのあたりのことで
 ユーザーは不便を感じてないのかもしれませんね。)



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