Saya mengikuti program Huw Collingbourne dalam membuat program tangkapan layar dengan C#. Namun, saya memperhatikan beberapa item aneh, dan apakah saya menggunakan program yang dibuatnya atau program yang saya modifikasi melakukan hal yang sama. Secara khusus saya membuat program yang membuka jendela yang memungkinkan Anda menangkap area tersebut. Saya pikir ini ada hubungannya dengan duduk di komputer saya, tetapi perlu tahu bagaimana mengantisipasi dan memperbaikinya jika orang lain akan menggunakan program tangkapan layar saya! Jika tampilan saya untuk windows 10 diatur ke 100% saya mendapatkan sedikit lebih banyak daripada jendela yang dipilih dan jika saya mengatur tampilan ke 125% teks maka saya mendapatkan banyak area yang dipilih. Membiarkan ukuran default saya seharusnya berukuran 555, 484. tapi saya menangkap jauh lebih besar.
public partial class Form1 : Form
{
//https://docs.microsoft.com/en-us/windows/desktop/api/winuser/nf-winuser-getwindowrect
[DllImport("user32.dll")]
private static extern IntPtr GetForegroundWindow();
[DllImport("user32.dll")]
private static extern IntPtr GetDesktopWindow();
[DllImport("user32.dll")]
private static extern bool GetWindowRect(IntPtr hWnd, ref Rectangle lpRect);
//ICON info
//https://docs.microsoft.com/en-us/windows/desktop/api/winuser/nf-winuser-getcursorinfo
[DllImport("user32.dll")]
private static extern bool GetIconInfo(IntPtr hIcon, out ICONINFO piconinfo);
[DllImport("user32.dll")]
private static extern bool GetCursorInfo(out CURSORINFO pci);
public struct POINT
{
public Int32 x;
public Int32 y;
}
public struct ICONINFO
{
public bool fIcon;
public Int32 xHotspot;
public Int32 yHotspot;
public IntPtr hbmMask;
public IntPtr hbmColor;
}
public struct CURSORINFO
{
public Int32 cbSize;
public Int32 flags;
public IntPtr hCursor;
public Point ptScreenPos;
}
GrabRegionForm grabForm;
public void GrabRect(Rectangle rect)
{
int rectWidth = rect.Width - rect.Left;
int rectHeight = rect.Height - rect.Top;
Bitmap bm = new Bitmap(rectWidth, rectHeight);
Graphics g = Graphics.FromImage(bm);
g.CopyFromScreen(rect.Left, rect.Top, 0, 0, new Size(rectWidth, rectHeight));
DrawMousePointer(g, Cursor.Position.X - rect.Left, Cursor.Position.Y - rect.Top);
this.pb_screengrab.Image = bm;
Clipboard.SetImage(bm);
}
}
public partial class GrabRegionForm : Form
{
public Rectangle formRect;
private Form1 mainForm;
[DllImport("user32.dll")]
public static extern bool ReleaseCapture();
[DllImport("user32.dll")]
public static extern int SendMessage(IntPtr hWnd, int Msg, int wParam, int lParam);
private void buttonOK_Click(object sender, EventArgs e)
{
formRect = new Rectangle(this.Left, this.Top, this.Left + this.Width, this.Top + this.Height);
this.Hide();
mainForm.GrabRect(formRect);
Close();
}
}
ScreenGrab dengan Tampilan 100%
ScreenGrab dengan Tampilan 125%