为什么 System.Windows.Forms.Timer 在 window 全屏或大屏幕时自动停止?
Why is System.Windows.Forms.Timer stopping automatically when window is fulscreen or is large?
根据在线示例,我使用 zXing 和 aForge 库在 c# 中编写了 qrcode 网络摄像头 reader。
我在 C# 中遇到了非常奇怪的 System.Windows.Forms.Timer
行为:我将它放在 widows 窗体上,启用它,设置间隔 1 秒并附加 tick 事件处理程序。
一切似乎都正常工作,但是当我将 window 调整(放大)到特定大小,或者如果我使 window 全屏显示时,times tick 事件停止触发。当我将 window 从全屏变为正常大小时,或者当我缩小 window 大小时,计时器会自动再次启动。
我正在使用 visual studio 的以下版本:
这是我的代码:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using AForge.Video;
using AForge.Video.DirectShow;
using ZXing;
namespace QrCodeWebCamReader
{
public partial class Form1 : Form
{
FilterInfoCollection filterInfoColletion;
VideoCaptureDevice captureDevice;
public Form1()
{
InitializeComponent();
}
private void Form1_Load(object sender, EventArgs e)
{
filterInfoColletion = new FilterInfoCollection(FilterCategory.VideoInputDevice);
foreach(FilterInfo filterInfo in filterInfoColletion)
{
cboDevice.Items.Add(filterInfo.Name);
}
cboDevice.SelectedIndex = 0;
}
private void BtnStart_Click(object sender, EventArgs e)
{
captureDevice = new VideoCaptureDevice(filterInfoColletion[cboDevice.SelectedIndex].MonikerString);
captureDevice.NewFrame += CaptureDevice_NewFrame;
captureDevice.Start();
timer1.Start();
}
private void CaptureDevice_NewFrame(object sender, NewFrameEventArgs eventArgs)
{
// pictureBox.Image = (Bitmap)eventArgs.Frame.Clone();
Bitmap img = (Bitmap)eventArgs.Frame.Clone();
using (Graphics gr = Graphics.FromImage(img))
{
gr.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.AntiAlias;
Rectangle cropArea = new Rectangle(img.Width / 2 - 150, img.Height / 2 - 150, 300, 300);
gr.DrawRectangle(new Pen(Color.Red,5), cropArea);
}
pictureBox.Image = (Bitmap)img.Clone();
}
private void Form1_FormClosing(object sender, FormClosingEventArgs e)
{
timer1.Stop();
if (captureDevice.IsRunning)
{
captureDevice.Stop();
}
}
private void Timer1_Tick(object sender, EventArgs e)
{
System.Diagnostics.Debug.WriteLine("fungus");
System.Diagnostics.Debug.WriteLine(pictureBox.Image);
if(pictureBox.Image != null)
{
Rectangle cropArea = new Rectangle(pictureBox.Image.Width / 2 - 150, pictureBox.Image.Height / 2 - 150, 300, 300);
BarcodeReader barcodeReader = new BarcodeReader();
Result result = barcodeReader.Decode((Bitmap)((Bitmap)pictureBox.Image).Clone(cropArea, pictureBox.Image.PixelFormat));
picCropped.Image = (Bitmap)((Bitmap)pictureBox.Image).Clone(cropArea, pictureBox.Image.PixelFormat);
if (result != null)
{
txtQRCode.Text += result.ToString();
Console.Beep();
}
}
}
}
}
我的项目配置为使用 net framework 2.0
造成这种行为的原因是什么?我该如何防止这种情况发生?
谢谢
编辑:我能想到的关于这种行为的唯一逻辑是,也许编译器正在对生成的可执行代码进行某种优化/混淆/最小化?如何在 visual studio 社区版本的 c# windows 表单应用程序中关闭优化/混淆/最小化?
更新:此行为仅在捕获视频时发生。如果未捕获视频,则定时器不会停止。
经过广泛的研究,我已经用 System.Timers.Timer
替换了 System.Windows.Forms.Timer
并且一切都开始正常工作并且错误消失了。
我的 System.Timers.Timer
设置如下所示:
System.Timers.Timer timer1;
private void Form1_Load(object sender, EventArgs e)
{
timer1 = new System.Timers.Timer(600);
timer1.Enabled = true;
timer1.SynchronizingObject = this;
timer1.Elapsed += Timer1_Elapsed;
timer1.Start();
}
但是,我仍然没有回答原来错误的原因是什么。任何有关此问题的信息都会很棒。
根据在线示例,我使用 zXing 和 aForge 库在 c# 中编写了 qrcode 网络摄像头 reader。
我在 C# 中遇到了非常奇怪的 System.Windows.Forms.Timer
行为:我将它放在 widows 窗体上,启用它,设置间隔 1 秒并附加 tick 事件处理程序。
一切似乎都正常工作,但是当我将 window 调整(放大)到特定大小,或者如果我使 window 全屏显示时,times tick 事件停止触发。当我将 window 从全屏变为正常大小时,或者当我缩小 window 大小时,计时器会自动再次启动。
我正在使用 visual studio 的以下版本:
这是我的代码:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using AForge.Video;
using AForge.Video.DirectShow;
using ZXing;
namespace QrCodeWebCamReader
{
public partial class Form1 : Form
{
FilterInfoCollection filterInfoColletion;
VideoCaptureDevice captureDevice;
public Form1()
{
InitializeComponent();
}
private void Form1_Load(object sender, EventArgs e)
{
filterInfoColletion = new FilterInfoCollection(FilterCategory.VideoInputDevice);
foreach(FilterInfo filterInfo in filterInfoColletion)
{
cboDevice.Items.Add(filterInfo.Name);
}
cboDevice.SelectedIndex = 0;
}
private void BtnStart_Click(object sender, EventArgs e)
{
captureDevice = new VideoCaptureDevice(filterInfoColletion[cboDevice.SelectedIndex].MonikerString);
captureDevice.NewFrame += CaptureDevice_NewFrame;
captureDevice.Start();
timer1.Start();
}
private void CaptureDevice_NewFrame(object sender, NewFrameEventArgs eventArgs)
{
// pictureBox.Image = (Bitmap)eventArgs.Frame.Clone();
Bitmap img = (Bitmap)eventArgs.Frame.Clone();
using (Graphics gr = Graphics.FromImage(img))
{
gr.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.AntiAlias;
Rectangle cropArea = new Rectangle(img.Width / 2 - 150, img.Height / 2 - 150, 300, 300);
gr.DrawRectangle(new Pen(Color.Red,5), cropArea);
}
pictureBox.Image = (Bitmap)img.Clone();
}
private void Form1_FormClosing(object sender, FormClosingEventArgs e)
{
timer1.Stop();
if (captureDevice.IsRunning)
{
captureDevice.Stop();
}
}
private void Timer1_Tick(object sender, EventArgs e)
{
System.Diagnostics.Debug.WriteLine("fungus");
System.Diagnostics.Debug.WriteLine(pictureBox.Image);
if(pictureBox.Image != null)
{
Rectangle cropArea = new Rectangle(pictureBox.Image.Width / 2 - 150, pictureBox.Image.Height / 2 - 150, 300, 300);
BarcodeReader barcodeReader = new BarcodeReader();
Result result = barcodeReader.Decode((Bitmap)((Bitmap)pictureBox.Image).Clone(cropArea, pictureBox.Image.PixelFormat));
picCropped.Image = (Bitmap)((Bitmap)pictureBox.Image).Clone(cropArea, pictureBox.Image.PixelFormat);
if (result != null)
{
txtQRCode.Text += result.ToString();
Console.Beep();
}
}
}
}
}
我的项目配置为使用 net framework 2.0
造成这种行为的原因是什么?我该如何防止这种情况发生?
谢谢
编辑:我能想到的关于这种行为的唯一逻辑是,也许编译器正在对生成的可执行代码进行某种优化/混淆/最小化?如何在 visual studio 社区版本的 c# windows 表单应用程序中关闭优化/混淆/最小化?
更新:此行为仅在捕获视频时发生。如果未捕获视频,则定时器不会停止。
经过广泛的研究,我已经用 System.Timers.Timer
替换了 System.Windows.Forms.Timer
并且一切都开始正常工作并且错误消失了。
我的 System.Timers.Timer
设置如下所示:
System.Timers.Timer timer1;
private void Form1_Load(object sender, EventArgs e)
{
timer1 = new System.Timers.Timer(600);
timer1.Enabled = true;
timer1.SynchronizingObject = this;
timer1.Elapsed += Timer1_Elapsed;
timer1.Start();
}
但是,我仍然没有回答原来错误的原因是什么。任何有关此问题的信息都会很棒。