我在C#中创建了一个简单的Winforms应用程序.当我在具有高DPI设置(例如150%)的计算机上运行应用程序时,应用程序会按比例放大.到现在为止还挺好!但是,不是使用更高的字体大小渲染字体,所有文本也只是按比例放大.这当然导致非常模糊的文本(在按钮等所有控件上).
窗户不应该正确地渲染文本吗?例如,我的应用程序的标题栏呈现清晰明了.
我正在构建一个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)
但是,此代码对于向用户仅显示正在记录的应用程序而不是在记录区域内或记录区域内的桌面部分中拖动的任何其他应用程序是必要的.此外,当我单击菜单时,它有时会显示菜单在褪色位置冻结,有时根本不显示或显示但在屏幕截图中看不到导航突出显示.
那么有什么办法可以解决这个问题吗?
类似的问题在这里被问到 屏幕捕获没有捕获我的应用程序中的对话框, 但它没有解决我的问题,因为答案使用相同的代码,我的应用程序没有采取整个桌面的截图.