动态获取当前屏幕中光标所在位置的颜色
发布日期:2021-06-30 19:11:15
浏览次数:2
分类:技术文章
本文共 5103 字,大约阅读时间需要 17 分钟。
using System; using System.Drawing; using System.Collections; using System.ComponentModel; using System.Windows.Forms; using System.Data; using System.Drawing.Imaging; using System.Runtime.InteropServices; namespace LiBo.ColorPicker { /// <summary> /// Form1 的摘要说明。 /// </summary> public class Form1 : System.Windows.Forms.Form { // 桌面工作区的尺寸 Size workingArea; // Form 的初始位置和在左下角,右下角的位置 Point formLoc, ptLeftBottom, ptRightBottom; private System.Windows.Forms.Label lblColor; private System.Windows.Forms.TextBox txtArgb; private System.Windows.Forms.Timer tmr; private System.Windows.Forms.ToolTip tip; private System.ComponentModel.IContainer components; public Form1() { InitializeComponent(); this.FormBorderStyle = FormBorderStyle.FixedToolWindow; this.StartPosition = FormStartPosition.CenterScreen; Rectangle rect = SystemInformation.WorkingArea; workingArea = new Size(rect.Width, rect.Height); ptLeftBottom = new Point(0, workingArea.Height - this.Height); ptRightBottom = new Point(workingArea.Width - this.Width, workingArea.Height - this.Height); String tipMsg = "在窗体空白处双击鼠标左键开始取色,按ESC键确定颜色"; tip.SetToolTip(this, tipMsg); tip.SetToolTip(lblColor, tipMsg); tip.SetToolTip(txtArgb, tipMsg); } /// <summary> /// 清理所有正在使用的资源。 /// </summary> protected override void Dispose( bool disposing ) { if( disposing ) { if (components != null) { components.Dispose(); } } base.Dispose( disposing ); } #region Windows Form Designer generated code /// <summary> /// 设计器支持所需的方法 - 不要使用代码编辑器修改 /// 此方法的内容。 /// </summary> private void InitializeComponent() { this.components = new System.ComponentModel.Container(); this.lblColor = new System.Windows.Forms.Label(); this.tmr = new System.Windows.Forms.Timer(this.components); this.txtArgb = new System.Windows.Forms.TextBox(); this.tip = new System.Windows.Forms.ToolTip(this.components); this.SuspendLayout(); // // lblColor // this.lblColor.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle; this.lblColor.Location = new System.Drawing.Point(8, 8); this.lblColor.Name = "lblColor"; this.lblColor.TabIndex = 0; // // tmr // this.tmr.Tick += new System.EventHandler(this.tmr_Tick); // // txtArgb // this.txtArgb.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle; this.txtArgb.Font = new System.Drawing.Font("Arial", 10.5F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((System.Byte)(0))); this.txtArgb.Location = new System.Drawing.Point(8, 40); this.txtArgb.Name = "txtArgb"; this.txtArgb.TabIndex = 1; this.txtArgb.Text = ""; this.txtArgb.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.txtArgb_KeyPress); // // Form1 // this.AutoScaleBaseSize = new System.Drawing.Size(6, 14); this.ClientSize = new System.Drawing.Size(115, 70); this.Controls.Add(this.txtArgb); this.Controls.Add(this.lblColor); this.Name = "Form1"; this.Text = "屏幕取色(upto)"; this.DoubleClick += new System.EventHandler(this.Form1_DoubleClick); this.MouseEnter += new System.EventHandler(this.Form1_MouseEnter); this.ResumeLayout(false); } #endregion /// <summary> /// 应用程序的主入口点。 /// </summary> [STAThread] static void Main() { Application.Run(new Form1()); } [ DllImport ( "gdi32.dll" ) ] private static extern bool BitBlt ( IntPtr hdcDest, // 目标设备的句柄 int nXDest, // 目标对象的左上角的X坐标 int nYDest, // 目标对象的左上角的X坐标 int nWidth, // 目标对象的矩形的宽度 int nHeight, // 目标对象的矩形的长度 IntPtr hdcSrc, // 源设备的句柄 int nXSrc, // 源对象的左上角的X坐标 int nYSrc, // 源对象的左上角的X坐标 int dwRop // 光栅的操作值 ); [ DllImport ( "gdi32.dll" ) ] private static extern IntPtr CreateDC ( string lpszDriver, // 驱动名称 string lpszDevice, // 设备名称 string lpszOutput, // 无用,可以设定位"NULL" IntPtr lpInitData // 任意的打印机数据 ); private void Form1_DoubleClick(object sender, EventArgs e) { formLoc = this.Location; this.Location = ptRightBottom; this.TopMost = true; tmr.Enabled = true; } private void tmr_Tick(object sender, EventArgs e) { // 创建显示器的DC IntPtr hdlDisplay = CreateDC("DISPLAY", null, null, IntPtr.Zero); // 从指定设备的句柄创建新的 Graphics 对象 Graphics gfxDisplay = Graphics.FromHdc(hdlDisplay); // 创建只有一个象素大小的 Bitmap 对象 Bitmap bmp = new Bitmap(1, 1, gfxDisplay); // 从指定 Image 对象创建新的 Graphics 对象 Graphics gfxBmp = Graphics.FromImage(bmp); // 获得屏幕的句柄 IntPtr hdlScreen = gfxDisplay.GetHdc(); // 获得位图的句柄 IntPtr hdlBmp = gfxBmp.GetHdc(); // 把当前屏幕中鼠标指针所在位置的一个象素拷贝到位图中 BitBlt(hdlBmp, 0, 0, 1, 1, hdlScreen, MousePosition.X, MousePosition.Y, 13369376); // 释放屏幕句柄 gfxDisplay.ReleaseHdc(hdlScreen); // 释放位图句柄 gfxBmp.ReleaseHdc(hdlBmp); lblColor.BackColor = bmp.GetPixel(0, 0); // 获取像素的颜色 txtArgb.Text = "0x" + lblColor.BackColor.ToArgb().ToString("x").ToUpper(); gfxDisplay.Dispose(); gfxBmp.Dispose(); bmp.Dispose(); // 释放 bmp 所使用的资源 } private void txtArgb_KeyPress(object sender, KeyPressEventArgs e) { // 当按下ESC键时,确定所取的颜色ARGB值 // 注意:只有当窗体处于激活状态时才有效 if (e.KeyChar == (char)Keys.Escape) { tmr.Enabled = false; this.Location = formLoc; this.TopMost = false; txtArgb.SelectAll(); } } private void Form1_MouseEnter(object sender, EventArgs e) { if (this.Location == ptLeftBottom) //窗体在左下角 { this.Location = ptRightBottom; } else if (this.Location == ptRightBottom) // 窗体在右下角 { this.Location = ptLeftBottom; } } } }转载地址:https://linuxstyle.blog.csdn.net/article/details/1539832 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!
发表评论
最新留言
很好
[***.229.124.182]2024年04月25日 03时24分30秒
关于作者
喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
值得探索的 8 个机器学习 JavaScript 框架
2019-04-30
流计算框架 Flink 与 Storm 的性能对比
2019-04-30
区块链+人工智能,新经济的DNA
2019-04-30
2018年2月份GitHub上最热门的Python项目:深度学习占半壁江山
2019-04-30
学会这10种机器学习算法你才算入门
2019-04-30
15 个有意思的 JavaScript 和 CSS 库推荐! 你用过几个?
2019-04-30
技术分享 | mongo 集群连接数暴涨处理案例一则
2019-04-30
技术分享 | MySQL 会受到“Unix千年虫“的影响吗
2019-04-30
第30期:索引设计(全文索引中文处理)
2019-04-30
第40问:对进行中的 DDL 进行 kill , 到底多久能响应
2019-04-30
第41问:组提交是怎样提高性能的
2019-04-30
彻底讲懂Spring singletonBean循环依赖与三级缓存
2019-04-30
CSDN文章复制
2019-04-30
【强烈推荐】Java设计模式:怒肝代理模式,可真把我榨干了!
2019-04-30
双十一最完整记录!阿里、京东全部都有
2019-04-30
为什么说,随波逐流是成为一个数据科学英雄最大的阻碍
2019-04-30
如何度过人生艰难:魔都28岁硬核知识型美少女自救指南
2019-04-30
淘宝总裁蒋凡:今年双11淘宝推荐流量超过了搜索流量
2019-04-30
为什么一些创立才2、3年的创新公司,不赚钱却可以赴美上市?
2019-04-30
互联网大佬都是怎么找对象的?
2019-04-30