Bricscad V17~V19 IME Off (2016/12/24 - 2019/01/09)
2019/01/09 (IMEoffBcadV19)
終了時にエラーがでることがあるのを修正しました。
2018/11/22 (IMEoffBcadV19)
Bricscad V19 で動かないのを修正しました。
二重起動の防止を追加しました。(Bricscad が複数起動しても、IMEoff は 1 個だけ起動)
2017/08/19
Bricscad に追従して終了する時に、エラーが出て終了できないことがあるのを対策しました。
2017/01/30
監視状態が分かるようにランプを付けました。
2017/01/29
IME 停止の条件に、IsWindowEnabled(hWndMain) を追加しました。
「IME Off Auto」 のチェックボックスを追加しました。
■コマンドラインの文字列が、": " の時、IME を OFF にします。(V13 では動きません)
Bricscad の Support フォルダに、on_start.lsp をメモ帳などで作成(すでにある場合は、下記一行を追加)すると、自動で起動されます。
(startapp "C:\\xxxx\\yyyy\\Bcad17ImeOff.exe")
フォルダ(パス)の区切りは、\\ は、¥¥ です。
Bricscad が終了すると、追従して終了します。
※プロパティーウィンドウには、対応していません。「IME Off Auto」 のチェックを外して下さい。
■ダウンロード
Bcad17ImeOff.zip (EXE本体のみ)
Bcad19ImeOff.zip (2019/01/09 EXE本体のみ V17~V19に対応)
// 2019/01/09 GetWindowString() を変更 unit BcadImeOffUnit; interface uses Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics, Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.ExtCtrls, Vcl.StdCtrls, Imm; type TForm3 = class(TForm) Timer1: TTimer; Edit1: TEdit; procedure Timer1Timer(Sender: TObject); procedure FormCreate(Sender: TObject); private { Private 宣言 } public { Public 宣言 } end; var Form3: TForm3; // BcadV17 が見つかるとON bRunFlag : boolean; bLoseFlag : boolean; implementation {$R *.dfm} //****************************************** // 他のプロセス内のコントロールの文字列を得る //****************************************** function GetWindowString(h: HWND): string; var buf : array [0..MAX_PATH - 1] of Char; begin result := ''; if IsWindow(h) then begin FillChar(buf, Sizeof(buf), #0); SendMessage(h, WM_GETTEXT, Length(buf), LPARAM(@buf)); result := string(buf); end; end; function BcadActive: boolean; var h : HWND; begin result := False; h := FindWindow('BricscadMainWindow', nil); if IsWindow(h) then begin SetForegroundWindow(h); result := True; end; end; function GetBcadCmdLineWindow: HWND; var h, hMain, h2 : HWND; hCmdBar : HWND; hCmdLine : HWND; i : integer; begin hMain := FindWindow('BricscadMainWindow', nil); // 子ウィンドウを探す hCmdBar := FindWindowEx(hMain, 0, nil, 'コマンドライン'); h := hCmdBar; // 2018/11/22 変更 for i := 1 to 4 do begin h2 := GetWindow(h, GW_CHILD); if h2 = 0 then break else h :=h; end; // コマンドライン hCmdLine := GetWindow(h, GW_HWNDNEXT); if hCmdLine = 0 then begin // トップレベルのウィンドウを探す hCmdBar := FindWindow(nil, 'コマンドライン'); h := hCmdBar; // 2018/11/22 変更 for i := 1 to 5 do begin h2 := GetWindow(h, GW_CHILD); if h2 = 0 then break else h := h2; end; // コマンドライン hCmdLine := GetWindow(h, GW_HWNDNEXT); end; result := hCmdLine; end; function GetBcadCmdLineText: string; var hCmdLine : HWND; begin hCmdLine := GetBcadCmdLineWindow; result := GetWindowString(hCmdLine); end; procedure TForm3.FormCreate(Sender: TObject); begin // スクリーンの右下隅に表示 Left := Screen.Width - Width - 10; Top := Screen.Height - Height - 70; end; procedure TForm3.Timer1Timer(Sender: TObject); var hWndMain : HWND; hCmdLine : HWND; IME: HWND; // uses Imm s : string; begin bLoseFlag := False; Timer1.Enabled := False; hWndMain := FindWindow('BricscadMainWindow', nil); if IsWindow(hWndMain) then begin if not bRunFlag then bRunFlag := True; // コマンドラインウィンドウ hCmdLine := GetBcadCmdLineWindow; if IsWindowEnabled(hWndMain) and IsWindowEnabled(hCmdLine) then begin // コマンド文字列 s := GetWindowString(hCmdLine); Edit1.Text := s; if s = ': ' then begin IME := ImmGetDefaultIMEWnd(hCmdLine); if IME <> 0 then begin // ONであればOFFにする if Boolean(SendMessage(IME, WM_IME_CONTROL, $0005, 0)) then begin SendMessage(IME, WM_IME_CONTROL, $0006, 0); end; end; end; end; end else begin // 終了 if bRu/nFlag then begin Timer1.Enabled := False; bLoseFlag := True; bRunFlag := False; Close; end; end; if not bLoseFlag then Timer1.Enabled := True; end; end.