Tkinter实现动态桌面宠物(标准库实现截图)

import io           #文件处理
import nt         #windows nt 库直接获取对应的磁盘空间
import time         #时间
import zlib         #加解密
import ctypes       #调用
import struct       #处理字节二进制
import base64       #编解码
import threading    #线程
import tkinter as tk    #tk
from datetime import datetime   #时间

## gif动态
class GifPlayer:
    def __init__(self, root, label_widget):
        self.root = root
        self.label_widget = label_widget
        self.frames = []
        self.frame_index = 0
        self.update_delay = 100  # 毫秒

        p1 = "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"
        p2 = "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"
        p3 = "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"
        p4 = "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"
        p5 = p2
        p6 = "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"
        p7 = p2
        p8 = p2
        p9 = "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"
        p10 = "iVBORw0KGgoAAAANSUhEUgAAAHMAAAAyCAYAAABvR+QvAAAJ3klEQVR4nO1bW1MTWxb+diedBBJQjIriDUG8DHpUxsPMVDnOlC9T8zhVluXr/DGnSqus0ZJ5mVKPzihHwSsqxQhCvAAHRz0QQkLIpZO+rHkIu+3Q3TsJYSB68r0Qeu219upevddt7wbqqKOOOuqoo46vFmRBOp2mjdanjlUikUiQqqpFBtR1nbLZrNCo4+PjRER1w9cS3AySSqWIiOjy5cs2uqqqdUPWIkoZhbvfeDxu9cZ1QwLwbrQCVgwODtLdu3eFYxhjbJ3UWTVGxx+RLHtc6USEQCCA9j0nav5eVg1d17+JFfbo8f2S9/HwyT/X/F6ltRZYDTRN22gV1gSBQKDkmLadnWs+b00Z81tBOSFcUdJrPm9N+WwiolqOiTdv/oN6e3sA8oEctAz4GRYXF5FKpRDe2uYogyGPxsZGzM3NwRfwQ5ZlgHwWumH+zikqdu3eX7PPQ4g3b97QpUuXajZuRt48owcPbq6bfqNjA/Ri+FbNPo+SSKVSNat8JDK87ro9ffZD2XM6liaaptlKN+79+F9d14v+rxZeb0EVRVFARLRWyZCmadB1HX6/35wnn89DkgrpgmEYkGUZiqKgsbFReDMGZddEp0qwuWV72WNtxtQ0jbxe79fpp6tELcZsVVXLHmvLZj0e92L3W4dhGKUH1TCEpcmyuzWRSCQomUwSAORyOUqn00X0TCZj+mYiolwuV7T7cfHiRQKATCZjXudNdN5IX3axJl3TNNI0zZRrGEbRnNZGg/X60tISZTIZMgyDACCfz1MsFivitcoFYLrelfjpw4uNi+OssDKnZkZK6iBs5y0sLGD79u1FbocHU03TEAwGi2h9fX3mhE7uijfJGxoabHT+0LPZrC123b5925QrSZJN7sTEBB0+fJipqgqfz+eqbzgcXpULXVxcFNI/ff6JZmc/o6HRj+amzWjbWV45MT0zTrlcDowxHDxwXMiTTpeuS4XGbGpqcqU1NjbarpVy0TxpyuVyNhq/5vP5bLSlpSWhXA6eRFnBE6mGhoayZFjx+Nkt+l3vnxng7n6HXvRT2859RYZ4HRmkXNaHkyd6HQ00MzNBOTWB9r1HTPpsdJLiiXkc7nLmkeDB69cvSTcyOHb0tMsYAZwySlGWWSpYt7a2AoCZWVrBF6rTC1EqloVCoSIZVlSTA2zdulVI7//xX7R5c9h2nQwZW8IhV77FxTgOdHQXXWvd1sF8sviFkyTJvFcnCFdmJBLBhw8finy1LMsMKLjRt2/fkrUPaTX0Sj7DMLBvX+ENHhoastEDgYApd3JykmRZBlDwDlYjreRLpVLYvXs3A4CBgQEbva+vD1zu8PAwcQMFg0H4/X5bqLCiVFtuZ9tWdHV+Z+PvPvIbNhb5kf5+7W904fxfi+jzsfeUz2tgrMnG19F+jH38HKFdOw856tTc3Iz52EdXfYTGPHXqlNCPd3V1udL37NnjSuvtdXYlHB0dHauSe+bMGaHckydPVhYzGQ8HzqubSHdlDQVbcOH8H23zESTMx2KufJlsynkuAwBT4ZXd56w32kUgWUje4lLQ/+fVEClZ54e+Lbyf6bqBJ08HbMt+bPwpdXX82v2FI49QJ+HKXE79RUNMLC0tIRgMmtmkrutkdY+xWAzbtm1jQKFM4MkKYwzpdBrBYBCMMcZpnFdRFCiKgpaWFpMXAGRZhmEYUBQFN27cwPnz51kl+kqShGg0itbWVteHd7Dzt8KV3Lp9L+sfuE6HDx1DwLcJ795PQM0T4ov/xR+O/cWV9+Tx0+z99BBF3r6gyMQ0Tn3/HXRDwZvIpOtcTDLQ1nagMs9i7ePF4/GK6qurV68Kx1+5csWsJVfSeM1HK6DrOj1//lwod3R01FVuJXDjHxntJwAYn3jkSB8YvEex+E/0fPjfNDb+rGwdZj6O0tjEY3o7OUTR2LQj3+j4IAHA6ER/dXXmesKpXAEKK+jEiRPrq8wK5PN5If33p8+uqn7du+to2XyM3MtEDmHMdKr5RBClzUDBNbpBVH6UKi+c6su1xPc9f9rwfm33EXEyCpRYmdFoFLOzs2W5DcZY0UOPRqPEdyiAQsOgra2NAcDU1JQpV1EU+P1+XLt2DQBw7949nD17tki2tfsxNzfHXSqAwgvH4+nc3FzZ+gaDQczPz6O9vX3DDSVEiSRMzPsLPrZY6t7dYub/E5XE4HppUuOoZCdH6GYTiQQ1NzeXJUjXdaiqajbJeZnAXa+u6+D7pKqqmqVJJpMBYwyGYSAUCrF8Pk8rY6thGPB4PCavx+MxS5d8Pg+/388AIJ1OU7k9WE3TIMtyRedwdUPFzR8u0749B0GSvQQijYcZA8zrvKAYAdw+EvPAMADm1YvoQKHlmUzFIXnK388UGlNVVcddCjfcv//lvKjTQ7p+/TqdO3eOLdeRRfRcLse3qmw7Hw8fPjTl8naiFWNjY9Td3c10Xa9I30pxqKsHfl8TAAMG2R+d7AuCSTqW0nPwy5sA2FuCDEBLSxPi8TgMQ4IXXkCyrL7l8bpOCDa2IJsVZ9JWCI3p1BAXodTuhijr5MW+08oqVRpwiHZ51gKybO+nOuHlcD8dPNojHDseeU5HDpXOUCuBMGaKSgknpFLOfcWV8pzyDP7iOG0QZzIZodxyDh2vK6iyRbBWEK7MQCBQdnarKAoCgQAuXLgA4MunBpx9uXQxSwhO58Z7+fIlH8eWTxOYsq0GVhSFfD6fKVfX9SK3XK6+sVgM4XC46m9XHj25S9HoLI786iC8zIeGoIQPM7Nl8b6bHCHD0OEL6IDRgPa95TcRnCA0ZjU3yg3nhB07dgjliuIe3ypzwkYcxgq3bEZ4yyYEfH4QZOTzQKaMOOeXt8AjF8Yp6TRUPYZPn95Rxf1XC2qmnfe1wiAVsieEvXsqW1Urt/nGxh9QMpmoSpeSuyZO1/nuhjWmZrPZorM969l8cJpzOSvmJQibn5+ncPjLqQAiQiaTQSgUqmo1S5IXos/3yoVPbqy4fboSpepMs1XGwQ9eSZJkc2vWXZP1dHkjIyN0/Phx86SClcYNvBbx0RmGeYKuelTXw/kmOkA1dm55wyA0ptNGL28vOe1kVOsmVotyuj5uW2xWfO3fhwrdbDgcLopD2WwWd+7cAVBwZ8lkkqyFejKZNH+vV8xcWFgwz8NOTU3Z5r116xaAQhZsbSNyVO16mVY4zrEWcPpOsALYjGl9g0vdaHNzc02VCaKDYIBzK9CK1Xye0BAIIp1O4+efJ8njXV3zwjAyULIqFhPVfYBrM2Y6ncbU1BTt3/+VfuS5ShARvXr1qmI+JcsQm1+Ax0MwsDpnlFdy0FQPenqcDzeXC0dmTdOIx8RvfXszl8vB5/NhenoanZ2dv6gXuI466qijjorwP+AbSqBrhV82AAAAAElFTkSuQmCC"

        ## 遍历图片
        list_name = ["p1", "p2", "p3", "p4", "p5", "p6", "p7", "p8", "p9", "p10"]
        list_str = [p1, p2, p3, p4, p5, p6, p7, p8, p9, p10]
        list_all = []
        for i in range(10):
            photo = tk.PhotoImage(name=list_name[i], data=base64.b64decode(list_str[i]))
            list_all.append(photo)

        # 获取所有帧
        self.frames = list_all

        # 初始化显示第一帧
        self.label_widget.config(image=self.frames[0])
        self.label_widget.image = self.frames[0]

        # 绑定拖动事件
        self.label_widget.bind("<ButtonPress-1>", self.on_press)
        self.label_widget.bind("<ButtonRelease-1>", self.on_button_release)

        # 开始动画
        self.play_gif()

    def play_gif(self):
        if self.frame_index < len(self.frames):
            self.label_widget.config(image=self.frames[self.frame_index])
            self.frame_index += 1
            self.root.after(self.update_delay, self.play_gif)
        else:
            self.frame_index = 0
            self.root.after(self.update_delay, self.play_gif)

    def on_press(self, event):
        # 记录鼠标按下时的位置
        self.start_x = event.x
        self.start_y = event.y
        self.initial_x = self.root.winfo_x()
        self.initial_y = self.root.winfo_y()

    def on_button_release(self, event):
        # 计算鼠标移动的距离
        delta_x = event.x - self.start_x
        delta_y = event.y - self.start_y

        # 更新窗口位置
        self.root.geometry(f'+{self.initial_x + delta_x}+{self.initial_y + delta_y}')

## 获取cpu和内存的使用率
class FILETIME(ctypes.Structure):
    _fields_ = [("dwLowDateTime", ctypes.c_ulong),
                ("dwHighDateTime", ctypes.c_ulong)]


class SYSTEMTIME(ctypes.Structure):
    _fields_ = [("wYear", ctypes.c_ushort),
                ("wMonth", ctypes.c_ushort),
                ("wDayOfWeek", ctypes.c_ushort),
                ("wDay", ctypes.c_ushort),
                ("wHour", ctypes.c_ushort),
                ("wMinute", ctypes.c_ushort),
                ("wSecond", ctypes.c_ushort),
                ("wMilliseconds", ctypes.c_ushort)]


class MEMORYSTATUSEX(ctypes.Structure):
    _fields_ = [("dwLength", ctypes.c_ulong),
                ("dwMemoryLoad", ctypes.c_ulong),
                ("ullTotalPhys", ctypes.c_ulonglong),
                ("ullAvailPhys", ctypes.c_ulonglong),
                ("ullTotalPageFile", ctypes.c_ulonglong),
                ("ullAvailPageFile", ctypes.c_ulonglong),
                ("ullTotalVirtual", ctypes.c_ulonglong),
                ("ullAvailVirtual", ctypes.c_ulonglong),
                ("ullAvailExtendedVirtual", ctypes.c_ulonglong)]
## 调用dll
kernel32 = ctypes.windll.kernel32

## 获取cpu使用率
def get_cpu_usage():
    def get_cpu_times():
        idle_time = FILETIME()
        kernel_time = FILETIME()
        user_time = FILETIME()
        kernel32.GetSystemTimes(ctypes.byref(idle_time), ctypes.byref(kernel_time), ctypes.byref(user_time))
        return (idle_time, kernel_time, user_time)

    def filetime_to_seconds(ft):
        return (ft.dwHighDateTime * 0x100000000 + ft.dwLowDateTime) / 1e7
    (idle1, kernel1, user1) = get_cpu_times()
    time.sleep(1)
    (idle2, kernel2, user2) = get_cpu_times()

    idle_diff = filetime_to_seconds(idle2) - filetime_to_seconds(idle1)
    system_diff = (filetime_to_seconds(kernel2) - filetime_to_seconds(kernel1)) + \
                  (filetime_to_seconds(user2) - filetime_to_seconds(user1))

    return float("{:.1f}".format((1.0 - idle_diff / system_diff) * 100.0))

## 获取内存使用率
def get_memory_usage():
    mem_info = MEMORYSTATUSEX()
    mem_info.dwLength = ctypes.sizeof(MEMORYSTATUSEX)
    kernel32.GlobalMemoryStatusEx(ctypes.byref(mem_info))
    return float(mem_info.dwMemoryLoad)

## 启动tk的gui
def main():
    top = tk.Tk()
    top.title("GIF 动画播放器")
    top.overrideredirect(True)  # 无边框
    bg_color = '#FFFFF1'
    top.config(bg=bg_color)  # 背景色
    top.wm_attributes('-transparentcolor', bg_color)
    top.wm_attributes("-topmost", True)  # 窗口置顶
    top.attributes('-alpha', 1)  # 设置透明度,0.0 完全透明,1.0 完全不透明

    # 获取屏幕宽度和高度
    screen_width = top.winfo_screenwidth()
    screen_height = top.winfo_screenheight()

    # 窗口大小为300x200
    window_width = 300
    window_height = 200

    # 计算窗口位置,使其出现在右下角
    x_position = screen_width - window_width
    y_position = screen_height - window_height

    # 设置窗口的初始位置和大小
    top.geometry(f'{window_width}x{window_height}+{int(x_position)}+{int(y_position)}')

    # 创建Label来显示GIF
    label = tk.Label(top, bg=bg_color)
    label.pack(expand=True, fill='both')  # 确保Label填充整个窗口

    # 初始化GifPlayer
    GifPlayer(top,label)

    # 显示时间的Label
    time_label = tk.Label(top, bg=bg_color, fg='white', font=('Arial', 12))
    time_label.place(x=window_width // 2 - 50, y=50)

    ## 更新时间
    def update_time():
        # 获取当前时间并格式化为 时:分:秒
        current_time = datetime.now().strftime('%H:%M:%S')
        # 更新时间标签的文本
        time_label.config(text=current_time)
        # 每秒调用一次自己以更新时间
        top.after(1000, update_time)
    update_time()

    ## 状态显示
    status_show = tk.Label(top, bg=bg_color, fg='white', font=('Arial', 10))
    status_show.place(x=window_width // 2 +60 , y=55)
    ## 更新状态
    def update_status_show():
        def update_status():
            ## 状态更新
            cpu_status = get_cpu_usage()
            memory_status = get_memory_usage()
            total, free = nt._getdiskusage('C:/')
            disk_status =  free / (2 ** 30)
            ## 颜表情表现
            list_emote = ["(^▽^)","(⊙_⊙)","(一_一)","(一_一)!","(╥_╥)"]
            if 0<=cpu_status<20:
                string_status = list_emote[0]
            elif 20<=cpu_status<40:
                string_status = list_emote[1]
            elif 40<=cpu_status<60:
                string_status = list_emote[2]
            elif 60<=cpu_status<80:
                string_status = list_emote[3]
            elif 80<=cpu_status<=100:
                string_status = list_emote[4]
            status_text = "CPU:{0:.1f}%\n内存:{1:.1f}%\n磁盘C:{2:.1f}G\n{3}\n".format(cpu_status,memory_status,disk_status,string_status)
            # 更新文本
            status_show.config(text=status_text)
        status_thread = threading.Thread(target=update_status)
        # 启动线程
        status_thread.start()
        # 自调用更新
        top.after(2000, update_status_show)
    ## 状态更新
    update_status_show()

    ## 点击处理
    def on_button_click():
        def screenshot():
            s = time.time()
            # 加载GDI32和User32库
            gdi32 = ctypes.windll.gdi32
            user32 = ctypes.windll.user32

            # 定义常量
            SM_CXSCREEN = 0
            SM_CYSCREEN = 1

            # 缩放比例
            zoom = 1
            screenWidth = int(user32.GetSystemMetrics(SM_CXSCREEN) * zoom)
            screenHeight = int(user32.GetSystemMetrics(SM_CYSCREEN) * zoom)

            # 屏幕截取
            def capture_screen(x, y, width, height):

                # 获取桌面窗口句柄
                hwnd = user32.GetDesktopWindow()
                # 获取桌面窗口的设备上下文
                hdc_src = user32.GetDC(hwnd)

                if len(str(hdc_src)) > 16:
                    return 0

                # 创建一个与屏幕兼容的内存设备上下文
                hdc_dest = gdi32.CreateCompatibleDC(hdc_src)

                # 创建一个位图
                bmp = gdi32.CreateCompatibleBitmap(hdc_src, width, height)

                # # 将位图选入内存设备上下文
                old_bmp = gdi32.SelectObject(hdc_dest, bmp)

                # 定义SRCCOPY常量
                SRCCOPY = 0x00CC0020
                # 捕获屏幕
                gdi32.BitBlt(hdc_dest, 0, 0, width, height, hdc_src, x, y, SRCCOPY)
                """
                    gdi32.BitBlt(hdc_src,  # 目标设备上下文
                             x_dest,   # 目标矩形左上角的x坐标
                             y_dest,   # 目标矩形左上角的y坐标
                             width,    # 宽度
                             height,   # 高度
                             hdc_dest, # 源设备上下文
                             x_src,    # 源矩形左上角的x坐标(通常是0)
                             y_src,    # 源矩形左上角的y坐标(通常是0)
                             SRCCOPY)  # 复制选项
                """

                ## 这里是复制bmp图片内存对象
                # 加载必要的 Windows API 函数
                user32_1 = ctypes.windll.user32
                kernel32_1 = ctypes.windll.kernel32
                # 定义常量
                CF_BITMAP = 2

                # 打开剪贴板
                def OpenClipboard(hwnd):
                    return user32_1.OpenClipboard(hwnd)

                # 关闭剪贴板
                def CloseClipboard():
                    return user32_1.CloseClipboard()

                # 清空剪贴板
                def EmptyClipboard():
                    return user32_1.EmptyClipboard()

                # 设置剪贴板数据
                def SetClipboardData(uFormat, hData):
                    return user32_1.SetClipboardData(uFormat, hData)

                # 全局分配内存
                def GlobalAlloc(uFlags, dwBytes):
                    return kernel32_1.GlobalAlloc(uFlags, dwBytes)

                # 全局锁定内存
                def GlobalLock(hMem):
                    return kernel32_1.GlobalLock(hMem)

                # 全局解锁内存
                def GlobalUnlock(hMem):
                    return kernel32_1.GlobalUnlock(hMem)

                # 将图片复制到剪贴板
                def copy_bmp_to_clipboard():
                    hwnd = 0  # 可以传递 NULL(0)作为 hwnd
                    if OpenClipboard(hwnd):
                        try:
                            EmptyClipboard()
                            SetClipboardData(CF_BITMAP, bmp)  # CF_BITMAP = 2
                        finally:
                            CloseClipboard()

                copy_bmp_to_clipboard()

                # 定义 RGBQUAD 结构体
                class RGBQUAD(ctypes.Structure):
                    _fields_ = [("rgbBlue", ctypes.c_ubyte),
                                ("rgbGreen", ctypes.c_ubyte),
                                ("rgbRed", ctypes.c_ubyte),
                                ("rgbReserved", ctypes.c_ubyte)]

                # 定义 BITMAPINFOHEADER 结构体
                class BITMAPINFOHEADER(ctypes.Structure):
                    _fields_ = [("biSize", ctypes.c_uint),
                                ("biWidth", ctypes.c_int),
                                ("biHeight", ctypes.c_int),
                                ("biPlanes", ctypes.c_ushort),
                                ("biBitCount", ctypes.c_ushort),
                                ("biCompression", ctypes.c_uint),
                                ("biSizeImage", ctypes.c_uint),
                                ("biXPelsPerMeter", ctypes.c_int),
                                ("biYPelsPerMeter", ctypes.c_int),
                                ("biClrUsed", ctypes.c_uint),
                                ("biClrImportant", ctypes.c_uint)]

                # 定义 BITMAPINFO 结构体
                class BITMAPINFO(ctypes.Structure):
                    _fields_ = [("bmiHeader", BITMAPINFOHEADER),
                                ("bmiColors", RGBQUAD * 3)]  # 只分配了3个RGBQUAD的空间

                BI_RGB = 0
                DIB_RGB_COLORS = 0

                # 分配像素数据缓冲区(这里以24位位图为例,每个像素3字节)
                pixel_data = (ctypes.c_ubyte * (width * height * 3))()  # 4
                # 转换bytes
                # pixel_data = memoryview(pixel_data).tobytes()

                # 填充 BITMAPINFO 结构体
                bmi = BITMAPINFO()
                bmi.bmiHeader.biSize = ctypes.sizeof(BITMAPINFOHEADER)
                bmi.bmiHeader.biWidth = width
                bmi.bmiHeader.biHeight = -height  # 注意:负高度表示自底向上的位图
                bmi.bmiHeader.biPlanes = 1
                bmi.bmiHeader.biBitCount = 24  # 24即3*8   32
                bmi.bmiHeader.biCompression = BI_RGB  # 无压缩

                # 调用 GetDIBits 获取像素数据
                ret = gdi32.GetDIBits(hdc_src, bmp, 0, height, pixel_data, ctypes.byref(bmi), DIB_RGB_COLORS)
                if ret == 0:
                    print("GetDIBits failed:", ctypes.WinError())

                print("复制:",time.time() - s)
                # 像素色彩换位置
                mv = (memoryview(pixel_data).cast('B'))
                # b_stream = bytearray(width * (height+1) * 3)
                print("像素点:",len(mv))

                b_stream = bytearray()
                k = 0
                # for i in range(0, len(mv), 3):
                #     if i % (width*3) == 0:
                #         # b_stream[k] = 0
                #         k += 1
                #     b_stream[k] = mv[i + 2]
                #     b_stream[k + 1] = mv[i + 1]
                #     b_stream[k + 2] = mv[i]
                #     k+=3

                for i in range(0, len(mv), 3):  # 4
                    if i % (width * 3) == 0:
                        b_stream.append(0)
                        k += 1
                    b_stream.append(mv[i + 2])
                    b_stream.append(mv[i + 1])
                    b_stream.append(mv[i])
                    # b_stream.extend([mv[i + 2],mv[i + 1],mv[i]])
                    k += 3
                    # b_stream.append(mv[i+2])
                    # b_stream.append(mv[i+1])
                    # b_stream.append(mv[i+0])
                    # b_stream.append(mv[i+3])
                    # k+=4
                # print(b_stream)

                print("置换:",time.time() - s)

                def crc32(data):  # 字节流
                    crc = zlib.crc32(data)
                    return crc

                def crc32_b(data):
                    crc = zlib.crc32(data).to_bytes(4, byteorder='big')
                    return crc

                # png图片标识符
                png_signature = b"\x89PNG\r\n\x1a\n"
                # IHDR块
                ihdr = struct.pack("!IIBBBBB", width, height, 8, 2, 0, 0, 0)  # 8 6 0 0 0
                # IHDR的CRC验证
                mid = crc32_b(b"IHDR" + ihdr)
                # 压缩图片数据
                bd = zlib.compress(bytes(b_stream))
                # IDAT的CRC验证
                crc_bytes = crc32_b(bd)
                idat_chunk = b"IDAT" + bd + crc_bytes
                # IEND块
                iend = b"\x00\x00\x00\x00IEND"
                # IEND的CRC验证
                crc_end = crc32_b(b"IEND")
                iend += crc_end

                # 写入图片操作,使用BytesIO来构建PNG
                png_io = io.BytesIO()
                png_io.write(png_signature + b"\x00\x00\x00\rIHDR" + ihdr + mid)
                idat_header = struct.pack("!I", len(bd))
                png_io.write(idat_header + idat_chunk)
                png_io.write(iend)

                # 一次性写入文件
                with open("photo.png", "wb") as f:
                    f.write(png_io.getvalue())

                # 恢复设备上下文
                gdi32.SelectObject(hdc_dest, old_bmp)
                # 删除内存设备上下文
                gdi32.DeleteDC(hdc_dest)
                # 释放桌面窗口的设备上下文
                user32.ReleaseDC(hwnd, hdc_src)
                # bmp已经被处理,现在删除它
                gdi32.DeleteObject(bmp)

            # 进行截图
            for i in range(10):
                x = capture_screen(0, 0, screenWidth, screenHeight)
                if x != 0:
                    break
            print("完成:",time.time() - s)

        status_thread = threading.Thread(target=screenshot)
        # 启动线程
        status_thread.start()
    # 创建按钮,并绑定事件处理函数
    button = tk.Button(top, text="截图", command=on_button_click,bg=bg_color,fg="#FFFFFF")
    button.place(x=window_width // 2 +80 , y=25)

    top.mainloop()

if __name__ == "__main__":
    main()
import io           #文件处理
import nt			#windows nt 库直接获取对应的磁盘空间
import time         #时间
import zlib         #加解密
import ctypes       #调用
import struct       #处理字节二进制
import base64       #编解码
import threading    #线程
import tkinter as tk    #tk
from datetime import datetime   #时间

## gif动态
class GifPlayer:
    def __init__(self, root, label_widget):
        self.root = root
        self.label_widget = label_widget
        self.frames = []
        self.frame_index = 0
        self.update_delay = 100  # 毫秒

        p1 = "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"
        p2 = "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"
        p3 = "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"
        p4 = "iVBORw0KGgoAAAANSUhEUgAAAHMAAAAyCAYAAABvR+QvAAAKAUlEQVR4nO1b3XMT1xX/3ZVWkiXbYIRtcPgwBvNRQhIooe1Mmnb60uljZxiG1/5jdAZmmIYBXjqBJC0lYCABBzwUO7YgsR0oSWxZSLal1a52954+yHez8u5erSzHFkS/F8t77jn37J695+veBdpoo4022mijjdcW5EKpVKLN1qeNNaJQKJBpmjUGtG2byuWy1KiTk5NERG3DtxKCDFIsFomI6MKFCx66aZptQ7Yi6hlFuN98Pu/2xm1DAohutgJu3Llzh27cuCEdwxhjG6TOmjE+eY9UNRJIJyIkEgkM7n6v5e9lzbBt+41YYfe+uFX3Pu5++c91v1dlvQU2A8uyNluFdUEikag7ZmDn/nWft6WM+aYgTAjX9dK6z9tSPpuIqJVj4rVrV+nUqRMAxUA+WibiDIuLiygWi0hvH/CVwVBBMpnE/Pw8Yok4VFUFKOaic+e3oZt4a9e+ln0eUjx9+pTOnz/fsnEz8/QB3b59bcP0G58YoYdj11v2edRFsVhsWeUzmbEN1+3+g09Cz+lbmliW5SndhPcTf23brvm/WUSjVVV0XQcR0XolQ5ZlwbZtxONxZ55KpQJFqaYLnHOoqgpd15FMJqU3w6m8Ljo1gq09faHHeoxpWRZFo9HX0083iVaM2aZphh7ryWYjkeBi900H57z+oBaGtDRZcbcOCoUCLS0tEQAYhkGlUqmGrmma45uJiAzDqNn9OHfuHAGApmnOddFEF430FRfr0C3LIsuyHLmc85o53Y0G9/Xl5WXSNI045wQAlUqFcrlcDa9bLgDH9a7Gdy8ebl4cZ9WVOfP8cV0dpO28V69eoa+vr8btiGBqWRZSqVQN7cqVK86Efu5KNMk7Ojo8dPHQy+WyJ3Z9+umnjlxFUTxyp6am6PDhw8w0TcRisUB90+n0mlzo4uKilP79D9/R3NwP6EjG0d21FQM7w5UTs88nyTAMMMZw8MC7Up5SqX5dKjVmV1dXIC2ZTHqu1XPRImkyDMNDE9disZiHtry8LJUrIJIoN0Qi1dHREUqGG188uE6/O/UXBgS739GHN2lg594aQ3yduUNGOYbj753yNdDz51NkmAUM7jni0Oey05QvLODwsD+Pggi+/voR2VzDsbc/CBgjgV9GKcsy6wXr/v5+AHAySzfEQvV7IerFss7OzhoZbjSTA2zfvl1Kv/n5v2jr1rTnOnEV29KdgXyLi3kcGDpac62/d4jFVPkLpyiKc69+kK7MTCaDFy9e1PhqVVUZUHWjz549I3cf0m3o1Xycc+zdW32DR0dHPfREIuHInZ6eJlVVAVS9g9tIq/mKxSJ27drFAGBkZMRDv3LlCoTcsbExEgZKpVKIx+OeUOFGvbbczoHtGN7/jof/6JHfsInM5/SPS3+ns2f+VkNfyH1LlYoFxro8fEODx9jLHzL01s5Dvjp1d3djIfcyUB+pMU+ePCn148PDw4H03bt3B9JOnfJ3JQJDQ0Nrkvvhhx9K5R4/fryxmMlEOPBf3UR2IGtnqgdnz/zRMx9BwUIuF8inlYv+c3EAzERUDZ6z3WiXgVQpeVtAQf/fJ6Okl/0fem96H7Ntji/vj3iW/cTkfRoe+nXwC0cRqU7SlbmS+suGOFheXkYqlXKySdu2ye0ec7kcent7GVAtE0SywhhDqVRCKpUCY4zpuk6ccycR0jQNtm2jp6fH4QUAVVXBOYeu6/j4449x5swZ1oi+iqIgm82iv78/8OEd3P9b6Uru79vDbo5cpsOHjiER24Jvvp2CWSHkF/+HPxz7ayDv8Xc/YN/OjlLm2UPKTM3i5PvvwOY6nmamA+diCsfAwIHGPIu7j5fP5xuqrz766CPp+IsXLzq15GqaqPn8aFevXpXKHR8fD+RtBEH8j8dvEgBMTt3zpY/c+Q/l8t/RV2P/ponJB6F1eP5ynCamvqBn06OUzc368o1P3iEAGJ+62VyduZHwK1daBZVKRUr//Qd/WlP9uuett0PzMQouEwWkMdOv5pNBljYDVdcYBFn5Ua/p7ldfrifeP/HnTe/XHj0iT0aBOiszm81ibm4ulNtgjNXUdNlslsQOBVBtGAwMDDAAmJmZceTquo54PI5Lly4JOWx8fJx6e3sBVFesO/bOz88Llwqg+sKJeDo/Px9a31QqhYWFBQwODm66oaSok4TJeX/Bxxbr3XtQzPw50UgMbpcmLY5GdnKkbrZQKFB3d3coQbZtwzRNp0kuygThem3bhtgnNU3TKU00TQNjDJxzdHZ2skqlQqtjK+cckUjE4Y1EIo7rrVQqiMfjDABKpRKF7cFalgVVVRs6h2tzE9c+uUB7dx8EKd4SiCwRZjhY1H9BMQKEfRQWAecAi9o1dKDa8lwq5qFEwu9nSo1pmqbvLkUQbt366byo30O6fPkynT59mkWjUQ/dMAyxVeXZ+bh7964jV7QT3ZiYmKCjR48y27Yb0rdRHBo+gXisCwAHJ++jU2MpMMXGcmkecXULAG9LkAHo6elCPp8H5wqiiAKKa/WtjLdtQirZg3JZnkm7ITWmX0Nchnq7G7KsUxT7fiurXmkgINvlWQ+oqref6odHYzfp4NsnpGMnM1/RkUP1M9RGII2ZslLCD8Wif19xtTy/PEO8OH4bxJqmSeWGOXS8oaDGFsF6QboyE4lE6OxW13UkEgmcPXsWwE+fGgj2ldLFKSEEXRjv0aNHYhxbOU3gyHYbWNd1isVijlzbtmvcclh9c7kc0ul009+u3PvyBmWzczjyq4OIshg6UgpePJ8LxfvN9GPi3EYsYQO8A4N7wjcR/CA1ZjM3Kgznhx07dkjlyuKe2Crzw2Ycxkr3bEV62xYkYnEQVFQqgBYizsXVbYio1XF6qQTTzuH777+hhvuvLrRMO+91BScTaqQTe3Y3tqpWb/NNTN6mpaVCU7rU3TXxu84Y85QQ5XK55mzPRjYf/OZcyYpFCcIWFhYonf7pVAARQdM0dHZ2NrWaFSUK2ed7YRFTkw23Tz26yIiFQgFsFcTzUhSlhpZMJployQHVuLgWhH0HRPar6zoeP35cUxIxxlg8HmeMMSYyaBEfBRRFYc0asgrunKBrHs31cH62DlBfX/iT2G6EDXuiGZFIJNbtVP3rDqkx/TZ6RXvJ76CU201s5JZWmK5PGH1e9+9DpTEznU7XxKFyuYzPPvsMQNWdLS0tkbtQX1pacn432nBYKwzDcM4izczMeGL19evXAVSzYHcbUaDpDJhZ1eMc6wG/7wQbgMeY7je43o12d3e3VJkgOwgG+LcC3VjL5wkdiRRKpRJ+/HGaItG1NS8416CXTSwWmvsA12PMUqmEmZkZ2rfvNf3Ic40gInry5EnDfHqZIbfwCpEIgWNtCXxFN2CZEZw44X+4OSx8mS3LIhET3/TtTcMwEIvFMDs7i/379/+iXuA22mijjTYawv8BZkNFsg8FxyIAAAAASUVORK5CYII="
        p5 = p2
        p6 = "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"
        p7 = p2
        p8 = p2
        p9 = "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"
        p10 = "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"

        ## 遍历图片
        list_name = ["p1", "p2", "p3", "p4", "p5", "p6", "p7", "p8", "p9", "p10"]
        list_str = [p1, p2, p3, p4, p5, p6, p7, p8, p9, p10]
        list_all = []
        for i in range(10):
            photo = tk.PhotoImage(name=list_name[i], data=base64.b64decode(list_str[i]))
            list_all.append(photo)

        # 获取所有帧
        self.frames = list_all

        # 初始化显示第一帧
        self.label_widget.config(image=self.frames[0])
        self.label_widget.image = self.frames[0]

        # 绑定拖动事件
        self.label_widget.bind("<ButtonPress-1>", self.on_press)
        self.label_widget.bind("<ButtonRelease-1>", self.on_button_release)

        # 开始动画
        self.play_gif()

    def play_gif(self):
        if self.frame_index < len(self.frames):
            self.label_widget.config(image=self.frames[self.frame_index])
            self.frame_index += 1
            self.root.after(self.update_delay, self.play_gif)
        else:
            self.frame_index = 0
            self.root.after(self.update_delay, self.play_gif)

    def on_press(self, event):
        # 记录鼠标按下时的位置
        self.start_x = event.x
        self.start_y = event.y
        self.initial_x = self.root.winfo_x()
        self.initial_y = self.root.winfo_y()

    def on_button_release(self, event):
        # 计算鼠标移动的距离
        delta_x = event.x - self.start_x
        delta_y = event.y - self.start_y

        # 更新窗口位置
        self.root.geometry(f'+{self.initial_x + delta_x}+{self.initial_y + delta_y}')

## 获取cpu和内存的使用率
class FILETIME(ctypes.Structure):
    _fields_ = [("dwLowDateTime", ctypes.c_ulong),
                ("dwHighDateTime", ctypes.c_ulong)]


class SYSTEMTIME(ctypes.Structure):
    _fields_ = [("wYear", ctypes.c_ushort),
                ("wMonth", ctypes.c_ushort),
                ("wDayOfWeek", ctypes.c_ushort),
                ("wDay", ctypes.c_ushort),
                ("wHour", ctypes.c_ushort),
                ("wMinute", ctypes.c_ushort),
                ("wSecond", ctypes.c_ushort),
                ("wMilliseconds", ctypes.c_ushort)]


class MEMORYSTATUSEX(ctypes.Structure):
    _fields_ = [("dwLength", ctypes.c_ulong),
                ("dwMemoryLoad", ctypes.c_ulong),
                ("ullTotalPhys", ctypes.c_ulonglong),
                ("ullAvailPhys", ctypes.c_ulonglong),
                ("ullTotalPageFile", ctypes.c_ulonglong),
                ("ullAvailPageFile", ctypes.c_ulonglong),
                ("ullTotalVirtual", ctypes.c_ulonglong),
                ("ullAvailVirtual", ctypes.c_ulonglong),
                ("ullAvailExtendedVirtual", ctypes.c_ulonglong)]
## 调用dll
kernel32 = ctypes.windll.kernel32

## 获取cpu使用率
def get_cpu_usage():
    def get_cpu_times():
        idle_time = FILETIME()
        kernel_time = FILETIME()
        user_time = FILETIME()
        kernel32.GetSystemTimes(ctypes.byref(idle_time), ctypes.byref(kernel_time), ctypes.byref(user_time))
        return (idle_time, kernel_time, user_time)

    def filetime_to_seconds(ft):
        return (ft.dwHighDateTime * 0x100000000 + ft.dwLowDateTime) / 1e7
    (idle1, kernel1, user1) = get_cpu_times()
    time.sleep(1)
    (idle2, kernel2, user2) = get_cpu_times()

    idle_diff = filetime_to_seconds(idle2) - filetime_to_seconds(idle1)
    system_diff = (filetime_to_seconds(kernel2) - filetime_to_seconds(kernel1)) + \
                  (filetime_to_seconds(user2) - filetime_to_seconds(user1))

    return float("{:.1f}".format((1.0 - idle_diff / system_diff) * 100.0))

## 获取内存使用率
def get_memory_usage():
    mem_info = MEMORYSTATUSEX()
    mem_info.dwLength = ctypes.sizeof(MEMORYSTATUSEX)
    kernel32.GlobalMemoryStatusEx(ctypes.byref(mem_info))
    return float(mem_info.dwMemoryLoad)

## 启动tk的gui
def main():
    top = tk.Tk()
    top.title("GIF 动画播放器")
    top.overrideredirect(True)  # 无边框
    bg_color = '#FFFFF1'
    top.config(bg=bg_color)  # 背景色
    top.wm_attributes('-transparentcolor', bg_color)
    top.wm_attributes("-topmost", True)  # 窗口置顶
    top.attributes('-alpha', 1)  # 设置透明度,0.0 完全透明,1.0 完全不透明

    # 获取屏幕宽度和高度
    screen_width = top.winfo_screenwidth()
    screen_height = top.winfo_screenheight()

    # 窗口大小为300x200
    window_width = 300
    window_height = 200

    # 计算窗口位置,使其出现在右下角
    x_position = screen_width - window_width
    y_position = screen_height - window_height

    # 设置窗口的初始位置和大小
    top.geometry(f'{window_width}x{window_height}+{int(x_position)}+{int(y_position)}')

    # 创建Label来显示GIF
    label = tk.Label(top, bg=bg_color)
    label.pack(expand=True, fill='both')  # 确保Label填充整个窗口

    # 初始化GifPlayer
    GifPlayer(top,label)

    # 显示时间的Label
    time_label = tk.Label(top, bg=bg_color, fg='white', font=('Arial', 12))
    time_label.place(x=window_width // 2 - 50, y=50)

    ## 更新时间
    def update_time():
        # 获取当前时间并格式化为 时:分:秒
        current_time = datetime.now().strftime('%H:%M:%S')
        # 更新时间标签的文本
        time_label.config(text=current_time)
        # 每秒调用一次自己以更新时间
        top.after(1000, update_time)
    update_time()

    ## 状态显示
    status_show = tk.Label(top, bg=bg_color, fg='white', font=('Arial', 10))
    status_show.place(x=window_width // 2 +60 , y=55)
    ## 更新状态
    def update_status_show():
        def update_status():
            ## 状态更新
            cpu_status = get_cpu_usage()
            memory_status = get_memory_usage()
            total, free = nt._getdiskusage('C:/')
            disk_status =  free / (2 ** 30)
            ## 颜表情表现
            list_emote = ["(^▽^)","(⊙_⊙)","(一_一)","(一_一)!","(╥_╥)"]
            if 0<=cpu_status<20:
                string_status = list_emote[0]
            elif 20<=cpu_status<40:
                string_status = list_emote[1]
            elif 40<=cpu_status<60:
                string_status = list_emote[2]
            elif 60<=cpu_status<80:
                string_status = list_emote[3]
            elif 80<=cpu_status<=100:
                string_status = list_emote[4]
            status_text = "CPU:{0:.1f}%\n内存:{1:.1f}%\n磁盘C:{2:.1f}G\n{3}\n".format(cpu_status,memory_status,disk_status,string_status)
            # 更新文本
            status_show.config(text=status_text)
        status_thread = threading.Thread(target=update_status)
        # 启动线程
        status_thread.start()
        # 自调用更新
        top.after(2000, update_status_show)
    ## 状态更新
    update_status_show()

    ## 点击处理
    def on_button_click():
        def screenshot():
            s = time.time()
            # 加载GDI32和User32库
            gdi32 = ctypes.windll.gdi32
            user32 = ctypes.windll.user32

            # 定义常量
            SM_CXSCREEN = 0
            SM_CYSCREEN = 1

            # 缩放比例
            zoom = 1
            screenWidth = int(user32.GetSystemMetrics(SM_CXSCREEN) * zoom)
            screenHeight = int(user32.GetSystemMetrics(SM_CYSCREEN) * zoom)

            # 屏幕截取
            def capture_screen(x, y, width, height):

                # 获取桌面窗口句柄
                hwnd = user32.GetDesktopWindow()
                # 获取桌面窗口的设备上下文
                hdc_src = user32.GetDC(hwnd)

                if len(str(hdc_src)) > 16:
                    return 0

                # 创建一个与屏幕兼容的内存设备上下文
                hdc_dest = gdi32.CreateCompatibleDC(hdc_src)

                # 创建一个位图
                bmp = gdi32.CreateCompatibleBitmap(hdc_src, width, height)

                # # 将位图选入内存设备上下文
                old_bmp = gdi32.SelectObject(hdc_dest, bmp)

                # 定义SRCCOPY常量
                SRCCOPY = 0x00CC0020
                # 捕获屏幕
                gdi32.BitBlt(hdc_dest, 0, 0, width, height, hdc_src, x, y, SRCCOPY)
                """
                    gdi32.BitBlt(hdc_src,  # 目标设备上下文
                             x_dest,   # 目标矩形左上角的x坐标
                             y_dest,   # 目标矩形左上角的y坐标
                             width,    # 宽度
                             height,   # 高度
                             hdc_dest, # 源设备上下文
                             x_src,    # 源矩形左上角的x坐标(通常是0)
                             y_src,    # 源矩形左上角的y坐标(通常是0)
                             SRCCOPY)  # 复制选项
                """

                ## 这里是复制bmp图片内存对象
                # 加载必要的 Windows API 函数
                user32_1 = ctypes.windll.user32
                kernel32_1 = ctypes.windll.kernel32
                # 定义常量
                CF_BITMAP = 2

                # 打开剪贴板
                def OpenClipboard(hwnd):
                    return user32_1.OpenClipboard(hwnd)

                # 关闭剪贴板
                def CloseClipboard():
                    return user32_1.CloseClipboard()

                # 清空剪贴板
                def EmptyClipboard():
                    return user32_1.EmptyClipboard()

                # 设置剪贴板数据
                def SetClipboardData(uFormat, hData):
                    return user32_1.SetClipboardData(uFormat, hData)

                # 全局分配内存
                def GlobalAlloc(uFlags, dwBytes):
                    return kernel32_1.GlobalAlloc(uFlags, dwBytes)

                # 全局锁定内存
                def GlobalLock(hMem):
                    return kernel32_1.GlobalLock(hMem)

                # 全局解锁内存
                def GlobalUnlock(hMem):
                    return kernel32_1.GlobalUnlock(hMem)

                # 将图片复制到剪贴板
                def copy_bmp_to_clipboard():
                    hwnd = 0  # 可以传递 NULL(0)作为 hwnd
                    if OpenClipboard(hwnd):
                        try:
                            EmptyClipboard()
                            SetClipboardData(CF_BITMAP, bmp)  # CF_BITMAP = 2
                        finally:
                            CloseClipboard()

                copy_bmp_to_clipboard()

                # 定义 RGBQUAD 结构体
                class RGBQUAD(ctypes.Structure):
                    _fields_ = [("rgbBlue", ctypes.c_ubyte),
                                ("rgbGreen", ctypes.c_ubyte),
                                ("rgbRed", ctypes.c_ubyte),
                                ("rgbReserved", ctypes.c_ubyte)]

                # 定义 BITMAPINFOHEADER 结构体
                class BITMAPINFOHEADER(ctypes.Structure):
                    _fields_ = [("biSize", ctypes.c_uint),
                                ("biWidth", ctypes.c_int),
                                ("biHeight", ctypes.c_int),
                                ("biPlanes", ctypes.c_ushort),
                                ("biBitCount", ctypes.c_ushort),
                                ("biCompression", ctypes.c_uint),
                                ("biSizeImage", ctypes.c_uint),
                                ("biXPelsPerMeter", ctypes.c_int),
                                ("biYPelsPerMeter", ctypes.c_int),
                                ("biClrUsed", ctypes.c_uint),
                                ("biClrImportant", ctypes.c_uint)]

                # 定义 BITMAPINFO 结构体
                class BITMAPINFO(ctypes.Structure):
                    _fields_ = [("bmiHeader", BITMAPINFOHEADER),
                                ("bmiColors", RGBQUAD * 3)]  # 只分配了3个RGBQUAD的空间

                BI_RGB = 0
                DIB_RGB_COLORS = 0

                # 分配像素数据缓冲区(这里以24位位图为例,每个像素3字节)
                pixel_data = (ctypes.c_ubyte * (width * height * 3))()  # 4
                # 转换bytes
                # pixel_data = memoryview(pixel_data).tobytes()

                # 填充 BITMAPINFO 结构体
                bmi = BITMAPINFO()
                bmi.bmiHeader.biSize = ctypes.sizeof(BITMAPINFOHEADER)
                bmi.bmiHeader.biWidth = width
                bmi.bmiHeader.biHeight = -height  # 注意:负高度表示自底向上的位图
                bmi.bmiHeader.biPlanes = 1
                bmi.bmiHeader.biBitCount = 24  # 24即3*8   32
                bmi.bmiHeader.biCompression = BI_RGB  # 无压缩

                # 调用 GetDIBits 获取像素数据
                ret = gdi32.GetDIBits(hdc_src, bmp, 0, height, pixel_data, ctypes.byref(bmi), DIB_RGB_COLORS)
                if ret == 0:
                    print("GetDIBits failed:", ctypes.WinError())

                print("复制:",time.time() - s)
                # 像素色彩换位置
                mv = (memoryview(pixel_data).cast('B'))
                # b_stream = bytearray(width * (height+1) * 3)
                print("像素点:",len(mv))

                b_stream = bytearray()
                k = 0
                # for i in range(0, len(mv), 3):
                #     if i % (width*3) == 0:
                #         # b_stream[k] = 0
                #         k += 1
                #     b_stream[k] = mv[i + 2]
                #     b_stream[k + 1] = mv[i + 1]
                #     b_stream[k + 2] = mv[i]
                #     k+=3

                for i in range(0, len(mv), 3):  # 4
                    if i % (width * 3) == 0:
                        b_stream.append(0)
                        k += 1
                    b_stream.append(mv[i + 2])
                    b_stream.append(mv[i + 1])
                    b_stream.append(mv[i])
                    # b_stream.extend([mv[i + 2],mv[i + 1],mv[i]])
                    k += 3
                    # b_stream.append(mv[i+2])
                    # b_stream.append(mv[i+1])
                    # b_stream.append(mv[i+0])
                    # b_stream.append(mv[i+3])
                    # k+=4
                # print(b_stream)

                print("置换:",time.time() - s)

                def crc32(data):  # 字节流
                    crc = zlib.crc32(data)
                    return crc

                def crc32_b(data):
                    crc = zlib.crc32(data).to_bytes(4, byteorder='big')
                    return crc

                # png图片标识符
                png_signature = b"\x89PNG\r\n\x1a\n"
                # IHDR块
                ihdr = struct.pack("!IIBBBBB", width, height, 8, 2, 0, 0, 0)  # 8 6 0 0 0
                # IHDR的CRC验证
                mid = crc32_b(b"IHDR" + ihdr)
                # 压缩图片数据
                bd = zlib.compress(bytes(b_stream))
                # IDAT的CRC验证
                crc_bytes = crc32_b(bd)
                idat_chunk = b"IDAT" + bd + crc_bytes
                # IEND块
                iend = b"\x00\x00\x00\x00IEND"
                # IEND的CRC验证
                crc_end = crc32_b(b"IEND")
                iend += crc_end

                # 写入图片操作,使用BytesIO来构建PNG
                png_io = io.BytesIO()
                png_io.write(png_signature + b"\x00\x00\x00\rIHDR" + ihdr + mid)
                idat_header = struct.pack("!I", len(bd))
                png_io.write(idat_header + idat_chunk)
                png_io.write(iend)

                # 一次性写入文件
                with open("photo.png", "wb") as f:
                    f.write(png_io.getvalue())

                # 恢复设备上下文
                gdi32.SelectObject(hdc_dest, old_bmp)
                # 删除内存设备上下文
                gdi32.DeleteDC(hdc_dest)
                # 释放桌面窗口的设备上下文
                user32.ReleaseDC(hwnd, hdc_src)
                # bmp已经被处理,现在删除它
                gdi32.DeleteObject(bmp)

            # 进行截图
            for i in range(10):
                x = capture_screen(0, 0, screenWidth, screenHeight)
                if x != 0:
                    break
            print("完成:",time.time() - s)

        status_thread = threading.Thread(target=screenshot)
        # 启动线程
        status_thread.start()
    # 创建按钮,并绑定事件处理函数
    button = tk.Button(top, text="截图", command=on_button_click,bg=bg_color,fg="#FFFFFF")
    button.place(x=window_width // 2 +80 , y=25)

    top.mainloop()

if __name__ == "__main__":
    main()

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值