procedure TForm1.Button1Click(Sender: TObject);
var
Bitmap1: TBitmap;
ScreenDC: HDC;
Rect1: TRect;
ActHwnd: HWND;
TopBuffer, LeftBuffer, WidthBuffer, HeightBuffer: Integer;
begin
Image1.Picture.Bitmap := Form1.GetFormImage;
Bitmap1 := TBitmap.Create;
try
{↓最前面のWindowHandle取得}
ActHwnd := GetForegroundWindow;
{↓取得したウィンドウが非表示or最小化されている場合は次のWindowを取得}
while (ActHwnd <> HWND(nil)) do
begin
if IsWindowVisible(ActHwnd) and (not IsIconic(ActHwnd)) then
Break;
ActHwnd := GetWindow( ActHwnd, GW_HWNDNEXT);
end;
if ActHwnd = HWND(nil) then
raise Exception.Create('Windowの取得に失敗しました');
GetWindowRect( ActHwnd, Rect1);
{↓デスクトップからはみ出す範囲を削除}
if Rect1.Left < 0 then
LeftBuffer := -(Rect1.Left)
else
LeftBuffer := 0;
if Rect1.Top < 0 then
TopBuffer := -(Rect1.Top)
else
TopBuffer := 0;
if Rect1.Right > Screen.Width then
WidthBuffer := Screen.Width - Rect1.Left - LeftBuffer
else
WidthBuffer := Rect1.Right - Rect1.Left - LeftBuffer;
if Rect1.Bottom > Screen.Height then
HeightBuffer := Screen.Height - Rect1.Top - TopBuffer
else
HeightBuffer := Rect1.Bottom - Rect1.Top - TopBuffer;
ScreenDC := GetWindowDC(ActHwnd);
Bitmap1.Width := WidthBuffer;
Bitmap1.Height := HeightBuffer;
try
GDIFlush;
BitBlt(Bitmap1.Canvas.Handle,0,0,WidthBuffer,HeightBuffer,
ScreenDC,LeftBuffer,TopBuffer,SRCCOPY);
finally
ReleaseDC(ActHwnd,ScreenDC);
end;
Image1.Picture.Bitmap.Assign(Bitmap1);
finally
Bitmap1.Free;
end;
end;
|