Bricscad V17 Ctrl (文字列取得、送信) 2016/12/13
※Delphi XE5 でのサンプルです。Bricscad V17 32bit 版で動作確認をしています。
・メインウィンドウ、コマンド履歴ウィンドウ、コマンドラインウィンドウの取得
・ウィンドウの文字列取得、ウィンドウへの文字列送信

■V17~V19 対応版は、こちら↓です。(2018/12/02)
・BcadCtrl19.zip (Bricscad V17~V19 通信ユニット BcadCtrl19.pas)
unit BcadV17TestUnit;
interface
uses
Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls;
type
TForm3 = class(TForm)
Button1: TButton;
Button2: TButton;
Edit1: TEdit;
Memo1: TMemo;
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
private
{ Private 宣言 }
public
{ Public 宣言 }
end;
var
Form3: TForm3;
implementation
{$R *.dfm}
//******************************************
// 他のプロセス内のコントロールの文字列を得る
//******************************************
function GetWindowString(h : HWND) : string;
var
p : PChar;
len : LongInt;
begin
result := '';
//ウィンドウの文字列のバイト数を取得
//終端のNULL文字を含まない文字列の長さ(バイト数)
len := SendMessage(h, WM_GETTEXTLENGTH, 0, 0);
if len > 0 then begin
//終端のNULL文字を含むサイズを確保
GetMem(p, (len + 1) * 2);
//格納するバッファの最大サイズ(終端のNULL文字を含む長さ)
//文字列バッファ
SendMessage(h, WM_GETTEXT, (len + 1) * 2, LongInt(p));
//文字列がバッファサイズより長いとき、後部がカットされる
result := string(p);
FreeMem(p);
end;
end;
// アクティブに
procedure TForm3.Button1Click(Sender: TObject);
var
h : HWND;
begin
h := FindWindow('BricscadMainWindow', nil);
if IsWindow(h) then
SetForegroundWindow(h);
end;
// コマンドライン文字列取得・送信
procedure TForm3.Button2Click(Sender: TObject);
var
h, hMain : HWND;
hCmdBar : HWND;
hCmdLine : HWND;
hCmdHist : HWND;
i : integer;
cmd : string;
begin
Edit1.Text := '';
Memo1.Lines.Clear;
hMain := FindWindow('BricscadMainWindow', nil);
// 子ウィンドウを探す
hCmdBar := FindWindowEx(hMain, 0, nil, 'コマンドライン');
h := hCmdBar;
for i := 1 to 4 do h := GetWindow(h, GW_CHILD);
// コマンド履歴
hCmdHist := h;
// コマンドライン
hCmdLine := GetWindow(h, GW_HWNDNEXT);
if hCmdLine = 0 then begin
// トップレベルのウィンドウを探す
hCmdBar := FindWindow(nil, 'コマンドライン');
h := hCmdBar;
for i := 1 to 5 do h := GetWindow(h, GW_CHILD);
// コマンド履歴
hCmdHist := h;
// コマンドライン
hCmdLine := GetWindow(h, GW_HWNDNEXT);
end;
if hCmdLine <> 0 then begin
// コマンドライン
Edit1.Text := GetWindowString(hCmdLine);
// コマンド履歴
Memo1.Lines.Add(GetWindowString(hCmdHist));
// 文字列を送信
{ コマンド送信例
#27:[ESC] キャンセル
#13:[Enter] }
cmd := #27#27 + 'ZOOM ALL' + #13;
for i := 1 to Length(cmd) do
SendMessage(hCmdLine, WM_CHAR, Word(cmd[i]), 0);
end;
end;
end.