Re: IMEのON/OFFを制御するには ( No.1 ) |
- 名前:通 日時:2008/09/10 11:23
Yes.
詳しくはその中で使用されている、
WinApiを調べれば分かりますね。
ImmSetOpenStatusのあたり。
#少々気になったのは、TRUEと比較しているところ
|
Re: IMEのON/OFFを制御するには ( No.2 ) |
- 名前:koga2020 日時:2008/09/10 12:59
ありがとういございます。
ImmSetOpenStatus関数はWinAPIだったんですね。
すみませんが、普通に型とグローバル変数まわりの以下の部分で躓いてしまいました。
自ウィンドウのハンドルは隠蔽されているという仕様のようです。
HIMC Imc ;
HWND DefHwnd = WinData.MainWindow;
やれるとしたら恐らくexternだと思うのですが、正しいやり方がわからず、型エラーが出てしまいます。
型宣言まわりをヘッダから同じようにextern宣言を記述しただけではダメでした・・・(ここら辺がビギナーです)
仕様がオープンされていない広域変数なので、できればDXライブラリのオープンな機能にしたいのですが、Ver2.24e の追加としてできると助かります。
|
Re: IMEのON/OFFを制御するには ( No.3 ) |
- 名前:Will 日時:2008/09/10 13:35
> 自ウィンドウのハンドルは隠蔽されているという仕様のようです。
言いたいことがよくわからないんですが、DXライブラリが作るウィンドウのハンドルを取得したいということでしょうか?
だとすれば、以下の関数で取得できます。
extern HWND GetMainWindowHandle( void ) ; // メインウインドウのハンドルを取得する
|
Re: IMEのON/OFFを制御するには ( No.4 ) |
- 名前:koga2020 日時:2008/09/10 18:06
ありがとうございます。
動作しました。!
WinData.MainWindow という変数にアクセスできる必要があるのかと思っていました。
IMEが現在ONかOFFかを取得する関数も同様にして作ることができました。(変更前のIMEの状態を保持させることもできるようになりました。)
|
Re: IMEのON/OFFを制御するには ( No.5 ) |
- 名前:koga2020 日時:2008/09/12 12:31
ちなみにソースコードは以下のようになりました。
ご教授ありがとうございました。
//////////////////////////////////////////////////////////////////////////////////////
// IMEのON/OFFを取得する
// ON : true OFF : false
static int GetIMEOpenState( void )
{
BOOL IME_status;
HIMC Imc ;
HWND DefHwnd = GetMainWindowHandle();
// 入力コンテキストを取得
Imc = ImmGetContext( DefHwnd ) ;
// 使用状態を取得する 未使用:0 それ以外:0以外の値
IME_status = ImmGetOpenStatus(Imc) ;
// 入力コンテキストの削除
ImmReleaseContext( DefHwnd , Imc );
// 終了
if( IME_status == 0 )
{
return false;
}else
{
return true;
}
}
//////////////////////////////////////////////////////////////////////////////////////
// IMEの使用状態を変更する
//※DXライブラリの DxWin.cpp から転用
static int SetIMEOpenState( int OpenFlag )
{
HIMC Imc ;
HWND DefHwnd = GetMainWindowHandle();
// 入力コンテキストを取得
Imc = ImmGetContext( DefHwnd ) ;
// 使用状態を変更する
ImmSetOpenStatus( Imc, OpenFlag == TRUE ? true : false ) ;
// 入力コンテキストの削除
ImmReleaseContext( DefHwnd , Imc );
// 終了
return 0 ;
}
|
Re: IMEのON/OFFを制御するには ( No.6 ) |
- 名前:通 日時:2008/09/12 12:54
細かいですが、
TRUEと比較はやめておいたほうがいいです。
FALSEは規格で0と決まっていますがTRUEは
0以外という定義なので、1とは限りません。
TRUEとtrueの混在も良くありません。
Winodws上でのBOOL型はintのtypedef名ですが、
bool(true/false)はC++でのboolean型であり、
同一の型では無いので今後コンパイラなどが
新しくなった場合に問題が起こる可能性も
十分に考えられます。
#WindowsAPIでの真偽値の引数は殆どBOOL型で
#とられています。
Windows環境で転用するならば、
以下のようにするほうが自然かと。
static int SetIMEOpenState( BOOL bOpenStat )
{
HIMC Imc ;
HWND DefHwnd = GetMainWindowHandle();
// 入力コンテキストを取得
Imc = ImmGetContext( DefHwnd ) ;
// 使用状態を変更する
ImmSetOpenStatus( Imc, bOpenStat ) ;
// 入力コンテキストの削除
ImmReleaseContext( DefHwnd , Imc );
// 終了
return 0 ;
}
|
Re: IMEのON/OFFを制御するには ( No.7 ) |
- 名前:koga2020 日時:2008/09/12 14:28
後々のこと、また基本的な仕様からすると 通 さんのご指摘の通りですね。
static int GetIMEOpenState( void )の方も
static BOOL GetIMEOpenState( void )
に書き換えました。
ありがとうございます。
|