110,552
社区成员
发帖
与我相关
我的任务
分享
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; }//矩形扫描完后,重头开始扫描
}
}
}