C# 通过API获得屏幕某点的颜色(先转别人代码,有时间整理一下)

//  
cvs  ///   程序:屏幕取色  
///   功能:动态获取当前屏幕中光标所在位置的颜色  
///   作者:upto(阿球)  
///   邮箱:itfun@163.com  
///   日期:2004年3月31日  
//  
 
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();  
                                   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://www.cnblogs.com/XingfuStar/archive/2006/12/13/590871.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值