Excel VBA質問箱 IV

当質問箱は、有志のボランティア精神のおかげで成り立っています。
問題が解決したら、必ずお礼をしましょうね。
本サイトの基本方針をまとめました。こちら をご一読ください。

投稿種別の選択が必要です。ご注意ください。
迷惑投稿防止のため、URLの入力を制限しています。ご了承ください。


13423 / 13644 ツリー ←次へ | 前へ→

【5342】しつこいようですが「変換候補の取得について」 KAZ 03/5/7(水) 14:00 質問
【5353】Re:しつこいようですが「変換候補の取得につ... りん 03/5/7(水) 19:20 発言
【5358】違った意味で・・・ KAZ 03/5/8(木) 8:31 発言
【5362】Re:違った意味で・・・ JuJu 03/5/8(木) 12:59 発言
【5368】Re:違った意味で・・・ KAZ 03/5/8(木) 15:29 質問
【5429】Re:違った意味で・・・ JuJu 03/5/13(火) 12:40 発言
【5454】お手数かけます KAZ 03/5/14(水) 18:08 お礼
【5486】Re:お手数かけます JuJu 03/5/15(木) 15:33 発言
【5488】Re:お手数かけます KAZ 03/5/15(木) 16:18 発言

【5342】しつこいようですが「変換候補の取得につ...
質問  KAZ E-MAIL  - 03/5/7(水) 14:00 -

引用なし
パスワード
   いつもお世話になります。
WIN32APIの中に、IME関係のAPIがいくつかありますが、そのうちのImmGetCandidateListというのがありますよね?これを使って文字の
変換候補を取得する方法をお教え頂きたいのですが、宜しくお願い
致します

【5353】Re:しつこいようですが「変換候補の取得に...
発言  りん E-MAIL  - 03/5/7(水) 19:20 -

引用なし
パスワード
   KAZ さん、こんばんわ。

>WIN32APIの中に、IME関係のAPIがいくつかありますが、そのうちのImmGetCandidateListというのがありますよね?これを使って文字の
>変換候補を取得する方法をお教え頂きたいのですが、宜しくお願い
>致します

変換候補といえばImmGetConversionList関数の実験がありました。
途中からかなり脱線しました(私のせいですが)
http://www21.tok2.com/home/vbalab/bbs/c-board.cgi?cmd=ntr;tree=848;id=

【5358】違った意味で・・・
発言  KAZ E-MAIL  - 03/5/8(木) 8:31 -

引用なし
パスワード
   りんさん、おはようございます。レス有難うございました。

と言う事で、石鹸箱、見に行きました。違った意味で、面白かったですぅ。

さて、ImmGetConversionListの件ですが、前回違う質問でこれを教えて頂いて、
試してみたのですが、win2K+IME2000という組み合わせでもやはり、全ての変換候補
を取得することは出来ない場合がありました。それで行き詰まっているのですが、
色々調べたら他にも候補や候補リストを取得する関数がいくつかあるようで、今回は
その中のImmGetCandidateListについて教えていただこうと投稿してみた次第です。
もしなにかお分かりでしたら教えてください。宜しくお願い致します。

【5362】Re:違った意味で・・・
発言  JuJu E-MAIL  - 03/5/8(木) 12:59 -

引用なし
パスワード
   KAZさん、りんさん、こんにちはぁ

ImmGetCandidateListですか^^;
これは、変換中の時の候補リストを列挙するAPIです。
基本的に変換中の必要があります。
確かにこれなら、手動で変換している時のすべての候補を取得することはできると思います(同じものですですから^^)

引値の数が違いますが、私のサンプルの ImmGetConversionList の部分を、ImmGetCandidateList に置き換えればほぼ大丈夫です。
多分使えないとは思いますけど、必要ならサンプルでも作りますよ。

詳しく書くと長くなるので省略しますが、これを使って自動で取得するには ImmSetCompositionString等を使って手入力をシミュレートする方法が考えられます。
(よくソフトキーボードや入力支援ソフト等に使われている手法です)
結構リスキーですね。
ImmSetCompositionString関数は、苦手なAPIの1つなので詳しくは聞かないでね^^;

ではではぁ

【5368】Re:違った意味で・・・
質問  KAZ E-MAIL  - 03/5/8(木) 15:29 -

引用なし
パスワード
   JuJu さん、こんにちは。レス有難うございます。
>
>引値の数が違いますが、私のサンプルの ImmGetConversionList の部分を、ImmGetCandidateList に置き換えればほぼ大丈夫です。
>多分使えないとは思いますけど、必要ならサンプルでも作りますよ。

ぜひぜひ、サンプルを作ってください、お願い致します。

>詳しく書くと長くなるので省略しますが、これを使って自動で取得するには ImmSetCompositionString等を使って手入力をシミュレートする方法が考えられます。
>(よくソフトキーボードや入力支援ソフト等に使われている手法です)
>結構リスキーですね。
>ImmSetCompositionString関数は、苦手なAPIの1つなので詳しくは聞かないでね^^;
>
そうおっしゃらずに、ImmGetCandidateListのほうも、なんとかおわかりになる範囲
で使い方や他に必要な関数の情報など、また、サンプルなどお作り頂けないでしょうか?
何卒なにとぞ、お願い申し上げまするm(_ _)m

【5429】Re:違った意味で・・・
発言  JuJu E-MAIL  - 03/5/13(火) 12:40 -

引用なし
パスワード
   KAZさん、こんにちはぁ

遅れてごめんなさい。

>>引値の数が違いますが、私のサンプルの ImmGetConversionList の部分を、ImmGetCandidateList に置き換えればほぼ大丈夫です。
>>多分使えないとは思いますけど、必要ならサンプルでも作りますよ。
>ぜひぜひ、サンプルを作ってください、お願い致します。

下のほうにサンプルを付けときます。
ほとんど、ImmGetConversionListの時と同じです。
変換中の候補を取得するものなので、変換文字の指定はできません^^;

あとは、ImmSetCompositionString関数かなぁ^^;;

ではではぁ

'---- 8< ---- 8= ---- 8< ---- 8= ---- 8< ---- 8= ---- 8< ---- 8= ----
' IME関連API定義
Private Declare Function ImmGetDefaultIMEWnd Lib "imm32.dll" (ByVal hWnd As Long) As Long
Private Declare Function ImmGetContext Lib "imm32.dll" (ByVal hWnd As Long) As Long
Private Declare Function ImmReleaseContext Lib "imm32.dll" (ByVal hWnd As Long, ByVal himc As Long) As Long
Private Declare Function ImmGetCandidateList Lib "imm32.dll" Alias "ImmGetCandidateListA" (ByVal himc As Long, ByVal deIndex As Long, lpCandidateList As Any, ByVal dwBufLen As Long) As Long
Private Declare Sub MemCpy Lib "kernel32" Alias "RtlMoveMemory" (Destination As Any, Source As Any, ByVal Length As Long)
Private Type CANDIDATELIST
  dwSize As Long
  dwStyle As Long
  dwCount As Long
  dwSelection As Long
  dwPageStart As Long
  dwPageSize As Long
  dwOffset(1) As Long
End Type

Public Function GetCandidateList() As Variant
  Dim hKl As Long, hIMEWnd As Long, himc As Long
  Dim lngLength As Long, lngOffset As Long
  Dim abytBuffer() As Byte
  Dim udtCandList As CANDIDATELIST
  Dim lngPos As Long
  Dim strConv As String
  Dim lngCount As Long
  Dim astrFuncResult() As String

  lngCount = 0
  '' IMEクラスの既定ウィンドウハンドルの取得
  hIMEWnd = ImmGetDefaultIMEWnd(0&)
  If hIMEWnd <> 0& Then
    '' 入力コンテキスト作成
    himc = ImmGetContext(hIMEWnd)
    If himc <> 0& Then
      '' 変換結果に必要なバッファサイズの取得
      lngLength = ImmGetCandidateList(himc, 0&, ByVal 0&, 0&)
      If lngLength > 0 Then
        '' 変換結果取得
        ReDim abytBuffer(lngLength - 1)
        If ImmGetCandidateList(himc, 0&, abytBuffer(LBound(abytBuffer())), lngLength) <> 0& Then
          '' バッファを構造体へコピー
          MemCpy udtCandList, abytBuffer(LBound(abytBuffer())), LenB(udtCandList)
          lngOffset = udtCandList.dwOffset(0)
          If lngLength - lngOffset > 0 Then
            '' 変換結果を文字列に変換
            strConv = String(lngLength - lngOffset, vbNullChar)
            MemCpy ByVal strConv, abytBuffer(LBound(abytBuffer()) + lngOffset), Len(strConv)
            '' 変換結果分割
            Do Until (Left$(strConv, 1) = vbNullChar) Or (Len(strConv) = 0)
              For lngPos = 1 To Len(strConv)
                If Mid$(strConv, lngPos, 1) = vbNullChar Then Exit For
              Next
              ReDim Preserve astrFuncResult(lngCount)
              astrFuncResult(lngCount) = Left$(strConv, lngPos - 1)
              strConv = Mid$(strConv, lngPos + 1)
              lngCount = lngCount + 1
            Loop
          End If
        End If
      End If
      '' 入力コンテキストの開放
      Call ImmReleaseContext(hIMEWnd, himc)
    End If
  End If
  GetCandidateList = IIf(lngCount > 0, astrFuncResult, Empty)
End Function

【5454】お手数かけます
お礼  KAZ E-MAIL  - 03/5/14(水) 18:08 -

引用なし
パスワード
   JuJu さん、こんにちは
>
>遅れてごめんなさい。
いえいえ、面倒くさいお願いをして本当にすみません(などといいつつ結局サンプルを
作らせている・・・)ありがとうございます。
>
>下のほうにサンプルを付けときます。
>ほとんど、ImmGetConversionListの時と同じです。
>変換中の候補を取得するものなので、変換文字の指定はできません^^;
ということは、何かの文字をIMEで変換した時にそのリストを取得するって言うこと
になるんですね?

>あとは、ImmSetCompositionString関数かなぁ^^;;
は、はい、ぜひとも、もうひとがんばりしていただいて、変換文字の指定方法を教えて
下さい。ほんとにほんとに、すみません、お願いいたします。

【5486】Re:お手数かけます
発言  JuJu E-MAIL  - 03/5/15(木) 15:33 -

引用なし
パスワード
   KAZさん、こんにちはぁ

>>変換中の候補を取得するものなので、変換文字の指定はできません^^;
>ということは、何かの文字をIMEで変換した時にそのリストを取得するって言うこと
>になるんですね?

変換中の時限定ですね。
VBならサブクラス化するかタイマで監視するかである程度は使えるけど、Excelではほとんど使えないと思いますよ。

>>あとは、ImmSetCompositionString関数かなぁ^^;;
>は、はい、ぜひとも、もうひとがんばりしていただいて、変換文字の指定方法を教えて下さい。ほんとにほんとに、すみません、お願いいたします。

あ、いや、私はやらないのでKAZさん頑張ってっていう意味だったんですけど^^;
2,3日真剣に考えれば何とかなるのかなとか思ってますけど、今そんなに時間取れないです^^;;

以下余談
 いろいろなサイトをまわってお気づきだと思いますけど、この質問についての回答はほぼ返ってきません。
 IME絡みはまだアプリケーションではなくナレッジで稼ぐことができます。
 ほとんどがプロで特殊用途用にしか使わないので、無償で公開しているサイトはないのかな。

【5488】Re:お手数かけます
発言  KAZ E-MAIL  - 03/5/15(木) 16:18 -

引用なし
パスワード
   JuJu さん、こんにちは

>あ、いや、私はやらないのでKAZさん頑張ってっていう意味だったんですけど^^;
い、いや、私には到底分かりませんよ。

>2,3日真剣に考えれば何とかなるのかなとか思ってますけど、今そんなに時間取れないです^^;;
おひまができたらでよいですので、気長にお待ちしております・・・
>
>以下余談
> いろいろなサイトをまわってお気づきだと思いますけど、この質問についての回答はほぼ返ってきません。
> IME絡みはまだアプリケーションではなくナレッジで稼ぐことができます。
> ほとんどがプロで特殊用途用にしか使わないので、無償で公開しているサイトはないのかな。

仰る通りです。場合によってはユーザーインターフェイスその物が辞書ファイルと共に
パッケージ商品になっているようで、もう何度も質問に出しているのでお分かりと思いますが、やはりどうやって目的のデータを引っ張ってくれるかを公開しているサイトはなかなか無いようです。トホホ・・・・

13423 / 13644 ツリー ←次へ | 前へ→
ページ:  ┃  記事番号:
2610219
(SS)C-BOARD v3.8 is Free