|
分類:[Windows 全般]
こんにちわ。
WinAPIのImmEnumRegisterWordを使用して、IMEに単語登録された情報を取得しようとしています。
MS-IMEだと今のところ問題なく取得できているのですが、ATOK2012の環境で取得できず、悪戦苦闘しています。
(ImmEnumRegisterWord、GetLastErrorの戻り値は共に0でした)
品詞の一覧取得や、ImmRegisterWordを使った単語登録は、ATOKでも大丈夫だったのですが。
うーむ、ATOKは諦めるしかないのか・・・
--------------------------------------------------------------------------------
#include <iostream>
#include <string>
#include <windows.h>
#include <imm.h>
#pragma comment(lib,"imm32.lib")
using namespace std;
STYLEBUF *style;
int count = 0;
UINT CALLBACK RegProc (
LPCTSTR lpszReading,
DWORD dwStyle,
LPCTSTR lpszString,
LPVOID lpData )
{
cout << lpszReading << "\t" << lpszString << "\t";
for ( int i=0 ; i<count ; ++i ) {
if ( style[i].dwStyle == dwStyle ) {
cout << style[i].szDescription << endl;
return 1;
}
}
cout << endl;
return 0;
}
int main()
{
HKL hkl = GetKeyboardLayout(0);
char description[256];
// IME名称
ImmGetDescription(hkl,description,255);
cout << "!" << description << endl;
// 品詞情報
count = ImmGetRegisterWordStyle(hkl,NULL,NULL);
style = new STYLEBUF[count+1];
count = ImmGetRegisterWordStyle(hkl,count,style);
cout << "!count " << count << endl;
// 単語登録を列挙
int r = ImmEnumRegisterWord(hkl,(REGISTERWORDENUMPROC)RegProc,NULL,0,NULL,NULL);
if ( r == 0 ) {
cout << "!ImmEnumRegisterWord " << GetLastError() << endl;
}
delete [] style;
return 0;
}
--------------------------------------------------------------------------------
|