用C#实现屏幕吸色功能,附逻辑思维讲解图,功能代码不超过50行即可实现

简介: 此程序是我上学的时候写的,好几年前的事了,前几天整理硬盘文件时发现自已其实还写过很多东西,当时还没有在园子里面混,故没怎么分享,现在有时间那就给需要的朋友分享分享,我的主要实现思路是: 一、创建一个画布(即为Form),大小和当前屏幕大小一样 二、在这快画布上建立一个绘图对象,截取复制当前屏幕内...

此程序是我上学的时候写的,好几年前的事了,前几天整理硬盘文件时发现自已其实还写过很多东西,当时还没有在园子里面混,故没怎么分享,现在有时间那就给需要的朋友分享分享,我的主要实现思路是:

一、创建一个画布(即为Form),大小和当前屏幕大小一样

二、在这快画布上建立一个绘图对象,截取复制当前屏幕内容

三、用Image对象的GetThumbnailImage方法获取鼠标坐标点的方圆20像素的图像,然后以缩略图的形式将其放大,实现放大镜效果

四、利用API获取当前鼠标坐标点的像素色

五、吸色显示信息窗体实时跟踪

六、方向键微调功能,直接调用WIN的API设置鼠标坐标即可

 

先来看下吸引效果:

控件布局:

实时跟踪窗体显示模式的逻辑思维图:

始终保持吸色信息窗体保持上图所示状态(左上,右上,左下,右下),我的实现代码是这样写的:

Point p = new Point();
p.X = MousePosition.X+10;
p.Y = MousePosition.Y+10;

Size s = Screen.PrimaryScreen.Bounds.Size;

if (p.X > s.Width - this.Width)
p.X -= this.Width + 20;
if (p.Y > s.Height - this.Height)
p.Y -= this.Height + 20;

this.Location = p;

 

好了,下面附上我的全部代码:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;

namespace LR.Tools
{
///<summary>
/// LR.Tools 的摘要说明
/// 程序: LR.Tools V1.0版
/// Developer: 狼人
/// QQ:459094521 博客: http://www.cnblogs.com/waw/
/// 编写时间: 2009-01-15
///<summary>

public partial class WinEatColor : LR.Tools.MasterForm
{
Form f = new Form();
public WinEatColor()
{
f.FormBorderStyle = FormBorderStyle.None;//无边框
f.Cursor = System.Windows.Forms.Cursors.Cross;
f.WindowState = FormWindowState.Maximized;
f.Opacity = 0.01;
f.ShowInTaskbar = false;
f.Show();

InitializeComponent();
}

private void timer1_Tick(object sender, EventArgs e)
{
//鼠标的坐标
this.label1.Text = "鼠标坐标:"+MousePosition.X+","+MousePosition.Y;
//显示句柄
this.label3.Text = "句柄:" + LR.Win32API.WindowAPI.WindowFromPoint(MousePosition);
//当前窗体自动跟随鼠标
this.MoveForm();
//利用API获取当前鼠标坐标点的像素色
Color c = LR.Win32API.WindowAPI.GetColorOfScreen(MousePosition);
//显示在网页中显示的编码
this.textBox1.Text = "#"+c.Name.ToUpper().Substring(2);
//显示RGB三位色
this.txt_RGB.Text = c.R.ToString() + "," + c.G.ToString() + "," + c.B.ToString();
//设置label的颜色
this.label6.BackColor = c;
//显示放大镜
this.ShowPictureBox(MousePosition);
}

void ShowPictureBox(Point p)
{
//创建一个画布大小和当前屏幕大小一样
Bitmap bmp = new Bitmap(20,20);
//在这快画布上建立一个绘图对象
Graphics g = Graphics.FromImage(bmp);
//截取复制当前屏幕内容
g.CopyFromScreen(p.X-10, p.Y-10, 0,0, bmp.Size);
//以缩略图的形式就放大镜
Image pThumbnail = bmp.GetThumbnailImage(this.pictureBox1.Width, this.pictureBox1.Height, null, new IntPtr());
//画放大图
g.DrawImage(bmp, 10, 10, pThumbnail.Width, pThumbnail.Height);
g.Dispose();

this.pictureBox1.Image = pThumbnail;
g = Graphics.FromImage(this.pictureBox1.Image);
g.DrawRectangle(Pens.Black, this.pictureBox1.Width / 2 - 5, this.pictureBox1.Height / 2 - 5, 10, 10);
g.Dispose();
}

void MoveForm()
{
Point p = new Point();
p.X = MousePosition.X+10;
p.Y = MousePosition.Y+10;

Size s = Screen.PrimaryScreen.Bounds.Size;

if (p.X > s.Width - this.Width)
p.X -= this.Width + 20;
if (p.Y > s.Height - this.Height)
p.Y -= this.Height + 20;

this.Location = p;
}

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

private void WinEatColor_KeyUp(object sender, KeyEventArgs e)
{
if (e.KeyCode == Keys.Escape)
this.timer1.Stop();

Point pCur = MousePosition;
//方向键微调
if (e.KeyCode == Keys.Up)
LR.Win32API.WindowAPI.SetCursorPos(pCur.X, pCur.Y - 1);
if (e.KeyCode == Keys.Left)
LR.Win32API.WindowAPI.SetCursorPos(pCur.X - 1, pCur.Y);
if (e.KeyCode == Keys.Right)
LR.Win32API.WindowAPI.SetCursorPos(pCur.X + 1, pCur.Y);
if (e.KeyCode == Keys.Down)
LR.Win32API.WindowAPI.SetCursorPos(pCur.X, pCur.Y + 1);
}

private void WinEatColor_Deactivate(object sender, EventArgs e)
{
this.timer1.Stop();
}

//重拾
private void button1_Click(object sender, EventArgs e)
{
this.timer1.Start();
}

private void textBox1_MouseEnter(object sender, EventArgs e)
{
this.textBox1.Focus();
this.textBox1.SelectAll();
this.textBox1.Copy();
}

private void pictureBox1_MouseDown(object sender, MouseEventArgs e)
{
LR.Win32API.WindowAPI.MouseMoveWindow(this.Handle);
}

private void WinEatColor_FormClosed(object sender, FormClosedEventArgs e)
{
f.Close();
}
}
}


倘若还有不明白的朋友可以在评论中留言

目录
相关文章
|
9月前
|
机器学习/深度学习 算法 定位技术
Baumer工业相机堡盟工业相机如何通过YoloV8深度学习模型实现裂缝的检测识别(C#代码UI界面版)
本项目基于YOLOv8模型与C#界面,结合Baumer工业相机,实现裂缝的高效检测识别。支持图像、视频及摄像头输入,具备高精度与实时性,适用于桥梁、路面、隧道等多种工业场景。
1109 27
|
7月前
|
XML 测试技术 API
利用C#开发ONVIF客户端和集成RTSP播放功能
利用C#开发ONVIF客户端和集成RTSP播放功能
4280 123
|
缓存 C# Windows
C#程序如何编译成Native代码
【10月更文挑战第15天】在C#中,可以通过.NET Native和第三方工具(如Ngen.exe)将程序编译成Native代码,以提升性能和启动速度。.NET Native适用于UWP应用,而Ngen.exe则通过预编译托管程序集为本地机器代码来加速启动。不过,这些方法也可能增加编译时间和部署复杂度。
891 2
|
开发框架 C# iOS开发
基于C#开源、功能强大、灵活的跨平台开发框架 - Uno Platform
基于C#开源、功能强大、灵活的跨平台开发框架 - Uno Platform
607 3
|
监控 前端开发 安全
C#一分钟浅谈:文件上传与下载功能实现
【10月更文挑战第2天】在Web应用开发中,文件的上传与下载是常见需求。本文从基础入手,详细讲解如何在C#环境下实现文件上传与下载。首先介绍前端表单设计及后端接收保存方法,使用`&lt;input type=&quot;file&quot;&gt;`与`IFormFile`接口;接着探讨错误处理与优化策略,如安全性验证和路径管理;最后讲解文件下载的基本步骤,包括确定文件位置、设置响应头及发送文件流。此外,还提供了进阶技巧,如并发处理、大文件分块上传及进度监控,帮助开发者构建更健壮的应用系统。
952 16
|
传感器 IDE 测试技术
C#一分钟浅谈:Visual Studio IDE 高级功能
【10月更文挑战第24天】本文从初学者角度介绍了 Visual Studio 的高级功能,包括安装与配置、创建项目、运行与调试、常见问题及解决方案(如代码格式化、重构、导航、单元测试、代码分析),以及智能感知、Live Unit Testing、代码生成和代码片段等高级功能,帮助开发者提高效率和代码质量。
383 1
|
开发框架 Cloud Native .NET
10 个 C# 关键字和功能
10 个 C# 关键字和功能
233 8
|
C#
C# 图形验证码实现登录校验代码
C# 图形验证码实现登录校验代码
463 2
|
网络协议 Unix Linux
精选2款C#/.NET开源且功能强大的网络通信框架
精选2款C#/.NET开源且功能强大的网络通信框架
597 0
|
前端开发 程序员 API
从后端到前端的无缝切换:一名C#程序员如何借助Blazor技术实现全栈开发的梦想——深入解析Blazor框架下的Web应用构建之旅,附带实战代码示例与项目配置技巧揭露
【8月更文挑战第31天】本文通过详细步骤和代码示例,介绍了如何利用 Blazor 构建全栈 Web 应用。从创建新的 Blazor WebAssembly 项目开始,逐步演示了前后端分离的服务架构设计,包括 REST API 的设置及 Blazor 组件的数据展示。通过整合前后端逻辑,C# 开发者能够在统一环境中实现高效且一致的全栈开发。Blazor 的引入不仅简化了 Web 应用开发流程,还为习惯于后端开发的程序员提供了进入前端世界的桥梁。
2237 1