在 C# 中获取屏幕截图时出现 StackOverflowException
StackOverflowException while getting screenshots in C#
有一个方法,我截图了很多。其中:
private Bitmap GetPlayedScreen()
{
var rect = new Rectangle(Location.X, Location.Y, Width, Height);
var img = new Bitmap(rect.Width, rect.Height, PixelFormat.Format64bppArgb);
var GFX = Graphics.FromImage(img);
GFX.CopyFromScreen(rect.Left, rect.Top, 0, 0, Size);
return img;
}
我将此方法与如下代码一起使用:
GetPlayedScreen().Save(/*file_path_to_be_saved*/, ImageFormat.Jpeg);
labelFileName.Text = @"● " + file_name;
_counter += 1;
当此过程重复数百次时,出现 WhosebugException 错误。由于我无法解决这个错误,所以无法捕获并结束进程。
这是我的完整代码:
public partial class PlayedScreen : Form
{
[System.Runtime.InteropServices.DllImport("user32.dll")]
private static extern bool RegisterHotKey(IntPtr hWnd, int id, int fsModifiers, int vk);
private int _counter { get; set; } = 1;
public PlayedScreen()
{
InitializeComponent();
RegisterHotKey(Handle, 0, 0, Keys.F5.GetHashCode());
}
protected override void WndProc(ref Message m)
{
base.WndProc(ref m);
if (m.Msg == 0x0312)
{
if (_counter < 1300)
{
var file_name = DateTime.Now.ToString("yyyy-MM-dd-HH-mm-ss-fff") + ".jpg";
GetPlayedScreen().Save("D:\Test\" + file_name, ImageFormat.Jpeg);
label1.Text = @"● " + file_name;
SendKeys.SendWait("{F5}");
_counter += 1;
}
}
}
private Bitmap GetPlayedScreen()
{
var rect = new Rectangle(Location.X, Location.Y, Width, Height);
var img = new Bitmap(rect.Width, rect.Height, PixelFormat.Format64bppArgb);
var GFX = Graphics.FromImage(img);
GFX.CopyFromScreen(rect.Left, rect.Top, 0, 0, Size);
return img;
}
}
我希望 GetPlayedScreen 方法在我按 F5 时重复 1300 次,但它在大约 500 次重复时出现 WhosebugException 错误。
避免在消息处理程序中使用 SendMessage。
protected override void WndProc(ref Message m)
{
base.WndProc(ref m);
if (m.Msg == 0x0312)
{
Task.Run( () => {
for( int i=0; i<1300; i++ )
{
var file_name = DateTime.Now.ToString("yyyy-MM-dd-HH-mm-ss-fff") + ".jpg";
using( var bitmap = GetPlayedScreen())
{
bitmap.Save("D:\Test\" + file_name, ImageFormat.Jpeg)
}
// Needs some WinForms dispatch message here...
// label1.Text = @"● " + file_name;
}
});
}
}
private Bitmap GetPlayedScreen()
{
var rect = new Rectangle(Location.X, Location.Y, Width, Height);
var img = new Bitmap(rect.Width, rect.Height, PixelFormat.Format64bppArgb);
var GFX = Graphics.FromImage(img);
GFX.CopyFromScreen(rect.Left, rect.Top, 0, 0, Size);
return img;
}
有一个方法,我截图了很多。其中:
private Bitmap GetPlayedScreen()
{
var rect = new Rectangle(Location.X, Location.Y, Width, Height);
var img = new Bitmap(rect.Width, rect.Height, PixelFormat.Format64bppArgb);
var GFX = Graphics.FromImage(img);
GFX.CopyFromScreen(rect.Left, rect.Top, 0, 0, Size);
return img;
}
我将此方法与如下代码一起使用:
GetPlayedScreen().Save(/*file_path_to_be_saved*/, ImageFormat.Jpeg);
labelFileName.Text = @"● " + file_name;
_counter += 1;
当此过程重复数百次时,出现 WhosebugException 错误。由于我无法解决这个错误,所以无法捕获并结束进程。
这是我的完整代码:
public partial class PlayedScreen : Form
{
[System.Runtime.InteropServices.DllImport("user32.dll")]
private static extern bool RegisterHotKey(IntPtr hWnd, int id, int fsModifiers, int vk);
private int _counter { get; set; } = 1;
public PlayedScreen()
{
InitializeComponent();
RegisterHotKey(Handle, 0, 0, Keys.F5.GetHashCode());
}
protected override void WndProc(ref Message m)
{
base.WndProc(ref m);
if (m.Msg == 0x0312)
{
if (_counter < 1300)
{
var file_name = DateTime.Now.ToString("yyyy-MM-dd-HH-mm-ss-fff") + ".jpg";
GetPlayedScreen().Save("D:\Test\" + file_name, ImageFormat.Jpeg);
label1.Text = @"● " + file_name;
SendKeys.SendWait("{F5}");
_counter += 1;
}
}
}
private Bitmap GetPlayedScreen()
{
var rect = new Rectangle(Location.X, Location.Y, Width, Height);
var img = new Bitmap(rect.Width, rect.Height, PixelFormat.Format64bppArgb);
var GFX = Graphics.FromImage(img);
GFX.CopyFromScreen(rect.Left, rect.Top, 0, 0, Size);
return img;
}
}
我希望 GetPlayedScreen 方法在我按 F5 时重复 1300 次,但它在大约 500 次重复时出现 WhosebugException 错误。
避免在消息处理程序中使用 SendMessage。
protected override void WndProc(ref Message m)
{
base.WndProc(ref m);
if (m.Msg == 0x0312)
{
Task.Run( () => {
for( int i=0; i<1300; i++ )
{
var file_name = DateTime.Now.ToString("yyyy-MM-dd-HH-mm-ss-fff") + ".jpg";
using( var bitmap = GetPlayedScreen())
{
bitmap.Save("D:\Test\" + file_name, ImageFormat.Jpeg)
}
// Needs some WinForms dispatch message here...
// label1.Text = @"● " + file_name;
}
});
}
}
private Bitmap GetPlayedScreen()
{
var rect = new Rectangle(Location.X, Location.Y, Width, Height);
var img = new Bitmap(rect.Width, rect.Height, PixelFormat.Format64bppArgb);
var GFX = Graphics.FromImage(img);
GFX.CopyFromScreen(rect.Left, rect.Top, 0, 0, Size);
return img;
}