ChatGPTやべえ
まずは、Delphiでわからないことを検索するとこのサイトが挙がることが多くて重宝しており、感謝申し上げます
ところがChatGPTを試してみたところ衝撃でした
これもう質問のコツを掴んだらコーディング時間1/3以下になるぞ
■質問
Delphiで2つのTBitmapの内容が同じであればTrueを返す関数
■回答
以下は、2つのTBitmapの内容が同じであるかどうかを比較し、結果をTrueまたはFalseで返すDelphiの関数の例です。
function BitmapsEqual(const Bitmap1, Bitmap2: TBitmap): Boolean;
var
Stream1, Stream2: TMemoryStream;
begin
// ビットマップをストリームにコピーする
Stream1 := TMemoryStream.Create;
try
Bitmap1.SaveToStream(Stream1);
Stream1.Position := 0;
except
Stream1.Free;
Exit(False);
end;
Stream2 := TMemoryStream.Create;
try
Bitmap2.SaveToStream(Stream2);
Stream2.Position := 0;
except
Stream2.Free;
Stream1.Free;
Exit(False);
end;
// ストリームの内容を比較する
if Stream1.Size <> Stream2.Size then
begin
Stream2.Free;
Stream1.Free;
Exit(False);
end;
Result := CompareMem(Stream1.Memory, Stream2.Memory, Stream1.Size);
Stream2.Free;
Stream1.Free;
end;
この関数では、まず、各ビットマップをTMemoryStreamにコピーします。次に、ストリームの内容を比較します。ストリームのサイズが異なる場合は、ビットマップが異なるため、Falseを返します。ストリームのサイズが同じ場合は、CompareMem関数を使用してストリームの内容を比較し、TrueまたはFalseを返します。
この関数を使用するには、2つのTBitmapを引数として渡すだけです。例えば、次のように使用します。
if BitmapsEqual(Bitmap1, Bitmap2) then
begin
// Bitmap1とBitmap2の内容が同じです
end
else
begin
// Bitmap1とBitmap2の内容が異なります
end;
■質問
Delphiで自アプリではない他のウインドウのクライアント領域のスクリーンショットを取得する関数
■回答
以下は、Delphiで自分自身でないWindowsアプリのクライアント領域のスクリーンショットを取得する方法の例です。
uses
Winapi.Windows, Vcl.Graphics;
function CaptureWindow(const Handle: HWND): TBitmap;
var
DC: HDC;
Rect: TRect;
begin
Result := TBitmap.Create;
try
DC := GetDC(Handle);
try
GetClientRect(Handle, Rect);
Result.Width := Rect.Right - Rect.Left;
Result.Height := Rect.Bottom - Rect.Top;
BitBlt(Result.Canvas.Handle, 0, 0, Result.Width, Result.Height, DC, 0, 0, SRCCOPY);
finally
ReleaseDC(Handle, DC);
end;
except
Result.Free;
raise;
end;
end;
この関数では、ウィンドウのハンドルを引数として受け取り、TBitmap型のスクリーンショットを返します。GetDC関数を使用してウィンドウのデバイスコンテキストを取得し、BitBlt関数を使用してウィンドウのクライアント領域をTBitmapにコピーします。最後に、DCを解放し、TBitmapを返します。
この関数を使用するには、次のようにします。
var
Bitmap: TBitmap;
begin
Bitmap := CaptureWindow(SomeHandle);
try
// Bitmapにクライアント領域のスクリーンショットが格納されています
finally
Bitmap.Free;
end;
end;
この関数は、自分自身でないアプリケーションのウィンドウハンドルを指定する必要があります。ただし、取得できるウィンドウの種類には制限があります。例えば、ウィンドウがデスクトップやシステムダイアログなどの特殊な種類である場合、この関数ではスクリーンショットを取得できません。
|