程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> 關於.NET >> .net實現屏幕任意點顏色拾取

.net實現屏幕任意點顏色拾取

編輯:關於.NET

發現很多軟件顏色都很養眼,卻不知具體的顏色值是多少,好參考一下。於是想做個屏幕取色的東西。不過這個東西純粹是為了技術目的,用QQ就可以搞到這個顏色值,就連畫筆都可以,只不過復雜些罷了。先把效果放上來。如圖1。

圖1 Color Picker(很土啊)

做這個東西只要解決如下的兩個問題:

1.全局鼠標鉤子:做這個東西的唯一一個技術難點,雖然網上有各種C++的DLL實現方式,但是總覺得為了一個HOOK,在C#的項目裡建立一個C++的項目感覺很不爽。後來終於找到了不需要新建項目的方法。(下文介紹。)

2.獲取鼠標所在點的顏色值。對於有經驗的人來說,這個不是個問題。沒有經驗的人,Google一下,其實也不是個問題。

微軟的一篇幫助文檔上信誓旦旦地說“Global hooks are not supported in the .NET framework”。不知害得多少人繞過.NET去實現全局鉤子。可就是有人不信這個邪,做出了不需要DLL的C#實現的全局鉤子(參見此文)。雖然只限於鼠標、鍵盤鉤子,但也足夠用了。

第一個問題算是解決了。再來看第二個問題。屏幕取色。稍稍Google一下就可以知道,用Graphics對象的CopyFromScreen方法就可以了。可是Graphics是Form裡的東西,在WPF裡沒有Graphics對象啊。當然也可以再來個API調用的,不過總感覺直接調用API不好。所以想來想去,還是在這個WPF項目裡添加了對System.Drawing的引用。並把它包成了一個類。代碼如下。

PointColorPicker

1using System.Windows;
2using System.Windows.Media;
3using Bitmap = System.Drawing.Bitmap;
4using Graphics = System.Drawing.Graphics;
5using Size = System.Drawing.Size;
6
7namespace ColorPicker
8{
9  internal class PointColorPicker
10  {
11    private static Bitmap cache = new Bitmap(1, 1);
12    private static Graphics tempGraphics = Graphics.FromImage(cache);
13
14    /**//// <summary>
15    /// Gets the Color from the screen at the given point.
16    /// </summary>
17    /// <param name="point"></param>
18    /// <returns></returns>
19    public static Color GetColorFromPoint(Point point)
20    {
21      tempGraphics.CopyFromScreen((int)point.X, (int)point.Y, 0, 0, new Size(1, 1));
22
23      return cache.GetPixel(0, 0).Upgrade();
24    }
25  }
26}

完整的代碼下載

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved