• 实现一个简单的屏幕截图程序


    试了一下,对win API还是不熟悉啊,代码如下,不多说了,还是得多练练项目

    #include <windows.h>
    #include <stdlib.h>
    #include <malloc.h>
    #include <memory.h>
    #include <tchar.h>
    #define MAX_LOADSTRING 100
    
    // 全局变量: 
    HINSTANCE hInst;                                // 当前实例
    WCHAR szTitle[MAX_LOADSTRING];                  // 标题栏文本
    WCHAR szWindowClass[MAX_LOADSTRING];            // 主窗口类名
    
    RECT rect;
    HDC g_srcMemDc;
    int screenW;
    int screenH;
    
    BOOL isSelect = FALSE;
    BOOL isDown = FALSE;
    
    // 此代码模块中包含的函数的前向声明: 
    ATOM                MyRegisterClass(HINSTANCE hInstance);
    BOOL                InitInstance(HINSTANCE, int);
    LRESULT CALLBACK    WndProc(HWND, UINT, WPARAM, LPARAM);
    INT_PTR CALLBACK    About(HWND, UINT, WPARAM, LPARAM);
    void ScreenCapture();
    void CopyBitmapToCipBoard();
    
    int APIENTRY wWinMain(_In_ HINSTANCE hInstance,
        _In_opt_ HINSTANCE hPrevInstance,
        _In_ LPWSTR    lpCmdLine,
        _In_ int       nCmdShow)
    {
        UNREFERENCED_PARAMETER(hPrevInstance);
        UNREFERENCED_PARAMETER(lpCmdLine);
    
        // TODO: 在此放置代码。
    
        // 初始化全局字符串
        LoadStringW(hInstance, IDS_APP_TITLE, szTitle, MAX_LOADSTRING);
        LoadStringW(hInstance, IDC_SCREENCAPTURE, szWindowClass, MAX_LOADSTRING);
        MyRegisterClass(hInstance);
    
        // 执行应用程序初始化: 
        if (!InitInstance(hInstance, nCmdShow))
        {
            return FALSE;
        }
    
        HACCEL hAccelTable = LoadAccelerators(hInstance, MAKEINTRESOURCE(IDC_SCREENCAPTURE));
    
        MSG msg;
    
        // 主消息循环: 
        while (GetMessage(&msg, nullptr, 0, 0))
        {
            if (!TranslateAccelerator(msg.hwnd, hAccelTable, &msg))
            {
                TranslateMessage(&msg);
                DispatchMessage(&msg);
            }
        }
    
        return (int)msg.wParam;
    }
    
    
    
    //
    //  函数: MyRegisterClass()
    //
    //  目的: 注册窗口类。
    //
    ATOM MyRegisterClass(HINSTANCE hInstance)
    {
        WNDCLASSEXW wcex;
    
        wcex.cbSize = sizeof(WNDCLASSEX);
    
        wcex.style = CS_HREDRAW | CS_VREDRAW | CS_DBLCLKS;
        wcex.lpfnWndProc = WndProc;
        wcex.cbClsExtra = 0;
        wcex.cbWndExtra = 0;
        wcex.hInstance = hInstance;
        wcex.hIcon = LoadIcon(hInstance, MAKEINTRESOURCE(IDI_SCREENCAPTURE));
        wcex.hCursor = LoadCursor(nullptr, IDC_ARROW);
        wcex.hbrBackground = (HBRUSH)(COLOR_WINDOW + 1);
        wcex.lpszMenuName = 0;//MAKEINTRESOURCEW(IDC_SCREENCAPTURE);
        wcex.lpszClassName = szWindowClass;
        wcex.hIconSm = LoadIcon(wcex.hInstance, MAKEINTRESOURCE(IDI_SMALL));
    
        return RegisterClassExW(&wcex);
    }
    
    //
    //   函数: InitInstance(HINSTANCE, int)
    //
    //   目的: 保存实例句柄并创建主窗口
    //
    //   注释: 
    //
    //        在此函数中,我们在全局变量中保存实例句柄并
    //        创建和显示主程序窗口。
    //
    BOOL InitInstance(HINSTANCE hInstance, int nCmdShow)
    {
        hInst = hInstance; // 将实例句柄存储在全局变量中
    
        HWND hWnd = CreateWindowW(szWindowClass, szTitle, WS_POPUP,
            CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, nullptr, nullptr, hInstance, nullptr);
    
        if (!hWnd)
        {
            return FALSE;
        }
    
        ShowWindow(hWnd, SW_MAXIMIZE);
        UpdateWindow(hWnd);
    
        return TRUE;
    }
    
    //
    //  函数: WndProc(HWND, UINT, WPARAM, LPARAM)
    //
    //  目的:    处理主窗口的消息。
    //
    //  WM_COMMAND  - 处理应用程序菜单
    //  WM_PAINT    - 绘制主窗口
    //  WM_DESTROY  - 发送退出消息并返回
    //
    //
    LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
    {
        //透明画刷
        LOGBRUSH brush;
        brush.lbStyle = BS_NULL;
        HBRUSH hBrush = CreateBrushIndirect(&brush);
    
        //框框颜色
        LOGPEN pen;
        POINT pt;
        pt.x = 2;
        pt.y = 2;
        pen.lopnColor = 0xFF33FF;
        pen.lopnStyle = PS_SOLID;
        pen.lopnWidth = pt;
    
        HPEN hPen = CreatePenIndirect(&pen);
    
        switch (message)
        {
        case WM_LBUTTONDOWN:
            //MessageBox(hWnd, L"hh", L"jj", NULL);
        {
            if (!isSelect)
            {
                POINT pt;
                GetCursorPos(&pt);
    
                rect.left = pt.x;
                rect.top = pt.y;
                rect.right = pt.x;
                rect.bottom = pt.y;
                InvalidateRgn(hWnd, 0, true);
    
                isDown = TRUE;
            }
        }
        break;
        case WM_LBUTTONUP:
        {
            if (isDown == TRUE && !isSelect)
            {
                POINT pt;
                GetCursorPos(&pt);
    
                rect.right = pt.x;
                rect.bottom = pt.y;
                InvalidateRgn(hWnd, 0, true);
    
                isDown = FALSE;
                isSelect = TRUE;
            }
        }
        break;
        case WM_MOUSEMOVE:
            break;
        case WM_LBUTTONDBLCLK:
            if (isSelect)
            {
                CopyBitmapToCipBoard();
                isSelect = FALSE;
            }
    
            break;
    
        case WM_CREATE:
            ScreenCapture();
            break;
        case WM_COMMAND:
        {
            int wmId = LOWORD(wParam);
            // 分析菜单选择: 
            switch (wmId)
            {
            case IDM_ABOUT:
                DialogBox(hInst, MAKEINTRESOURCE(IDD_ABOUTBOX), hWnd, About);
                break;
            case IDM_EXIT:
                DestroyWindow(hWnd);
                break;
            default:
                return DefWindowProc(hWnd, message, wParam, lParam);
            }
        }
        break;
        case WM_PAINT:
        {
            PAINTSTRUCT ps;
            HDC hdc = BeginPaint(hWnd, &ps);
            SelectObject(hdc, hBrush);
            SelectObject(hdc, hPen);
            BitBlt(hdc, 0, 0, screenW, screenH, g_srcMemDc, 0, 0, SRCCOPY);
            Rectangle(hdc, rect.left, rect.top, rect.right, rect.bottom);
            EndPaint(hWnd, &ps);
        }
        break;
        case WM_DESTROY:
            PostQuitMessage(0);
            break;
        default:
            return DefWindowProc(hWnd, message, wParam, lParam);
        }
        return 0;
    }
    
    // “关于”框的消息处理程序。
    INT_PTR CALLBACK About(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
    {
        UNREFERENCED_PARAMETER(lParam);
        switch (message)
        {
        case WM_INITDIALOG:
            return (INT_PTR)TRUE;
    
        case WM_COMMAND:
            if (LOWORD(wParam) == IDOK || LOWORD(wParam) == IDCANCEL)
            {
                EndDialog(hDlg, LOWORD(wParam));
                return (INT_PTR)TRUE;
            }
            break;
        }
        return (INT_PTR)FALSE;
    }
    
    void ScreenCapture()
    {
        HDC disDc = ::CreateDC(L"display", 0, 0, 0);
    
        screenW = GetDeviceCaps(disDc, HORZRES);
        screenH = GetDeviceCaps(disDc, VERTRES);
    
        g_srcMemDc = CreateCompatibleDC(disDc);
        HBITMAP hbitMap = CreateCompatibleBitmap(disDc, screenW, screenH);
    
        SelectObject(g_srcMemDc, hbitMap);
        BitBlt(g_srcMemDc, 0, 0, screenW, screenH, disDc, 0, 0, SRCCOPY);
    
    }
    
    void CopyBitmapToCipBoard()
    {
        int width = rect.right - rect.left;
        int height = rect.bottom - rect.top;
    
        HDC hSrcDc = CreateDC(L"display", 0, 0, 0);
    
        HDC memDC = CreateCompatibleDC(hSrcDc);
        HBITMAP  hBitmap = CreateCompatibleBitmap(hSrcDc, width, height);
        HBITMAP oldmap = (HBITMAP)SelectObject(memDC, hBitmap);
    
        BitBlt(memDC, 0, 0, width, height, hSrcDc, rect.left, rect.top, SRCCOPY);
    
        HBITMAP newmap = (HBITMAP)SelectObject(memDC, oldmap);
    
        if (OpenClipboard(0))
        {
            EmptyClipboard();
            SetClipboardData(CF_BITMAP, newmap);
            CloseClipboard();
        }
    }

     实现效果如下

    呃。。。好吧

    就是直接运行,截图之后画框框,然后双击,然后ctrl+c随便粘喽

  • 相关阅读:
    根据屏幕大小,加载不同大小的图片
    规范命名CSS
    iframe框架加载完成后执行函数
    js获取IP地址
    80端口被System占用 造成Apache不能启动的解方案
    自定义一个仿Spinner
    让你的代码量减少3倍!使用kotlin开发Android(一)
    屏幕适配
    一个旋转菜单
    手势监听GestureDetector 案例
  • 原文地址:https://www.cnblogs.com/Vcanccc/p/5676253.html
Copyright © 2020-2023  润新知