我在C#中创建了一个简单的Winforms应用程序.当我在具有高DPI设置(例如150%)的计算机上运行应用程序时,应用程序会按比例放大.到现在为止还挺好!但是,不是使用更高的字体大小渲染字体,所有文本也只是按比例放大.这当然导致非常模糊的文本(在按钮等所有控件上).
窗户不应该正确地渲染文本吗?例如,我的应用程序的标题栏呈现清晰明了.
可能重复:
我如何在位图中捕获屏幕?
我需要制作一个应用程序,只要按下特定按钮就可以捕获当前屏幕的快照.
我搜索了很多,但我只找到了如何捕获当前窗口.
你能帮我弄清楚如何在.NET中做到这一点吗?
我们可以通过点击打印屏幕并使用油漆保存图像来手动执行此操作.我需要做同样的事情,但我想用一个程序来做.
我正在使用GDI捕获屏幕,我注意到屏幕截图中没有包含"工具提示".这是我的基本代码:
HDC hdcDesk = GetDC(0);
HDC hdcMem = CreateCompatibleDC(hdcDesk);
HBITMAP hbmMem = CreateCompatibleBitmap(hdcDesk, 1920, 1080);
SelectObject(hdcMem, hbmMem);
StretchBlt(hdcMem, 0, 0, 1920, 1080, hdcDesk, 0, 0, 1920, 1080, SRCCOPY);
// Now save the bitmap...
Run Code Online (Sandbox Code Playgroud)
可以修复,还是应该使用其他方法捕获屏幕(GDI除外)?
编辑:
这是我拍摄的不显示工具提示的屏幕截图.

我使用以下代码截取屏幕截图:
var rc = SystemInformation.VirtualScreen;
Bitmap bmp = new Bitmap(rc.Width, rc.Height);
Graphics g = Graphics.FromImage(bmp);
g.CopyFromScreen(rc.Left, rc.Top, 0, 0, bmp.Size, CopyPixelOperation.SourceCopy);
Run Code Online (Sandbox Code Playgroud)
现在这种方法非常有效并且很容易使用,但是我总是在一些屏幕截图中遇到小的"白点".当图像大量出现时,这可能非常烦人并使图像失真.
我设法缩小了问题的范围,当我尝试截取以下图片的屏幕截图时,会发生错误:

屏幕截图的输出如下所示:

你怎么解决这个问题?出于好奇,这是如何解释的?
在我的测试环境中,屏幕截图根本没有保存.我直接使用它与以下代码:
pictureBox1.Image = bmp;
Run Code Online (Sandbox Code Playgroud)
tl; dr我试图截取屏幕截图,一些像素被白色替换并扭曲结果.
非常感谢你提前.
编辑:事实证明,位图使区域透明(白色来自表单的背景颜色,感谢发现这个消费者!)

但显然你可以在第一张照片中清楚地看到; 我不是想捕捉任何透明的内容.为什么这样做?
EDIT2:
这是我用来选择我的截图的全班:
public partial class SnippingTool : Form
{
public static Image Snip()
{
var rc = SystemInformation.VirtualScreen;
Bitmap bmp = new Bitmap(rc.Width, rc.Height);
Graphics g = Graphics.FromImage(bmp);
g.CopyFromScreen(rc.Left, rc.Top, 0, 0, bmp.Size, CopyPixelOperation.SourceCopy);
var snipper = new SnippingTool(bmp);
if (snipper.ShowDialog() == DialogResult.OK)
{
return …Run Code Online (Sandbox Code Playgroud) 我正在构建一个WinForms应用程序,通过每隔500毫秒获取一次屏幕截图来记录外部进程的步骤.我使用以下代码:
Bitmap bmp = new Bitmap(width, height,PixelFormat.Format32bppArgb);
Graphics g = Graphics.FromImage(bmp);
g.CopyFromScreen(rect.left,
rect.top,
0,
0,
new Size(width, height),
CopyPixelOperation.SourceCopy);
Run Code Online (Sandbox Code Playgroud)
代码工作正常但唯一的问题是当我从外部进程的窗口打开一个对话框时(例如,Save As...在记事本中打开对话框),屏幕截图冻结到原始窗口而不是显示对话框.
我的理论是,由于我使用以下代码来检测应用程序是否失去焦点,然后只需恢复到上次保存的屏幕截图:
if (GetForegroundWindow() != proc.MainWindowHandle) //proc is just a process from system process list by Process.GetProcessesByName()
{
return LastScreenShot;
}
[DllImport("user32.dll", CharSet = CharSet.Auto, ExactSpelling = true)]
private static extern IntPtr GetForegroundWindow();
Run Code Online (Sandbox Code Playgroud)
但是,此代码对于向用户仅显示正在记录的应用程序而不是在记录区域内或记录区域内的桌面部分中拖动的任何其他应用程序是必要的.此外,当我单击菜单时,它有时会显示菜单在褪色位置冻结,有时根本不显示或显示但在屏幕截图中看不到导航突出显示.
那么有什么办法可以解决这个问题吗?
类似的问题在这里被问到 屏幕捕获没有捕获我的应用程序中的对话框, 但它没有解决我的问题,因为答案使用相同的代码,我的应用程序没有采取整个桌面的截图.
我正在创建一个应用程序,它以一定的时间间隔拍摄桌面的屏幕截图.
代码:
String nme = "";
Bitmap printscreen = new Bitmap(Screen.PrimaryScreen.Bounds.Width,
Screen.PrimaryScreen.Bounds.Height);
Graphics graphics = Graphics.FromImage(printscreen as Image);
graphics.CopyFromScreen(0, 0, 0, 0, printscreen.Size);
nme = DateTime.Now.ToString();
printscreen.Save(@"F:\Temp\printScre.jpg", ImageFormat.Jpeg);
Run Code Online (Sandbox Code Playgroud)