c# timer 控件运行3分钟后程序自己不动了,求大神指点

vip_keepkey 2020-08-25 03:19:37
程序目的:在屏幕取两个鼠标坐标,扫描两个坐标之间矩形范围内所有点像素是否与指点的颜色相同,如果相同报警;没有相同的,就在这个矩形范围内一直不停的反复扫描,直到程序关闭。
程序关闭为手动关闭。
程序大体功能已经能实现,问题是程序在运行3分钟后,会自动停止,而且没有报错。不知道什么原因,求大神指点。我是程序小白,刚开始学,感觉好难。
下面是程序代码

using System;
using System.Drawing;
using System.Runtime.InteropServices;
using System.Windows.Forms;

namespace 取鼠标坐标
{
public partial class Form1 : Form
{
[DllImport("user32.dll")]//取设备场景
private static extern IntPtr GetDC(IntPtr hwnd);//返回设备场景句柄
[DllImport("gdi32.dll")]//取指定点颜色
private static extern int GetPixel(IntPtr hdc, Point p);


public Form1()
{
InitializeComponent();

}

private void timer1_Tick(object sender, EventArgs e)
{
System.Media.SystemSounds.Beep.Play();//报警

}
Point p1, p2, p,pp; //第一个矩形扫描时需要的坐标变量
Point der_p1, der_p2, der_p, der_pp;//第二个矩形扫描是需要的坐标变量
private void Form1_Load(object sender, EventArgs e)
{

}

private void button7_Click(object sender, EventArgs e)
{
der_p2 = MousePosition;//取第二个扫描矩形的右下角坐标
label4.Text = "x=" + der_p2.X.ToString() + " y=" + der_p2.Y.ToString();//在label里显示出坐标值
}

private void button6_Click(object sender, EventArgs e)//第二个矩形扫描timer4开始运行
{
timer3.Stop();
timer4.Interval = 1;
timer4.Start();
der_p = der_p1 = der_pp;//der是第二个矩形的意思

ControlPaint.DrawReversibleFrame(new Rectangle(der_p .X, der_p.Y, der_p2.X - der_p.X, der_p2.Y - der_p.Y), Color.Transparent, FrameStyle.Thick);
//在屏幕上画矩形
}

private void button5_Click(object sender, EventArgs e)
{
timer3.Stop();
timer4.Stop();
}

private void timer3_Tick(object sender, EventArgs e)
{
System.Media.SystemSounds.Beep.Play();//报警
}


private void timer4_Tick(object sender, EventArgs e)
{


IntPtr hdc = GetDC(new IntPtr(0));//取到设备场景(0就是全屏的设备场景)

//扫描第二个矩形内每个坐标
if (der_p.X < der_p2.X)
{
der_p.X = der_p.X + 1;
}
else if (der_p.Y < der_p2.Y)
{
der_p1.Y = der_p1.Y + 1;
der_p = der_p1;
}
int c = GetPixel(hdc, der_p);
//取指定点颜色

if (c == 500133)//判断是否与给定的颜色相同
{

timer3.Interval = 500;//报警时钟设置为半秒报警一次
timer3.Start();//报警时钟开始连续报警
timer4.Stop();//停止扫描
}
if (c == 255)//判断是否与给定的颜色相同
{
//System.Media.SystemSounds.Beep.Play();
timer3.Interval = 500;//报警时钟设置为半秒报警一次
timer3.Start();//报警时钟开始连续报警
timer4.Stop();//停止扫描
}


textBox2.Text = der_p.X.ToString() + " " + der_p.Y.ToString() + " " + c.ToString();

if (der_p == der_p2) { der_p = der_p1 = der_pp; }//矩形扫描结束后,重新开始扫描

}



private void button1_Click(object sender, EventArgs e)
{
label1.Text = "x=" + Cursor.Position.X.ToString() + " y=" + Cursor.Position.Y.ToString();//获取第一个矩形左上角坐标
pp= p = p1 = MousePosition;
}

private void button4_Click(object sender, EventArgs e)
{

timer1.Stop();
timer2.Stop ();
}

private void button8_Click(object sender, EventArgs e)
{
der_pp = der_p = der_p1 = MousePosition;//获取第二个矩形左上角坐标
label5.Text = "x=" + der_p.X.ToString() + " y=" + der_p.Y.ToString();//将坐标值在label中显示出来
}

private void button2_Click(object sender, EventArgs e)
{
//获取第一个矩形右下角坐标,并在label中显示出来
label2.Text = "x=" + Control.MousePosition.X.ToString() + " y=" + Control.MousePosition.Y.ToString();

p2 = MousePosition;

}
private void button3_Click(object sender, EventArgs e)
{

timer1.Stop();
timer2.Interval = 1;
timer2.Start();//第一个矩形扫描时钟开始运行
p = p1 = pp;
ControlPaint.DrawReversibleFrame(new Rectangle(p.X , p.Y , p2.X-p.X , p2.Y-p.Y ), Color.Transparent, FrameStyle.Thick);
//在屏幕上画矩形



}

private void timer2_Tick(object sender, EventArgs e)
{


IntPtr hdc = GetDC(new IntPtr(0));//取到设备场景(0就是全屏的设备场景)

//扫描第一个矩形内所有坐标对应的颜色值是否与给定颜色值相同
if (p.X < p2.X)
{
p.X = p.X + 1;
}
else if (p.Y <p2.Y)
{
p1.Y = p1.Y + 1;
p = p1;
}
int c = GetPixel(hdc, p);
//取指定点颜色

if(c==500133){
//System.Media.SystemSounds.Beep.Play();
timer1.Interval = 500;
timer1.Start();//颜色相同,报警时钟开始运行
timer2.Stop();//扫描停止
}
if(c == 255)
{
//System.Media.SystemSounds.Beep.Play();
timer1.Interval = 500;
timer1.Start();//颜色相同,报警时钟开始运行
timer2.Stop();//扫描停止
}

// System.Media.SystemSounds.Beep.Play();
textBox1.Text = p.X.ToString() + " " + p.Y.ToString() +" "+ c.ToString();

if (p == p2) { p = p1 = pp; }//矩形扫描完后,重头开始扫描



}
}
}



程序界面如下图


运行界面如下图


在运行3分钟后,程序自动停止,美有报错,不知道什么原因,求大神指正
...全文
6980 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
vip_keepkey 2020-08-29
  • 打赏
  • 举报
回复
2楼给了启发,虽然不是采用加锁的方式,但也可以正常运行了,谢谢。
strife013 2020-08-25
  • 打赏
  • 举报
回复
打开异常错误,肯定报错了呀
OrdinaryCoder 2020-08-25
  • 打赏
  • 举报
回复
目前看你有两个Timer 一个Timer2 一个Timer4 在调用User32的API 应该是调用的时候发生内存冲突 试着把掉API的地方加锁
vip_keepkey 2020-08-25
  • 打赏
  • 举报
回复
在线等,编程好难啊

110,552

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧