登录|注册
论坛 > 萌化区 > 教程/素材
发帖|看图模式| 收藏 |打赏
看2896|回0|收藏|打赏
1# 不死鸟之翼 只看他
2015-8-14 16:41:16 No. 35626009
会了编程之后你会发现许多东西可以自己折腾了)
下面介绍How to:在C++下用Windows API写个100行不到的简易屏幕取色器(编译完了可以控制在20KB以下,内存占用极小,支持RGB和十六进制颜色值)



这个东西的原理很简单,每隔250ms对屏幕截图,获取鼠标指针所在位置的像素,并显示出来。程序没有窗口,会一直运行着,使用GDI直接往屏幕上画。正因为这样,程序退出的时候界面残像还在,用别的东西遮盖一下(或者刷新)就没了。

因为擦除背景的一瞬间会闪烁,所以这里使用双缓冲技术一次性贴图。
  1. #define WIN32_LEAN_AND_MEAN
  2. #include <windows.h>
  3. #include <stdlib.h>
  4. #include <tchar.h>
  5. #include <string>
  6. #include <sstream>
  7. #include <iomanip>

  8. typedef unsigned int uint;

  9. int APIENTRY _tWinMain(HINSTANCE hInstance,
  10.                      HINSTANCE hPrevInstance,
  11.                      LPTSTR    lpCmdLine,
  12.                      int       nCmdShow)
  13. {
  14.         UNREFERENCED_PARAMETER(hPrevInstance);
  15.         UNREFERENCED_PARAMETER(lpCmdLine);

  16.         MSG msg;
  17.         SetTimer(NULL,0,250,NULL);//250毫秒执行一次定时器

  18.         //主消息循环
  19.         while (GetMessage(&msg, NULL, 0, 0))
  20.         {
  21.                 switch(msg.message){
  22.                 case WM_DESTROY:
  23.                         PostQuitMessage(0);
  24.                         break;
  25.                 case WM_TIMER:{
  26.                         static const int fontHeight=12;//字体高度
  27.                         static const int screenWidth=GetSystemMetrics(SM_CXSCREEN);//屏幕横向分辨率
  28.                         POINT mousePt;
  29.                         GetCursorPos(&mousePt);//获取鼠标指针位置
  30.                         HDC scrDc=GetDC(NULL);//获取屏幕DC
  31.                         COLORREF color=GetPixel(scrDc,mousePt.x,mousePt.y);//获取鼠标指针位置的像素
  32.                         uint rVal=GetRValue(color);
  33.                         uint gVal=GetGValue(color);
  34.                         uint bVal=GetBValue(color);

  35.                         const int rectWidth=screenWidth/4;//总绘制区域的尺寸
  36.                         const int rectHeight=fontHeight;

  37.                         HDC memDc=CreateCompatibleDC(scrDc);//内存缓冲DC
  38.                         HFONT hFont=CreateFont(fontHeight,0,0,0,0,0,0,0,0,0,0,0,0,NULL);//创建字体
  39.                         HBRUSH hBrush=CreateSolidBrush(color);//创建背景画刷
  40.                         HBITMAP hBitmap=CreateCompatibleBitmap(scrDc,rectWidth,rectHeight);//内存DC用的位图
  41.                         SelectObject(memDc,hFont);
  42.                         SelectObject(memDc,hBrush);
  43.                         SelectObject(memDc,hBitmap);

  44.                         SetTextColor(memDc,RGB(255,255,255));//设置字体颜色
  45.                         SetTextAlign(memDc,TA_TOP|TA_CENTER);//设置字体居中对齐
  46.                         SetBkColor(memDc,RGB(0,0,0));//设置字体背景颜色
  47.                         wstringstream ss;//格式化输出用的字符串流
  48.                         ss<<L"(X="<<mousePt.x<<L",Y="<<mousePt.y<<L") R="<<rVal<<L" G="<<gVal<<L" B="<<bVal<<L" #"
  49.                         <<setiosflags(ios::uppercase)<<hex<<setfill(L'0')<<setw(2)<<rVal<<setw(2)<<gVal<<setw(2)<<bVal;
  50.                         Rectangle(memDc,0,0,rectWidth,rectHeight);//绘制背景
  51.                         TextOutW(memDc,rectWidth/2,0,ss.str().c_str(),ss.str().size());//绘制文字
  52.                         BitBlt(scrDc,screenWidth/2-rectWidth/2,0,rectWidth,rectHeight,memDc,0,0,SRCCOPY);//将缓冲一次性贴到屏幕上

  53.                         DeleteObject(hFont);//销毁相关对象
  54.                         DeleteObject(hBrush);
  55.                         DeleteObject(hBitmap);
  56.                         DeleteDC(memDc);
  57.                         ReleaseDC(NULL,scrDc);
  58.                         }
  59.                         break;
  60.                 }
  61.         }

  62.         return (int) msg.wParam;
  63. }
复制代码
代码随便在Windows下找个编译器+SDK编译出来就好了,推荐DEVC++(我是拿VS,看那个宏就知道了)
懒得编译的话这里直接下载,解压得到exe双击运行。

附件: 您需要登录才可以下载或查看附件。没有帐号?注册(You must sign in before downloading or check this attachment.)(添付ファイルをダウンロード、或いは見るために、まずログインしてください。)
已有 2 人评分威望 天使币 天然 腹黑 精灵 理由
书上小 + 50 + 100 + 10 + 10 + 2 代码看着头疼。
詠緪の鰩薳§ + 20 + 20 感人~给力~

总评分: 威望 + 50  天使币 + 100  天然 + 30  腹黑 + 30  精灵 + 2   查看全部评分

天使动漫论坛|手机版错误报错

字幕组★|手机客户端

Powered by Discuz! TSDM SP

首页|标准版|精简版|电脑版

Processed in 0.072325 second(s), 13 queries .