请教高手:请问如何根据汉字反查编码?(200分)

  • 主题发起人 主题发起人 jilimi
  • 开始时间 开始时间
J

jilimi

Unregistered / Unconfirmed
GUEST, unregistred user!
&nbsp;请问如何根据任意一个汉字,反查出当前系统中已安装的各输入法的编码?<br>&nbsp; 例如:我的机器上已安装了五笔输入法、微软拼音输入法,则如果传入“一”字,<br>如何求出“五笔:g &nbsp;微软拼音:yi1”这样的结果?<br>&nbsp; 好像用 ImmGetConversionList 可以做到,但我只能查到微软拼音的编码,其它的<br>输入法都不行,这是为什么?是不是下面这段代码有错?下面附上源代码,请各位高<br>手帮我解决一下,我很急,谢谢!<br>function QueryCompStr(hKB: HKL; const sChinese: AnsiString): string;<br>var<br>&nbsp; dwGCL: DWORD;<br>&nbsp; szBuffer: array[0..254] of char;<br>&nbsp; iMaxKey, iStart, i: integer;<br>begin<br>&nbsp; Result := '';<br>&nbsp; iMaxKey := ImmEscape(hKB, 0, IME_ESC_MAX_KEY, nil);<br>&nbsp; if iMaxKey &lt;= 0 then exit;<br><br>&nbsp; dwGCL := ImmGetConversionList(hKB,0,pchar(sChinese),nil,0,<br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;GCL_REVERSECONVERSION);<br>&nbsp; if dwGCL &lt;= 0 then Exit; <br><br>&nbsp; dwGCL := ImmGetConversionList(hKB,0,pchar(sChinese),@szBuffer,dwGCL,<br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;GCL_REVERSECONVERSION);<br><br>&nbsp; if dwGCL &gt; 0 then<br>&nbsp; begin<br>&nbsp; &nbsp; iStart := byte(szBuffer[24]);<br>&nbsp; &nbsp; for i := iStart to iStart + iMaxKey * 2 do<br>&nbsp; &nbsp; &nbsp; AppendStr(Result, szBuffer);<br>&nbsp; end;<br>end;
 
都一天了,怎么没有一个人回答我?难道这个问题那么难吗? <br>“打开五笔输入法,输入法设置-&gt;编码查询,选择相应的输入法”<br>通过以上方法,可以反查出我机器上已经安装的五笔字形、微软拼音、全拼、双拼、<br>智能ABC、郑码等的编码来,而且不止是五笔输入法,其它输入法也大都可以做到。<br>即然那些输入法或MS能做到,那我们也一定能做到,只是应该如何去做呢?<br>为什么上面那段代码只能查到微软拼音的编码,而其它的却都不行呢?<br>&nbsp; &nbsp; 下面附上调用上面的函数的代码,请知道的高手速速帮忙,我很急,谢谢!<br>procedure TfrmQueryComposition.btnExecuteClick(Sender: TObject);<br>var<br>&nbsp; iHandleCount: integer;<br>&nbsp; pList: array[1..nHKL_LIST] of HKL;<br>&nbsp; szImeName: array[0..254] of char;<br>&nbsp; i: integer;<br>&nbsp; sFound: string;<br>begin<br>&nbsp; lstComposition.Items.Clear;<br>&nbsp; // 取得目前系统已安装输入法之各个键盘配置(Keyboard Layout)<br>&nbsp; iHandleCount := GetKeyboardLayoutList(nHKL_LIST, pList);<br>&nbsp; for i := 1 to iHandleCount do<br>&nbsp; begin<br>&nbsp; &nbsp; if ImmEscape(pList, 0, IME_ESC_IME_NAME, @szImeName) &gt; 0 then<br>&nbsp; &nbsp; begin<br>&nbsp; &nbsp; &nbsp; sFound := QueryCompStr(pList, edtExam.Text);<br>&nbsp; &nbsp; &nbsp; if sFound &lt;&gt; '' then<br>&nbsp; &nbsp; &nbsp; &nbsp; lstComposition.Items.Add(StrPas(szImeName) + ': ' + sFound);<br>&nbsp; &nbsp; end;<br>&nbsp; end;<br>end; { of btnExecuteClick }<br>
 
&nbsp; 都这么多天了,难道大富翁就没有一个高手知道如何解决这个问题了吗?大富翁的高手<br>都到哪去了?是我这个问题太难了,还是太容易了,以至于大家都不屑一顾?只有我一个人<br>在这里自问自答?<br>
 
問題似乎是出現在第二段<br>for i := 1 to iHandleCount do<br>&nbsp; begin<br>&nbsp; &nbsp; if ImmEscape(pList, 0, IME_ESC_IME_NAME, @szImeName) &gt; 0 then<br>根據除錯結果發現只執行過一次而已,我的環境是 繁體中文 win2000<br>執行的那一個輸入法是微軟新注音!<br><br>本來以為是利用下列代碼來判斷該輸入法是否支援 IME_ESC_IME_NAME 的語法,<br>&nbsp; &nbsp; k:=IME_ESC_IME_NAME;<br>&nbsp; &nbsp; rs:=ImmEscape(pList, 0, IME_ESC_QUERY_SUPPORT, @k);<br>但是只有兩個傳回 0 其他皆是 1 ,照理講,應該不只一個!<br><br>沒辦法,看其他人有無方法!<br><br>
 
在QueryCompStr中做如下修改就好(test in:win98 se+delphi5)<br>&nbsp; dwGCL := dwGCL+sizeof(TCandidateList); //add this line then ok,编码查询功能只支持单字,不支持词组。<br>&nbsp; dwGCL := ImmGetConversionList(hKB,0,pchar(sChinese),@szBuffer,dwGCL,GCL_REVERSECONVERSION);<br><br>
 
我也有过类似的问题,很想知道问题的结果!
 
&nbsp; 总算有高手回答了,谢谢pqx!<br>&nbsp; &nbsp;问题已解决部分,但用这种方法并不是所有的输入法都能查出,而用Windows自已的编<br>码查询功能(右击输入法提示条,设置-&gt;编码查询,选择相应的输入法)则都能查出来,<br>这是为什么呢?(如“王码五笔4.0”就查不出,而微软的“王码五笔86版”、“王码五<br>笔98版”则都能查到。)<br>&nbsp; &nbsp; 反查编码的的例子可以到 http://www.mildragon.com 的“学习园地”下载。本例<br>是改自台湾钱达智先生的一个例子QRYCOMP(可以在Delphi深度历险中下载)。<br>
 
那是因为该输入法没有码表,即mb文件,Windows自已的有码表如winwb98.MB<br>请看windows/system/*.mb就知道了 <br><br>我机器上安装了我们公司开发的输入法也是不行,因为也是没有码表
 
&nbsp; &nbsp;但是我发现有的有码表的也不行呀?比如“王码五笔4.0”、“大众形音输入法”等,<br>在windows/system下有相应的码表文件存在,但还是反查不出来?还请pqx赐教!
 
发个王码五笔4.0给我试试
 
To Pqx :<br>&nbsp; &nbsp; 已经发给你了。
 
多人接受答案了。
 
后退
顶部