名前 題名 ▼ miyaさん > 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; > この関数は、自分自身でないアプリケーションのウィンドウハンドルを指定する必要があります。ただし、取得できるウィンドウの種類には制限があります。例えば、ウィンドウがデスクトップやシステムダイアログなどの特殊な種類である場合、この関数ではスクリーンショットを取得できません。 GIF,JPEG,PNG画像ファイル及びLZH,ZIPファイルをアップロードできます.600 x 1200 ピクセルを超える画像は縮小表示されます(画像クリックで拡大表示). (上限122000(120k)バイト) 削除キー Link