發現很多軟件顏色都很養眼,卻不知具體的顏色值是多少,好參考一下。於是想做個屏幕取色的東西。不過這個東西純粹是為了技術目的,用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}
完整的代碼下載