标记windows桌面任意区域

1、整体思想,创建一个透明的顶层窗口,标记区域后,展现在屏幕上;

2、区域由rect控制,标记线的类型、颜色、粗细可以在CreatePen时进行控制效果如下:

 

注意:除了register class除外,其余的操作要在相同线程进行,跨线程操作会有无权限等问题。


#include <iostream>
#include <Windows.h>

using namespace std;

BLENDFUNCTION blendFunction;
RECT wndRect;
SIZE wndSize;
HDC hdc;
HDC memDC;
HDC screenDC;
HBITMAP memBitmap;
POINT ptSrc;
HBITMAP hOldBmp;
HPEN hPen;
HPEN hOldPen;
RECT rect = { 0, 0, 200, 100 };
HWND hwnd;
HWND hwnd1;
char szClassName[] = "DrawWindowsTest";

LRESULT CALLBACK WindowProcedure(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
    return DefWindowProc(hwnd, message, wParam, lParam);

}

int DrawImage(HWND hwnd)
{
    ::GetWindowRect(hwnd, &wndRect);
    wndSize = { wndRect.right - wndRect.left,wndRect.bottom - wndRect.top };
    hdc = ::GetDC(hwnd);
    memDC = ::CreateCompatibleDC(hdc);
    memBitmap = ::CreateCompatibleBitmap(hdc, wndSize.cx, wndSize.cy);
    hOldBmp = (HBITMAP)::SelectObject(memDC, memBitmap);
    hPen = ::CreatePen(PS_SOLID, 3, RGB(255, 0, 0));
    // 将笔选入DC
    hOldPen = (HPEN)::SelectObject(memDC, hPen);
    
    // 标记4个角
    int width = (rect.right - rect.left) / 8;
    int height = (rect.bottom - rect.top) / 8;
    int lightLength = width > height ? height : width;
    int nWidth = (rect.right - rect.left);
    int nHeight = rect.bottom - rect.top;

    //SetBkColor(memDC, RGB(255, 0, 0));
    MoveToEx(memDC, rect.left, rect.top, NULL);
    LineTo(memDC, rect.left, rect.top + lightLength);
    MoveToEx(memDC, rect.left, rect.bottom - lightLength, NULL);
    LineTo(memDC, rect.left, rect.bottom);
    LineTo(memDC, rect.left + lightLength, rect.bottom);
    MoveToEx(memDC, rect.right - lightLength, rect.bottom, NULL);
    LineTo(memDC, rect.right, rect.bottom);
    LineTo(memDC, rect.right, rect.bottom - lightLength);
    MoveToEx(memDC, rect.right, rect.top + lightLength, NULL);
    LineTo(memDC, rect.right, rect.top);
    LineTo(memDC, rect.right - lightLength, rect.top);
    MoveToEx(memDC, rect.left + lightLength, rect.top, NULL);
    LineTo(memDC, rect.left, rect.top);

    // 获取屏幕 DC
    screenDC = GetDC(NULL);
    ptSrc = { 0,0 };

    // 绘制窗口
    blendFunction.AlphaFormat = AC_SRC_ALPHA;
    blendFunction.BlendFlags = 0;
    blendFunction.BlendOp = AC_SRC_OVER;
    blendFunction.SourceConstantAlpha = 255;
    UpdateLayeredWindow(hwnd, screenDC, &ptSrc, &wndSize, memDC, &ptSrc, 0, &blendFunction, ULW_COLORKEY);

    // 清理资源
    SelectObject(memDC, hOldPen);
    SelectObject(memDC, hOldBmp);
    ::DeleteDC(memDC);
    ::DeleteObject(memBitmap);
    DeleteObject(hPen);
    ::ReleaseDC(hwnd, hdc);
    ReleaseDC(NULL, screenDC);
    return 0;
}

int CreateWindows()
{
    // 定义窗口结构
    WNDCLASSEX wincl;
    wincl.hInstance = GetModuleHandle(NULL);
    wincl.lpszClassName = szClassName;
    wincl.lpfnWndProc = WindowProcedure;
    wincl.style = CS_DBLCLKS;
    wincl.cbSize = sizeof(WNDCLASSEX);
    wincl.hIcon = NULL;
    wincl.hIconSm = NULL;
    wincl.hCursor = NULL;
    wincl.lpszMenuName = NULL;
    wincl.cbClsExtra = 0;
    wincl.cbWndExtra = 0;
    wincl.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);//(HBRUSH)COLOR_GRAYTEXT;

    // 注册窗口类
    if (!RegisterClassEx(&wincl))
    {
        printf("RegisterClassEx error : %d \n", GetLastError());
        return 0;
    }

    hwnd = CreateWindowEx(
        WS_EX_LAYERED | WS_EX_TRANSPARENT | WS_EX_NOACTIVATE | WS_EX_TOPMOST | WS_EX_TOOLWINDOW,
        szClassName,
        "DrawWindowsTest Application",
        WS_OVERLAPPEDWINDOW,
        CW_USEDEFAULT,
        CW_USEDEFAULT,
        500,
        500,
        NULL,
        NULL,
        GetModuleHandle(NULL),
        NULL
    );
    std::cout << "CreateWindows Getlasteerror:" <<GetLastError() << std::endl;

    // 使窗口在屏幕上可见
    ShowWindow(hwnd, SW_SHOW);
    LONG style = ::GetWindowLong(hwnd, GWL_STYLE);
    std::cout << "style:" << style << std::endl;
    if (style & WS_CAPTION)
        style ^= WS_CAPTION;
    if (style & WS_THICKFRAME)
        style ^= WS_THICKFRAME;
    if (style & WS_SYSMENU)
        style ^= WS_SYSMENU;
    ::SetWindowLong(hwnd, GWL_STYLE, style);
    style = ::GetWindowLong(hwnd, GWL_EXSTYLE);
    if (style & WS_EX_APPWINDOW)
        style ^= WS_EX_APPWINDOW;
    ::SetWindowLong(hwnd, GWL_EXSTYLE, style);

    return 0;
}

void RelwaseWindows()
{
    DestroyWindow(hwnd);
    HMODULE hInstance = GetModuleHandle(NULL);
    UnregisterClass(szClassName, hInstance);
}

int main()
{
    CreateWindows();
    SetWindowPos(hwnd, HWND_TOP, 10, 10, rect.right + 10, rect.bottom + 10, 0);
    //MoveWindow(hwnd, 10, 10, rect.right + 10, rect.bottom + 10, 0);
    DrawImage(hwnd);
    system("pause");
    rect.right += 100;
    rect.bottom += 100;
    SetWindowPos(hwnd, HWND_TOP, 0, 0, rect.right + 10, rect.bottom + 10, 0);
    DrawImage(hwnd);
    system("pause");

    RelwaseWindows();
    return 0;
}



评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值