用 WPF 写的颜色拾取器

本文介绍了一款基于WPF的屏幕颜色拾取器应用程序,该应用能够捕捉鼠标所在位置的颜色,并通过空格键停止取色。文章分享了具体的开发过程及代码实现,包括使用全局钩子监听键盘事件的方法。

之前都是用别人的颜色拾取器,今天自己用WPF写了一个颜色拾取器小程序 拾取鼠标所在位置的颜色,按键盘上的空格键停止取色

程序下载:MyWPFScreenColorE.rar 

程序里面有一个全局的勾子实现键盘的按下事件停止拾取(有全局勾子可能会报毒 勾子总被用于木马 现在的杀软对勾子很警惕 

但是我还没有好的办法不用勾子去实现停止拾取,如果看到帖子的人有好的办法请指点一下,谢谢

是基于framework 3.5

用vs2008开发的

操作:

1点击开始取色就会根据鼠标的移动记录下鼠标下的颜色并显示在颜色预览里

2,按键盘上的空格键就会停止取色,自己复制下来RGB的值

开发思路:

1记录鼠标的坐标

2拾取鼠标下的颜色

开始上代码开发吧

记录鼠标的坐标

public  class  MyPoint
    {
        [StructLayout(LayoutKind.Sequential)]
        public  struct  POINT
        {
            public  int  X;
            public  int  Y;
            public  POINT( int  x, int  y)
            {
                this .X = x;
                this .Y = y;
            }
        }
 
        [DllImport( "user32.dll" , CharSet = CharSet.Auto)]
        public  static  extern  bool  GetCursorPos( out  POINT pt);
 
    }  

拾取颜色返回鼠标下的Color

public  class  ScreenColor
     {
         [DllImport( "user32.dll" )]
         static  extern  IntPtr GetDC(IntPtr hwnd);
 
         [DllImport( "user32.dll" )]
         static  extern  Int32 ReleaseDC(IntPtr hwnd, IntPtr hdc);
 
         [DllImport( "gdi32.dll" )]
         static  extern  uint  GetPixel(IntPtr hdc, int  nXPos, int  nYPos);
 
         static  public  System.Drawing.Color GetPixelColor( int  x, int  y)
         {
             IntPtr hdc = GetDC(IntPtr.Zero);
             uint  pixel = GetPixel(hdc, x, y);
             ReleaseDC(IntPtr.Zero, hdc);
             Color color = Color.FromArgb(( int )(pixel & 0x000000FF),
                          ( int )(pixel & 0x0000FF00) >> 8,
                          ( int )(pixel & 0x00FF0000) >> 16);
             return  color;
         }
 
     }

调用

MyPoint.POINT POINT = new  MyPoint.POINT();
MyPoint.GetCursorPos( out  POINT);  

用键盘让程序停下来我还真没有什么好办法就用了一个键盘勾子

这是一个全局的勾子实现拾取键盘的按键

//Declare wrapper managed POINT class.
    [StructLayout(LayoutKind.Sequential)]
    public  class  POINT
    {
        public  int  x;
        public  int  y;
    }
 
    //Declare wrapper managed MouseHookStruct class.
    [StructLayout(LayoutKind.Sequential)]
    public  class  MouseHookStruct
    {
        public  POINT pt;
        public  int  hwnd;
        public  int  wHitTestCode;
        public  int  dwExtraInfo;
    }
 
    //Declare wrapper managed KeyboardHookStruct class.
    [StructLayout(LayoutKind.Sequential)]
    public  class  KeyboardHookStruct
    {
        public  int  vkCode; //Specifies a virtual-key code. The code must be a value in the range 1 to 254.
        public  int  scanCode; // Specifies a hardware scan code for the key.
        public  int  flags; // Specifies the extended-key flag, event-injected flag, context code, and transition-state flag.
        public  int  time; // Specifies the time stamp for this message.
        public  int  dwExtraInfo; // Specifies extra information associated with the message.
    }
 
    public  class  GlobalHook
    {
        public  delegate  int  HookProc( int  nCode, Int32 wParam, IntPtr lParam);
 
        public  GlobalHook()
        {
            Start();
        }
 
        ~GlobalHook()
        {
            Stop();
        }
 
        public  event  MouseEventHandler OnMouseActivity;
        public  event  KeyEventHandler KeyDown;
        public  event  KeyPressEventHandler KeyPress;
        public  event  KeyEventHandler KeyUp;
 
        public  delegate  int  GlobalHookProc( int  nCode, Int32 wParam, IntPtr lParam);
 
        static  int  hMouseHook = 0; //Declare mouse hook handle as int.
        static  int  hKeyboardHook = 0; //Declare keyboard hook handle as int.
 
        //values from Winuser.h in Microsoft SDK.
        public  const  int  WH_MOUSE_LL = 14; //mouse hook constant
        public  const  int  WH_KEYBOARD_LL = 13; //keyboard hook constant
 
        GlobalHookProc MouseHookProcedure; //Declare MouseHookProcedure as HookProc type.
        GlobalHookProc KeyboardHookProcedure; //Declare KeyboardHookProcedure as HookProc type.
 
 
 
        //Import for SetWindowsHookEx function.
        //Use this function to install a hook.
        [DllImport( "user32.dll" , CharSet = CharSet.Auto, CallingConvention = CallingConvention.StdCall)]
        public  static  extern  int  SetWindowsHookEx( int  idHook, GlobalHookProc lpfn,
            IntPtr hInstance, int  threadId);
 
        //Import for UnhookWindowsHookEx.
        //Call this function to uninstall the hook.
        [DllImport( "user32.dll" , CharSet = CharSet.Auto, CallingConvention = CallingConvention.StdCall)]
        public  static  extern  bool  UnhookWindowsHookEx( int  idHook);
 
        //Import for CallNextHookEx.
        //Use this function to pass the hook information to next hook procedure in chain.
        [DllImport( "user32.dll" , CharSet = CharSet.Auto, CallingConvention = CallingConvention.StdCall)]
        public  static  extern  int  CallNextHookEx( int  idHook, int  nCode,
            Int32 wParam, IntPtr lParam);
 
        public  void  Start()
        {
            // install Mouse hook
            if  (hMouseHook == 0)
            {
                // Create an instance of HookProc.
                MouseHookProcedure = new  GlobalHookProc(MouseHookProc);
 
                try
                {
                    hMouseHook = SetWindowsHookEx(WH_MOUSE_LL,
                        MouseHookProcedure,
                        Marshal.GetHINSTANCE(
                        Assembly.GetExecutingAssembly().GetModules()[0]),
                        0);
                }
                catch  (Exception err)
                { }
 
                //If SetWindowsHookEx fails.
                if  (hMouseHook == 0)
                {
                    Stop();
                    throw  new  Exception( "SetWindowsHookEx failed." );
                }
            }
 
            // install Keyboard hook
            if  (hKeyboardHook == 0)
            {
                KeyboardHookProcedure = new  GlobalHookProc(KeyboardHookProc);
                try
                {
                    hKeyboardHook = SetWindowsHookEx(WH_KEYBOARD_LL,
                        KeyboardHookProcedure,
                        Marshal.GetHINSTANCE(
                        Assembly.GetExecutingAssembly().GetModules()[0]),
                        0);
                }
                catch  (Exception err2)
                { }
 
                //If SetWindowsHookEx fails.
                if  (hKeyboardHook == 0)
                {
                    Stop();
                    //throw new Exception("SetWindowsHookEx ist failed.");
                }
            }
        }
 
        public  void  Stop()
        {
            bool  retMouse = true ;
            bool  retKeyboard = true ;
            if  (hMouseHook != 0)
            {
                retMouse = UnhookWindowsHookEx(hMouseHook);
                hMouseHook = 0;
            }
 
            if  (hKeyboardHook != 0)
            {
                retKeyboard = UnhookWindowsHookEx(hKeyboardHook);
                hKeyboardHook = 0;
            }
 
            //If UnhookWindowsHookEx fails.
            if  (!(retMouse && retKeyboard))
            {
            }
 
                //throw new Exception("UnhookWindowsHookEx failed.");
        }
 
 
 
        private  const  int  WM_MOUSEMOVE = 0x200;
        private  const  int  WM_LBUTTONDOWN = 0x201;
        private  const  int  WM_RBUTTONDOWN = 0x204;
        private  const  int  WM_MBUTTONDOWN = 0x207;
        private  const  int  WM_LBUTTONUP = 0x202;
        private  const  int  WM_RBUTTONUP = 0x205;
        private  const  int  WM_MBUTTONUP = 0x208;
        private  const  int  WM_LBUTTONDBLCLK = 0x203;
        private  const  int  WM_RBUTTONDBLCLK = 0x206;
        private  const  int  WM_MBUTTONDBLCLK = 0x209;
 
        private  int  MouseHookProc( int  nCode, Int32 wParam, IntPtr lParam)
        {
            // if ok and someone listens to our events
            if  ((nCode >= 0) && (OnMouseActivity != null ))
            {
                MouseButtons button = MouseButtons.None;
                switch  (wParam)
                {
                    case  WM_LBUTTONDOWN:
                        //case WM_LBUTTONUP:
                        //case WM_LBUTTONDBLCLK:
                        button = MouseButtons.Left;
                        break ;
                    case  WM_RBUTTONDOWN:
                        //case WM_RBUTTONUP:
                        //case WM_RBUTTONDBLCLK:
                        button = MouseButtons.Right;
                        break ;
                }
                int  clickCount = 0;
                if  (button != MouseButtons.None)
                    if  (wParam == WM_LBUTTONDBLCLK || wParam == WM_RBUTTONDBLCLK)
                        clickCount = 2;
                    else
                        clickCount = 1;
 
                //Marshall the data from callback.
                MouseHookStruct MyMouseHookStruct =
                    (MouseHookStruct)Marshal.PtrToStructure(lParam, typeof (MouseHookStruct));
                MouseEventArgs e = new  MouseEventArgs(
                    button,
                    clickCount,
                    MyMouseHookStruct.pt.x,
                    MyMouseHookStruct.pt.y,
                    0);
                OnMouseActivity( this , e);
            }
            return  CallNextHookEx(hMouseHook, nCode, wParam, lParam);
        }
 
        //The ToAscii function translates the specified virtual-key code and keyboard state to the corresponding character or characters. The function translates the code using the input language and physical keyboard layout identified by the keyboard layout handle.
        [DllImport( "user32" )]
        public  static  extern  int  ToAscii( int  uVirtKey, //[in] Specifies the virtual-key code to be translated.
            int  uScanCode, // [in] Specifies the hardware scan code of the key to be translated. The high-order bit of this value is set if the key is up (not pressed).
            byte [] lpbKeyState, // [in] Pointer to a 256-byte array that contains the current keyboard state. Each element (byte) in the array contains the state of one key. If the high-order bit of a byte is set, the key is down (pressed). The low bit, if set, indicates that the key is toggled on. In this function, only the toggle bit of the CAPS LOCK key is relevant. The toggle state of the NUM LOCK and SCROLL LOCK keys is ignored.
            byte [] lpwTransKey, // [out] Pointer to the buffer that receives the translated character or characters.
            int  fuState); // [in] Specifies whether a menu is active. This parameter must be 1 if a menu is active, or 0 otherwise.
 
        //The GetKeyboardState function copies the status of the 256 virtual keys to the specified buffer.
        [DllImport( "user32" )]
        public  static  extern  int  GetKeyboardState( byte [] pbKeyState);
 
        private  const  int  WM_KEYDOWN = 0x100;
        private  const  int  WM_KEYUP = 0x101;
        private  const  int  WM_SYSKEYDOWN = 0x104;
        private  const  int  WM_SYSKEYUP = 0x105;
 
        private  int  KeyboardHookProc( int  nCode, Int32 wParam, IntPtr lParam)
        {
            // it was ok and someone listens to events
            if  ((nCode >= 0) && (KeyDown != null  || KeyUp != null  || KeyPress != null ))
            {
                KeyboardHookStruct MyKeyboardHookStruct =
                    (KeyboardHookStruct)Marshal.PtrToStructure(lParam,
                    typeof (KeyboardHookStruct));
                // raise KeyDown
                if  (KeyDown != null  && (wParam == WM_KEYDOWN || wParam == WM_SYSKEYDOWN))
                {
                    Keys keyData = (Keys)MyKeyboardHookStruct.vkCode;
                    KeyEventArgs e = new  KeyEventArgs(keyData);
                    KeyDown( this , e);
                }
 
                // raise KeyPress
                if  (KeyPress != null  && wParam == WM_KEYDOWN)
                {
                    byte [] keyState = new  byte [256];
                    GetKeyboardState(keyState);
 
                    byte [] inBuffer = new  byte [2];
                    if  (ToAscii(MyKeyboardHookStruct.vkCode,
                        MyKeyboardHookStruct.scanCode,
                        keyState,
                        inBuffer,
                        MyKeyboardHookStruct.flags) == 1)
                    {
                        KeyPressEventArgs e = new  KeyPressEventArgs(( char )inBuffer[0]);
                        KeyPress( this , e);
                    }
                }
 
                // raise KeyUp
                if  (KeyUp != null  && (wParam == WM_KEYUP || wParam == WM_SYSKEYUP))
                {
                    Keys keyData = (Keys)MyKeyboardHookStruct.vkCode;
                    KeyEventArgs e = new  KeyEventArgs(keyData);
                    KeyUp( this , e);
                }
            }
            return  CallNextHookEx(hKeyboardHook, nCode, wParam, lParam);
        }
    }

  

调用的时候

GlobalHook my_Hook = new  GlobalHook();
my_Hook.KeyDown += new  System.Windows.Forms.KeyEventHandler(my_Hook_KeyDown);      <br>my_Hook.Start();
 
void  my_Hook_KeyDown( object  sender, System.Windows.Forms.KeyEventArgs e)
         {
             
             if  (e.KeyCode == System.Windows.Forms.Keys.Space ) //(e.Alt || e.Control || e.Shift)
             {
                 ifStart = false ;
             }
         }

  

程序下载:MyWPFScreenColorE.rar 

 本文转自lpxxn博客园博客,原文链接:http://www.cnblogs.com/li-peng/archive/2013/03/08/2950015.html,如需转载请自行联系原作者

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值