フォーラム


ゲスト  

ようこそ ゲスト さん。このフォーラムに投稿するには 登録が必要です。

ページ: [1]
トピック: IM(E) モードをどうにかしたい (暫定)
DEKO
管理者
投稿数: 2644
IM(E) モードをどうにかしたい (暫定)
on: 2013/04/06 13:18 Sat

暫定版です。

OS X で IME モードをどうにかする方法を調べてみたのですが、よくわからなかったのでローテクで回避しました。"ことえり" の文字種変更ショートカットのキーコードを送信するというやり方です。

uses
...
{$IFDEF MSWINDOWS}, Vcl.Controls, FMX.Platform.Win{$ENDIF}
{$IFDEF MACOS}, Macapi.CoreGraphics, Macapi.CocoaTypes, Macapi.CoreFoundation{$ENDIF};

procedure TfrmMain.SetIMEMode_Provisional(Mode: FMX.Types.TImeMode);
// IM(E) モードを変更する (暫定)
{$IFDEF MACOS}
const
kVK_ANSI_J = $26;
kVK_ANSI_K = $28;
kVK_ANSI_Semicolon = $29;
{$ENDIF}
var
{$IFDEF MSWINDOWS}
dMode: Vcl.Controls.TImeMode;
{$ENDIF}
{$IFDEF MACOS}
Src: CGEventSourceRef;
EventUp, EventDown: CGEventRef;
{$ENDIF}
begin
{$IFDEF MSWINDOWS}
if Mode <> FMX.Types.TImeMode.imDontCare then
begin
case Mode of
FMX.Types.TImeMode.imClose:
dMode := imClose;
FMX.Types.TImeMode.imOpen:
dMode := imOpen;
FMX.Types.TImeMode.imSAlpha:
dMode := imSAlpha;
FMX.Types.TImeMode.imAlpha:
dMode := imAlpha;
FMX.Types.TImeMode.imHira:
dMode := imHira;
FMX.Types.TImeMode.imSKata:
dMode := imSKata;
FMX.Types.TImeMode.imKata:
dMode := imKata;
FMX.Types.TImeMode.imHanguel:
dMode := imHanguel;
FMX.Types.TImeMode.imSHanguel:
dMode := imSHanguel;
else
dMode := imDisable;
end;
SetImeMode(FmxHandleToHWND(Self.Handle), dMode);
end;
{$ENDIF}
{$IFDEF MACOS}
Src := CGEventSourceCreate(kCGEventSourceStateCombinedSessionState);
case Mode of
FMX.Types.TImeMode.imHira:
begin
// Ctrl + Shift + J のキーイベントを生成 (ことえりのひらがなモードショートカット)
EventDown := CGEventCreateKeyboardEvent(Src, kVK_ANSI_J, Integer(True));
CGEventSetFlags(EventDown, kCGEventFlagMaskControl or kCGEventFlagMaskShift);
EventUp := CGEventCreateKeyboardEvent(Src, kVK_ANSI_J, Integer(False));
CGEventSetFlags(EventUp, kCGEventFlagMaskControl or kCGEventFlagMaskShift);
end;
FMX.Types.TImeMode.imKata:
begin
// Ctrl + Shift + K のキーイベントを生成 (ことえりのカタカナモードショートカット)
EventDown := CGEventCreateKeyboardEvent(Src, kVK_ANSI_K, Integer(True));
CGEventSetFlags(EventDown, kCGEventFlagMaskControl or kCGEventFlagMaskShift);
EventUp := CGEventCreateKeyboardEvent(Src, kVK_ANSI_K, Integer(False));
CGEventSetFlags(EventUp, kCGEventFlagMaskControl or kCGEventFlagMaskShift);
end;
else
// Ctrl + Shift + ; のキーイベントを生成 (ことえりの英数モードショートカット)
EventDown := CGEventCreateKeyboardEvent(Src, kVK_ANSI_Semicolon, Integer(True));
CGEventSetFlags(EventDown, kCGEventFlagMaskControl or kCGEventFlagMaskShift);
EventUp := CGEventCreateKeyboardEvent(Src, kVK_ANSI_Semicolon, Integer(False));
CGEventSetFlags(EventUp, kCGEventFlagMaskControl or kCGEventFlagMaskShift);
end;
CGEventPost(kCGSessionEventTap, EventDown);
CGEventPost(kCGSessionEventTap, EventUp );
CFRelease(EventUp );
CFRelease(EventDown);
CFRelease(Src);
{$ENDIF}
end;

 
See Also:
[[FMX] ImeMode does not work (with Japanese IME)]
http://qc.embarcadero.com/wc/qcmain.aspx?d=105723

DEKO
管理者
投稿数: 2644
Re: IM(E) モードをどうにかしたい (暫定)
on: 2014/04/16 14:20 Wed

この件は XE6 で解決されています。

ページ: [1]
WP Forum Server by ForumPress | LucidCrew
バージョン: 1.7.5 ; ページロード: 0.024 sec.