- PR -

スペースキーでの漢字変換候補表示の方法

投稿者投稿内容
Makoto
大ベテラン
会議室デビュー日: 2004/03/31
投稿数: 133
投稿日時: 2008-04-02 10:01
いつもお世話になっております。
下記のようなことを実行することは可能でしょうか?

●環境
 VC++2008(アンマネージC++)
 Windows Vista
 ※通常のWindowsアプリです。

●やりたいこと
 全角入力時に、エディットボックスに文字列を入力して、
 スペースキーを押下すると変換候補が表示されます。(普通の動作)

 上記と同様の動作を『自分で用意したボタンクリック時に実行させること』
 は可能でしょうか?

 ちなみに、下記コードでは実現できず、スペースが入力されていきました...

  CEdit pED = (CEdit*)GetDlgItem(IDC_EDIT1);
pED->SetFocus();
  pED->PostMessage(WM_CHAR,VKEY_SPACE,NULL);

なぜそんなことをと思われると思いますが、
WinXPアプリで、IMEのAPIを使用して変換候補をアプリで取得する処理を
実装していたのですが、WinVistaではMSがそのAPIを使用できなくしたようなのです。

という経緯で解決策を探しています。

使用しているAPIは、
 ImmNotifyIME
 ImmGetCompositionString
 ImmSetCompositionString
などです。

通常、『スペースキーを押すと変換候補が表示されます』ので、
同様のことを自前の変換ボタンクリックで可能かどうかを調査しています。

わかりづらい説明かと思いますが、
ご存知の方いらっしゃいましたら、アドバイスお願い致します。
Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2008-04-02 22:16
 おそらく、これを使えということかと。。。
Text Services Framework<microsoft.com>
情報源:
 MSDN ライブラリで、「ime vista」を検索。
 imm32 を使ったプログラムの互換性について<microsoft.com>(TechNet フォーラム)
Azulean
大ベテラン
会議室デビュー日: 2008/01/04
投稿数: 123
お住まい・勤務地: 大阪府
投稿日時: 2008-04-02 23:28
引用:

通常、『スペースキーを押すと変換候補が表示されます』ので、


カスタマイズされてることはないと見て良いのかな…。

#マイナーなIMEとか出てこないか、さすがに。
Makoto
大ベテラン
会議室デビュー日: 2004/03/31
投稿数: 133
投稿日時: 2008-04-03 09:06
回答ありがとうございます。

下記のように変更したところうまくいきました。

 CEdit* pED = (CEdit*)GetDlgItem(IDC_EDIT1);
 pED->SetFocus();

 keybd_event(VK_CONVERT,0,0,0);
keybd_event(VK_CONVERT,0,KEYEVENTF_KEYUP,0);

WM_CHARでも、VK_SPACEでもなかったようです。

今回のような仕様シフト(IME→TSF)は、
新規にC#で作成などのケースはいいんですが、
既存のアプリ(アンマネージVC++6からのモジュール)だと
OSの仕様変更が大きく影響して大変です。

下記記事を見つけましたので、参考までに記載します。

 http://www.4gamer.net/games/031/G003141/20071001029/

「サードパーティのIMEをインストールしない限り,
Windows VistaではTSFが使われる」
のだそうで、逆に言えば
「3rdParty製のIMEがあれば、IMEのAPIも動作する」はずです。

実験したところ、私の環境では、ATOK15(一太郎12)をインストールしたところ、
IMM_XXX系のAPIがVistaでも正しく動作するようになりました。
(※ATOK15は、Vista対応してないとは思いますが...)

以上、ご助言ありがとうございました。
Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2008-04-03 21:26
引用:

Makotoさんの書き込み (2008-04-03 09:06) より:
今回のような仕様シフト(IME→TSF)は、
新規にC#で作成などのケースはいいんですが、
既存のアプリ(アンマネージVC++6からのモジュール)だと
OSの仕様変更が大きく影響して大変です。


 こちら(IME (Input Method Editor) と Text Services Framework のアクセシビリティ<microsoft.com>)の資料によると、2002年にはアナウンスされています。Vista が出るまでに5年近い期間が「準備期間」として用意されていたし、Vista も半年ほどベータによるテスト期間があったわけですが、それでは不十分だということでしょうか。

 技術情報の公開の仕方や告知期間など、ご要望がありましたら、代わって伝えておきます。
Makoto
大ベテラン
会議室デビュー日: 2004/03/31
投稿数: 133
投稿日時: 2008-04-04 09:01
いつもお世話になっております。

OfficeXP時代からTSFが組みこまれ始めたようなので『私の勉強不足』なんです。
が、
やはり技術資料を読み込んでいる時間もそれほど取れないのが実情です。
まぁ、ただの言い訳なんですけど...

マイナス思考な話はこれくらいにして希望としては、
なにかOSに近いモジュール(IE,IMEなどなど)のAPIに大きな変更がある場合には、
例えば、

 ・VSでPJ起動時に『仕様変更が発生するAPIを使ってますよ。
        いつから使えなくなりますよ。』

などのアナウンスをしてもらえるとうれしいですね。
(処理が重いと困りますが...)

まぁ、これやってもらえても気付くかはわからないですが...
Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2008-04-04 20:21
引用:

Makotoさんの書き込み (2008-04-04 09:01) より:
例えば、

 ・VSでPJ起動時に『仕様変更が発生するAPIを使ってますよ。
        いつから使えなくなりますよ。』

などのアナウンスをしてもらえるとうれしいですね。
(処理が重いと困りますが...)


 なるほど。
 PJ 起動時は、ちょっと難しいかな?解析するにしても、同じ名前の別の関数かもしれませんから。
 .NET Framework に関しては、「使われなくなる」という属性をつけることで、コンパイル時にワーニングを出すことができます。これは、そういう属性をつけられるように設計してあるからで、素の C や C++ にはそのような機能はないため、難しいですね。プロジェクトをリンクするときに、リンクしようとしている関数が「使われなくなるテーブル」にあるか照合し、あったらワーニングを出す...みたいな感じですかね。

 「PJ 起動時」というのを「VS 起動時」と読み違え、スタートページに表示される、RSS でフィードされている情報に、まとめられたものがあってもいいなぁ、と思いました。実際、検索してみると情報ページはいろいろあるのですが、ポータル的なサイトが見つからなかったり、パンくずリストで上位のサイトに行ったら下に戻れなかったりと、情報の提示の仕方については改善を要求したいと思っていました。


1.リンク時にワーニングとして検出できるような仕掛け
2.ライブラリや OS 機能の追加、変更、削除を RSS として配信する(専用ページをまとめる)

 この2点で投げてみたいと思います。ありがとうございました。
 最近、フィードバックを出すシステムが変わって、どこに出したらいいかわからないから、お世話係にメールで投げておきます。外から見えなくてごめんなさい。
# ん?14〜17日に直接申し入れるという方法もあるぞ
Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2008-04-26 21:39
引用:

Jittaの書き込み (2008-04-04 20:21) より:

1.リンク時にワーニングとして検出できるような仕掛け
2.ライブラリや OS 機能の追加、変更、削除を RSS として配信する(専用ページをまとめる)

 この2点で投げてみたいと思います。ありがとうございました。
 最近、フィードバックを出すシステムが変わって、どこに出したらいいかわからないから、お世話係にメールで投げておきます。外から見えなくてごめんなさい。
# ん?14〜17日に直接申し入れるという方法もあるぞ


 1の方は、仕掛けとしてはあるけれど、それに登録されていない、って感じですね。なので、フィードバックとしては提出しません。機会を見つけて、マーク付けの基準みたいなものがあるのか、聞いてみます。
 2の方、直接聞くつもりで、失敗しました。ルートを探してメールしておきます。

経過報告まで。

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