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.