当屏幕显示缩放与布局不为100%时,使用Graphics方法CopyFromScreen截屏时会出现截屏区域不对。
//从显示窗体取句柄,
[DllImport("user32.dll")]
public static extern IntPtr GetDC(IntPtr hwnd);
//设备尺寸大小
[DllImport("gdi32.dll")]
public static extern int GetDeviceCaps(IntPtr hdc,int nIndex);
//释放设备上下文环境
[DllImport("user32.dll")]
public static extern bool ReleaseDC(IntPtr hWnd, IntPtr hDc);
//IntPtr.Zero取整个窗体
IntPtr hdc = GetDC(IntPtr.Zero);
//缩放与布局 宽度缩放百分比
double percentageX = (float)GetDeviceCaps(hdc, 118) / (float)GetDeviceCaps(hdc, 8);
//缩放与布局 高度缩放百分比
double percentageY = (float)GetDeviceCaps(hdc, 118) / (float)GetDeviceCaps(hdc, 10);
//释放设备上下文环境
ReleaseDC(IntPtr.Zero, hdc);
Rectangle rect = yourControl.ClientRectangle;
Rectangle sRect = yourControl.RectangleToScreen(rect);
Bitmap bmp = new Bitmap((int)(sRect.Width * percentageX ), (int)(sRect.Height * percentageY ));
Graphics g = Graphics.FromImage(bmp);
g.CopyFromScreen((int)(sRect.Left * percentageX ), (int)(sRect.Top * percentageY ), 0, 0, new Size((int)(yourControl.Width * percentageX ), (int)(yourControl.Height * percentageY )));
g.Dispose();