博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
用 WPF 写的颜色拾取器
阅读量:6434 次
发布时间:2019-06-23

本文共 9629 字,大约阅读时间需要 32 分钟。

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

程序下载: 

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

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

是基于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
;
            
}
        
}

  

程序下载: 

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

你可能感兴趣的文章
iOS9 未受信任的企业级开发者
查看>>
paper 40 :鲁棒性robust
查看>>
优化MySchool数据库(事务、视图、索引)
查看>>
使用笔记:TF辅助工具--tensorflow slim(TF-Slim)
查看>>
大话设计模式读书笔记3——单例模式
查看>>
Vue 项目构建
查看>>
[Ruby on Rails系列]2、开发环境准备:Ruby on Rails开发环境配置
查看>>
android studio adb
查看>>
框架源码系列二:手写Spring-IOC和Spring-DI(IOC分析、IOC设计实现、DI分析、DI实现)...
查看>>
asp.net编译 懒人脚本
查看>>
二分答案经典入门题:)
查看>>
为什么你需要将代码迁移到ASP.NET Core 2.0?
查看>>
Servlet的多线程和线程安全
查看>>
存储树形的数据表转为Json
查看>>
CAN 总线通信控制芯片SJA1000 的读写
查看>>
oauth授权协议的原理
查看>>
OutputCache说明
查看>>
sdl2.0示例
查看>>
数学 --- 高斯消元 POJ 1830
查看>>
Ejabberd源码解析前奏--集群
查看>>