会了编程之后你会发现许多东西可以自己折腾了)
下面介绍How to:在C++下用Windows API写个100行不到的简易屏幕取色器(编译完了可以控制在20KB以下,内存占用极小,支持RGB和十六进制颜色值)
这个东西的原理很简单,每隔250ms对屏幕截图,获取鼠标指针所在位置的像素,并显示出来。程序没有窗口,会一直运行着,使用GDI直接往屏幕上画。正因为这样,程序退出的时候界面残像还在,用别的东西遮盖一下(或者刷新)就没了。
因为擦除背景的一瞬间会闪烁,所以这里使用双缓冲技术一次性贴图。
- #define WIN32_LEAN_AND_MEAN
- #include <windows.h>
- #include <stdlib.h>
- #include <tchar.h>
- #include <string>
- #include <sstream>
- #include <iomanip>
- typedef unsigned int uint;
- int APIENTRY _tWinMain(HINSTANCE hInstance,
- HINSTANCE hPrevInstance,
- LPTSTR lpCmdLine,
- int nCmdShow)
- {
- UNREFERENCED_PARAMETER(hPrevInstance);
- UNREFERENCED_PARAMETER(lpCmdLine);
- MSG msg;
- SetTimer(NULL,0,250,NULL);//250毫秒执行一次定时器
- //主消息循环
- while (GetMessage(&msg, NULL, 0, 0))
- {
- switch(msg.message){
- case WM_DESTROY:
- PostQuitMessage(0);
- break;
- case WM_TIMER:{
- static const int fontHeight=12;//字体高度
- static const int screenWidth=GetSystemMetrics(SM_CXSCREEN);//屏幕横向分辨率
- POINT mousePt;
- GetCursorPos(&mousePt);//获取鼠标指针位置
- HDC scrDc=GetDC(NULL);//获取屏幕DC
- COLORREF color=GetPixel(scrDc,mousePt.x,mousePt.y);//获取鼠标指针位置的像素
- uint rVal=GetRValue(color);
- uint gVal=GetGValue(color);
- uint bVal=GetBValue(color);
- const int rectWidth=screenWidth/4;//总绘制区域的尺寸
- const int rectHeight=fontHeight;
- HDC memDc=CreateCompatibleDC(scrDc);//内存缓冲DC
- HFONT hFont=CreateFont(fontHeight,0,0,0,0,0,0,0,0,0,0,0,0,NULL);//创建字体
- HBRUSH hBrush=CreateSolidBrush(color);//创建背景画刷
- HBITMAP hBitmap=CreateCompatibleBitmap(scrDc,rectWidth,rectHeight);//内存DC用的位图
- SelectObject(memDc,hFont);
- SelectObject(memDc,hBrush);
- SelectObject(memDc,hBitmap);
- SetTextColor(memDc,RGB(255,255,255));//设置字体颜色
- SetTextAlign(memDc,TA_TOP|TA_CENTER);//设置字体居中对齐
- SetBkColor(memDc,RGB(0,0,0));//设置字体背景颜色
- wstringstream ss;//格式化输出用的字符串流
- ss<<L"(X="<<mousePt.x<<L",Y="<<mousePt.y<<L") R="<<rVal<<L" G="<<gVal<<L" B="<<bVal<<L" #"
- <<setiosflags(ios::uppercase)<<hex<<setfill(L'0')<<setw(2)<<rVal<<setw(2)<<gVal<<setw(2)<<bVal;
- Rectangle(memDc,0,0,rectWidth,rectHeight);//绘制背景
- TextOutW(memDc,rectWidth/2,0,ss.str().c_str(),ss.str().size());//绘制文字
- BitBlt(scrDc,screenWidth/2-rectWidth/2,0,rectWidth,rectHeight,memDc,0,0,SRCCOPY);//将缓冲一次性贴到屏幕上
- DeleteObject(hFont);//销毁相关对象
- DeleteObject(hBrush);
- DeleteObject(hBitmap);
- DeleteDC(memDc);
- ReleaseDC(NULL,scrDc);
- }
- break;
- }
- }
- return (int) msg.wParam;
- }
复制代码代码随便在Windows下找个编译器+SDK编译出来就好了,推荐DEVC++(我是拿VS,看那个宏就知道了)
懒得编译的话这里直接下载,解压得到exe双击运行。