• 屏幕截图工具


    之前用win32做的屏幕截图软件V1,非常方便好用。

    在V2版本中增加了屏幕尺和颜色拾取功能,并且改用屏幕和内存DC双缓冲,彻底消灭了闪屏,可惜代码丢失了

    这是V1的代码:

    //create by luangeng 2011/11/11
    //baseed on win32
    #include <windows.h>
    #pragma comment (lib,"User32.lib")
    
    LRESULT CALLBACK WindowProcedure (HWND, UINT, WPARAM, LPARAM);
    HDC hdc;
    PAINTSTRUCT ps;
    HPEN hPen,hOldpen;
    HBRUSH hBrush,hOldbrush;  
    RECT rt;
    int ox,oy,nx,ny,sx,sy,bx,by,ax,ay;
    bool down=0;
    
    int Min(int x,int y)
    {
        if(x>y) return y;
        else return x;
    }
    int Max(int x,int y)
    {
        if(x>y) return x;
        else return y;
    }
    
    int WINAPI WinMain (HINSTANCE hThisInstance, HINSTANCE hPrevInstance,
                        LPSTR lpszArgument, int nFunsterStil)
    {
        HWND hwnd;               
        MSG messages;            
        WNDCLASSEX wincl; 
    
        wincl.hInstance = hThisInstance;
        wincl.lpszClassName = "ScreenCapture by LG";
        wincl.lpfnWndProc = WindowProcedure;     
        wincl.style = CS_NOCLOSE;                
        wincl.cbSize = sizeof (WNDCLASSEX);
        wincl.hIcon = NULL;
        wincl.hIconSm = NULL;
        wincl.hCursor = LoadCursor (NULL, IDC_ARROW);
        wincl.lpszMenuName = NULL;                 
        wincl.cbClsExtra = 0;                  
        wincl.cbWndExtra = 0;           
        wincl.hbrBackground = (HBRUSH)COLOR_WINDOWTEXT; 
    
        if (!RegisterClassEx (&wincl))  return 0;
    
        hwnd = CreateWindowEx (WS_EX_TOPMOST | WS_EX_LAYERED | WS_EX_NOACTIVATE, "ScreenCapture by LG",
                    "ScreenCapture",WS_POPUP | WS_MAXIMIZE,0,0,GetSystemMetrics(SM_CXSCREEN),
                    GetSystemMetrics(SM_CYSCREEN),HWND_DESKTOP,NULL,hThisInstance,NULL);
                    
        typedef BOOL (WINAPI *lpfn)(HWND hWnd,COLORREF cr,BYTE bAlpha,DWORD dwFlags);
        lpfn g_pSetLayeredWindowAttributes;
        HMODULE hUser32 = GetModuleHandle("USER32.DLL");
        g_pSetLayeredWindowAttributes = (lpfn)GetProcAddress(hUser32, "SetLayeredWindowAttributes");
      //  (*g_pSetLayeredWindowAttributes)(hwnd,RGB(255,255,255),200,0x01|0x02);
        for(int i=10;i<200;i+=10)
        {
                    (*g_pSetLayeredWindowAttributes)(hwnd,RGB(255,255,255),i,0x01|0x02);
                                    Sleep(10);
                                     ShowWindow (hwnd, nFunsterStil);
        }
        
       
        hdc=BeginPaint(hwnd,&ps);
        while (GetMessage (&messages, NULL, 0, 0))
        {
            TranslateMessage(&messages);
            DispatchMessage(&messages);
        }
        
        return messages.wParam;
    }
    
    LRESULT CALLBACK WindowProcedure (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
    {    
        switch (message)
        {
            case WM_LBUTTONDOWN:
                 down=1;
                 ox=LOWORD(lParam);
                 oy=HIWORD(lParam);   
                 hPen=CreatePen(PS_SOLID,1,RGB(0,250,154));
                 hOldpen=(HPEN)SelectObject(hdc,hPen);
                 hBrush=(HBRUSH)GetStockObject(BLACK_BRUSH);    
                 hOldbrush=(HBRUSH)SelectObject(hdc,hBrush);
                 GetClientRect(hwnd,&rt);
                 break;
                 
            case WM_MOUSEMOVE:
                if(down)
                {   
                    Sleep(30);
                    nx=LOWORD(lParam);
                    ny=HIWORD(lParam);
                    sx=Min(ox,nx);
                    sy=Min(oy,ny);
                    bx=Max(ox,nx);
                    by=Max(oy,ny);
                    ax=bx-sx;
                    ay=by-sy;
                    FillRect(hdc,&rt,hBrush);
                    MoveToEx(hdc,sx,oy,NULL);
                    LineTo(hdc,(ox + nx)/2-ax/6,oy);
                    MoveToEx(hdc,(ox + nx)/2+ax/6,oy,NULL);
                    LineTo(hdc, bx, oy);
                    MoveToEx(hdc,sx, ny,NULL);
                    LineTo(hdc,(ox + nx)/2-ax/6,ny);
                    MoveToEx(hdc,(ox + nx)/2+ax/6,ny,NULL);
                    LineTo(hdc,bx, ny);
                    MoveToEx(hdc,ox, sy,NULL);
                    LineTo(hdc,ox, (oy + ny) / 2 - ay / 6);
                    MoveToEx(hdc,ox,(oy+ny)/2+ay/6,NULL);
                    LineTo(hdc,ox, by);
                    MoveToEx(hdc,nx,sy,NULL);
                    LineTo(hdc,nx,(oy+ny)/2-ay/6);
                    MoveToEx(hdc,nx,(oy+ny)/2+ay/6,NULL);
                    LineTo(hdc,nx, by);
                    MoveToEx(hdc,(ox + nx)/2,0,NULL);
                    LineTo(hdc,(ox+nx)/2,sy-ay/6);
                    MoveToEx(hdc,0,(oy+ny)/2,NULL);
                    LineTo(hdc,sx - ax / 6, (oy + ny) / 2);
                    MoveToEx(hdc,bx + ax/6,(oy + ny)/2,NULL);
                    LineTo(hdc, rt.right,(oy+ny)/2);
                    MoveToEx(hdc,(ox + nx)/2,by+ay/6,NULL);
                    LineTo(hdc,(ox + nx)/2,rt.bottom);
                    MoveToEx(hdc,ax/2+sx-Min(ax,ay)/12,ay/2+sy,NULL);
                    LineTo(hdc,ax/2+sx+Min(ax,ay)/12+1,ay/2+sy);
                    MoveToEx(hdc,ax/2+sx,ay/2+sy-Min(ax,ay)/12,NULL);
                    LineTo(hdc,ax/2+sx,ay/2+sy+Min(ax,ay)/12+1); 
                } 
                break;
                
            case WM_LBUTTONUP:
               //  down=0;
                 if(ax!=0 && ay!=0)
                 {
                    hBrush=(HBRUSH)GetStockObject(WHITE_BRUSH);
                    SelectObject(hdc,hBrush);
                    Rectangle(hdc,sx-1,sy-1,bx+1,by+1);
                    
                    HDC hScrDC=GetDC(NULL);
                    HDC hMemDC=CreateCompatibleDC(NULL);
                    HBITMAP hBitmap=CreateCompatibleBitmap(hScrDC,ax,ay);
                    HBITMAP hOldBitmap=(HBITMAP)SelectObject(hMemDC,hBitmap); 
                    BitBlt(hMemDC,0,0,ax,ay,hScrDC,sx,sy,SRCCOPY);
                    hBitmap=(HBITMAP)SelectObject(hMemDC,hOldBitmap); 
                          
                    if( OpenClipboard(hwnd) )    
                    {
                        EmptyClipboard();
                        SetClipboardData(CF_BITMAP,hBitmap);
                        CloseClipboard();        
                    }
                    
                    ReleaseDC(NULL,hScrDC); 
                    DeleteDC(hMemDC);
                    DeleteObject(hBitmap);
                    DeleteObject(hOldBitmap);
                    MessageBeep(MB_ICONASTERISK);
                    EndPaint(hwnd,&ps);
                    SelectObject(hdc,hOldpen);
                    SelectObject(hdc,hOldbrush);
                    DeleteObject(hPen);
                    DeleteObject(hBrush);
                    ReleaseDC(hwnd,hdc);
                    PostQuitMessage (0);
                 }
                 else     PostQuitMessage (0);
                 break;
                 
            case WM_RBUTTONUP:
                 PostQuitMessage (0);
                 break;
                 
            case WM_KEYDOWN:     
                 if(wParam==VK_ESCAPE)   PostQuitMessage (0);
                 break;
                 
            default:                      
                 return DefWindowProc (hwnd, message, wParam, lParam);
        }
        return 0;
    }
    

    ---

    下载

      

    觉得不错,点个赞吧
  • 相关阅读:
    Spring Security 自动装配
    Mysql学习
    java 学习路线(bilibili)
    Mac上配置idea的项目上传到GitHub
    vim安装自动补全插件
    spring aop 获取request、response对象
    centos7配置本地yum源 使用安装镜像安装软件
    eclipse启动速度优化
    spring-mvc springboot 使用MockMvc对controller进行测试
    java web 验证码-字符变形(推荐)
  • 原文地址:https://www.cnblogs.com/luangeng/p/5715954.html
Copyright © 2020-2023  润新知