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.