Public Class Form1 Private Sub Form1_Load() Handles Me.Load PictureBox1.SizeMode = PictureBoxSizeMode.StretchImage End Sub Private Sub Button1_Click() Handles Button1.Click MsgBox("ドラッグで領域選択") Using F As New OverlayForm() F.ShowDialog(Me) PictureBox1.Image = F.CaptureImage End Using End Sub Private Class OverlayForm Inherits Form Public CaptureImage As Image Private Dragging As Boolean Private MousePos1 As Point = Point.Empty Private MousePos2 As Point = Point.Empty Protected Overrides Sub OnMouseDown(ByVal e As MouseEventArgs) MyBase.OnMouseDown(e) Dragging = True MousePos1 = MousePosition MousePos2 = MousePosition Invalidate() End Sub Protected Overrides Sub OnMouseUp(ByVal e As MouseEventArgs) MyBase.OnMouseUp(e) MousePos2 = MousePosition Dragging = False Refresh() Dim DragArea As New Rectangle( _ Math.Min(MousePos1.X, MousePos2.X), _ Math.Min(MousePos1.Y, MousePos2.Y), _ Math.Abs(MousePos1.X - MousePos2.X), _ Math.Abs(MousePos1.Y - MousePos2.Y)) If DragArea.Width > 0 AndAlso DragArea.Height > 0 Then CaptureImage = New Bitmap(DragArea.Width, DragArea.Height) Using g = Graphics.FromImage(CaptureImage) g.CopyFromScreen(DragArea.Location, Point.Empty, _ DragArea.Size, CopyPixelOperation.SourceCopy) End Using DialogResult = System.Windows.Forms.DialogResult.OK End If Close() End Sub Protected Overrides Sub OnMouseMove(ByVal e As MouseEventArgs) MyBase.OnMouseMove(e) If Dragging Then If MousePos2 <> MousePosition Then MousePos2 = MousePosition Invalidate() End If End If End Sub Protected Overrides Sub OnPaint(ByVal e As PaintEventArgs) MyBase.OnPaint(e) If Dragging Then Dim p1 = PointToClient(MousePos1) Dim p2 = PointToClient(MousePos2) Dim area As New Rectangle( _ Math.Min(p1.X, p2.X), Math.Min(p1.Y, p2.Y), _ Math.Abs(p1.X - p2.X), Math.Abs(p1.Y - p2.Y)) ControlPaint.DrawFocusRectangle(e.Graphics, area) End If End Sub Public Sub New() DoubleBuffered = True FormBorderStyle = System.Windows.Forms.FormBorderStyle.None Dim q = Aggregate scr In Screen.AllScreens Into _ L = Min(scr.Bounds.Left), _ T = Min(scr.Bounds.Top), _ B = Max(scr.Bounds.Bottom), _ R = Max(scr.Bounds.Right) Dim area = Rectangle.FromLTRB(q.L, q.T, q.R, q.B) DialogResult = System.Windows.Forms.DialogResult.Cancel StartPosition = FormStartPosition.Manual Location = area.Location Size = area.Size Dim bmp As New Bitmap(area.Width, area.Height) Using g As Graphics = Graphics.FromImage(bmp) g.CopyFromScreen(area.Location, Point.Empty, area.Size) End Using BackgroundImage = bmp End Sub End Class End Class