DraftSight 2015 / ARES commander 2015 コマンドライン監視サンプル
※ARES は廉価版でも COM API (ActiveX) が使えます。そちらを使ったほうがスマートです。
■概要
DraftSight / ARES では、コマンドラインの文字列が取得できないため、
画面キャプチャーで、コマンド終了待ちを行うためのサンプルです。
姑息な方法ながら、結構使えそうです。
※キャプチャ位置が合わないときは、exe を右クリックし、プロパティーの「互換性」で、
「高解像度DPI...」にチェックを付けてみて下さい。

■ダウンロード
DcadReady.zip (exe 本体のみ)
■サンプルコード
※DcadCtrl2015.pas の中身は、他のページを参考にして下さい。
unit DcadReadyUnit;
interface
uses
Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
Vcl.Controls, Vcl.Forms, Vcl.Dialogs, DcadCtrl2015, Vcl.ExtCtrls, Vcl.StdCtrls,
System.Types, Vcl.Buttons;
type
TForm2 = class(TForm)
Image1: TImage;
Edit1: TEdit;
Timer1: TTimer;
Edit2: TEdit;
procedure Timer1Timer(Sender: TObject);
procedure FormCreate(Sender: TObject);
private
{ Private 宣言 }
public
{ Public 宣言 }
end;
var
Form2: TForm2;
implementation
{$R *.dfm}
procedure TForm2.FormCreate(Sender: TObject);
begin
Timer1.Interval := 100;
Timer1.Enabled := True;
end;
procedure TForm2.Timer1Timer(Sender: TObject);
var
ARect : TRect;
h, h2 : HWND;
Bmp : TBitmap;
co : Integer;
i, j : integer;
Flag : boolean;
pByteAry :PByteArray;
begin
// メインウィンドウを取得
GetDcadMainWinHandle;
// コマンド入力ウィンドウを取得
GetDcadCommandWinHandle;
// InputWindow が 無効であれば、終了
if not IsWindowEnabled(DcadInputWinHandle) then begin
Edit1.Text := '';
Edit2.Text := '';
if Assigned(Image1.Picture) then
Image1.Picture := nil;
Exit;
end;
// コマンド入力ウィンドウの位置と矩形範囲を取得
GetWindowRect(DcadInputWinHandle, ARect);
// 左上、右下の座標からウィンドウハンドルを取得
h := WindowFromPoint(ARect.TopLeft);
h2 := WindowFromPoint(Point(ARect.left+118,ARect.Bottom -1));
Edit2.Text := GetWindowString(h);
// 左上と右下を確認
if (h <> DcadInputWinHandle) or (h2 <> DcadInputWinHandle) then begin
Edit1.Text := '';
if Assigned(Image1.Picture) then
Image1.Picture := nil;
end
// ウィンドウハンドルが、InputWindow
else begin
// ビットマップ生成
Bmp := TBitmap.Create;
try
Bmp.Width := 100;
Bmp.Height := 20;
Bmp.PixelFormat :=pf24bit;
// キャプチャ
CaptureToBmp(Arect.Left + 15, ARect.Bottom-20, Bmp.Width, Bmp.Height, bmp);
// Bitmapを表示
Image1.Picture.Assign(Bmp);
// Bitmapの左上のピクセルのRGB値を取得
pByteAry := Bmp.ScanLine[0];
co := pByteAry[0];
// Bitmap内を検索
Flag := True;
for i := 1 to Bmp.Height - 1 do begin
pByteAry := Bmp.ScanLine[i];
for j := 0 to Bmp.Width -1 do begin
// 左上の色と違う = BUSY
if co <> pByteAry[j] then begin
Flag := False;
Break;
end;
end;
end;
if not Flag then begin
Edit1.Text := 'BUSY';
Edit1.Font.Color := clRed;
end
else begin
Edit1.Text := 'READY';
Edit1.Font.Color := clBlue;
end;
finally
// ビットマップ破棄
Bmp.Free;
end;
end;
end;
end.