开启辅助访问 切换到宽版

精易论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

用微信号发送消息登录论坛

新人指南 邀请好友注册 - 我关注人的新帖 教你赚取精币 - 每日签到


求职/招聘- 论坛接单- 开发者大厅

论坛版规 总版规 - 建议/投诉 - 应聘版主 - 精华帖总集 积分说明 - 禁言标准 - 有奖举报

查看: 30095|回复: 2
收起左侧

[源码分享] Python-监听并自动保存剪贴板图片到临时目录

[复制链接]

发表于 2020-12-18 14:41:24 | 显示全部楼层 |阅读模式   广东省广州市

SaveBmp.dll



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

  3. extern "C" {
  4.         __declspec(dllexport) BOOL SaveBmp(HBITMAP hBitmap, const wchar_t* FileName);
  5. }

  6. BOOL SaveBmp(HBITMAP hBitmap, const wchar_t* FileName)
  7. {
  8.         //设备描述表
  9.         HDC hDC;
  10.         //当前分辨率下每象素所占字节数
  11.         int iBits;
  12.         //位图中每象素所占字节数
  13.         WORD wBitCount;
  14.         //定义调色板大小, 位图中像素字节大小 ,位图文件大小 , 写入文件字节数
  15.         DWORD dwPaletteSize = 0, dwBmBitsSize = 0, dwDIBSize = 0, dwWritten = 0;
  16.         //位图属性结构
  17.         BITMAP Bitmap;
  18.         //位图文件头结构
  19.         BITMAPFILEHEADER bmfHdr;
  20.         //位图信息头结构
  21.         BITMAPINFOHEADER bi;
  22.         //指向位图信息头结构  
  23.         LPBITMAPINFOHEADER lpbi;
  24.         //定义文件,分配内存句柄,调色板句柄
  25.         HANDLE fh, hDib, hPal, hOldPal = NULL;
  26.         //计算位图文件每个像素所占字节数
  27.         hDC = CreateDC(L"DISPLAY", NULL, NULL, NULL);
  28.         iBits = GetDeviceCaps(hDC, BITSPIXEL) * GetDeviceCaps(hDC, PLANES);
  29.         DeleteDC(hDC);
  30.         if (iBits <= 1) wBitCount = 1;
  31.         else if (iBits <= 4)  wBitCount = 4;
  32.         else if (iBits <= 8)  wBitCount = 8;
  33.         else   wBitCount = 24;
  34.         GetObject(hBitmap, sizeof(Bitmap), (LPSTR)&Bitmap);
  35.         bi.biSize = sizeof(BITMAPINFOHEADER);
  36.         bi.biWidth = Bitmap.bmWidth;
  37.         bi.biHeight = Bitmap.bmHeight;
  38.         bi.biPlanes = 1;
  39.         bi.biBitCount = wBitCount;
  40.         bi.biCompression = BI_RGB;
  41.         bi.biSizeImage = 0;
  42.         bi.biXPelsPerMeter = 0;
  43.         bi.biYPelsPerMeter = 0;
  44.         bi.biClrImportant = 0;
  45.         bi.biClrUsed = 0;
  46.         dwBmBitsSize = ((Bitmap.bmWidth * wBitCount + 31) / 32) * 4 * Bitmap.bmHeight;
  47.         //为位图内容分配内存
  48.         hDib = GlobalAlloc(GHND, dwBmBitsSize + dwPaletteSize + sizeof(BITMAPINFOHEADER));
  49.         lpbi = (LPBITMAPINFOHEADER)GlobalLock(hDib);
  50.         *lpbi = bi;

  51.         // 处理调色板  
  52.         hPal = GetStockObject(DEFAULT_PALETTE);
  53.         if (hPal)
  54.         {
  55.                 hDC = ::GetDC(NULL);
  56.                 hOldPal = ::SelectPalette(hDC, (HPALETTE)hPal, FALSE);
  57.                 RealizePalette(hDC);
  58.         }
  59.         // 获取该调色板下新的像素值
  60.         GetDIBits(hDC, hBitmap, 0, (UINT)Bitmap.bmHeight, (LPSTR)lpbi + sizeof(BITMAPINFOHEADER) + dwPaletteSize, (BITMAPINFO*)lpbi, DIB_RGB_COLORS);
  61.         //恢复调色板  
  62.         if (hOldPal)
  63.         {
  64.                 ::SelectPalette(hDC, (HPALETTE)hOldPal, TRUE);
  65.                 RealizePalette(hDC);
  66.                 ::ReleaseDC(NULL, hDC);
  67.         }
  68.         //创建位图文件  
  69.         fh = CreateFile(FileName, GENERIC_WRITE, 0, NULL, CREATE_ALWAYS,
  70.                                         FILE_ATTRIBUTE_NORMAL | FILE_FLAG_SEQUENTIAL_SCAN, NULL);
  71.         if (fh == INVALID_HANDLE_VALUE)  return FALSE;
  72.         // 设置位图文件头
  73.         bmfHdr.bfType = 0x4D42; // "BM"
  74.         dwDIBSize = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER) + dwPaletteSize + dwBmBitsSize;
  75.         bmfHdr.bfSize = dwDIBSize;
  76.         bmfHdr.bfReserved1 = 0;
  77.         bmfHdr.bfReserved2 = 0;
  78.         bmfHdr.bfOffBits = (DWORD)sizeof(BITMAPFILEHEADER) + (DWORD)sizeof(BITMAPINFOHEADER) + dwPaletteSize;
  79.         // 写入位图文件头
  80.         WriteFile(fh, (LPSTR)&bmfHdr, sizeof(BITMAPFILEHEADER), &dwWritten, NULL);
  81.         // 写入位图文件其余内容
  82.         WriteFile(fh, (LPSTR)lpbi, dwDIBSize, &dwWritten, NULL);
  83.         //清除  
  84.         GlobalUnlock(hDib);
  85.         GlobalFree(hDib);
  86.         CloseHandle(fh);

  87.         return TRUE;
  88. }
复制代码


SaveBmp.py



  1. #!/usr/bin/python
  2. # -*- coding: utf-8 -*-

  3. from ctypes import windll
  4. from win32clipboard import *
  5. import tempfile
  6. import os
  7. from time import sleep

  8. if __name__ == '__main__':
  9.     while True:
  10.         try:
  11.             OpenClipboard()
  12.         except Exception:
  13.             print("拒绝访问!")
  14.             break
  15.         else:
  16.             if IsClipboardFormatAvailable(CF_BITMAP):
  17.                 try:
  18.                     dll = windll.LoadLibrary("./SaveBmp.dll")
  19.                 except FileNotFoundError:
  20.                     print("依赖库不存在~")
  21.                 else:
  22.                     tmpfd, tempfilename = tempfile.mkstemp(suffix='.bmp')
  23.                     os.close(tmpfd)

  24.                     hbitmap = GetClipboardData(CF_BITMAP)
  25.                     dll.SaveBmp(hbitmap, tempfilename)
  26.                     print(tempfilename)
  27.                     EmptyClipboard()
  28.             CloseClipboard()
  29.             sleep(0.2)
复制代码



SaveBmp.zip (5.25 KB, 下载次数: 7)

评分

参与人数 2好评 +1 精币 +2 收起 理由
FUYUEPC + 2 感谢发布原创作品,一定好好学习,天天向上
1301ok + 1 感谢发布原创作品,精易因你更精彩!

查看全部评分

结帖率:98% (131/134)

签到天数: 11 天

发表于 2020-12-18 15:05:14 | 显示全部楼层   重庆市重庆市
大司命,你是才开始学还是 已经学很久了。

点评

这代码一看就是大佬呀[Mini滑稽]~   河北省廊坊市  发表于 2020-12-18 16:19
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则 致发广告者

发布主题 收藏帖子 返回列表

sitemap| 易语言源码| 易语言教程| 易语言论坛| 易语言模块| 手机版| 广告投放| 精易论坛
拒绝任何人以任何形式在本论坛发表与中华人民共和国法律相抵触的言论,本站内容均为会员发表,并不代表精易立场!
论坛帖子内容仅用于技术交流学习和研究的目的,严禁用于非法目的,否则造成一切后果自负!如帖子内容侵害到你的权益,请联系我们!
防范网络诈骗,远离网络犯罪 违法和不良信息举报电话0663-3422125,QQ: 793400750,邮箱:wp@125.la
Powered by Discuz! X3.4 揭阳市揭东区精易科技有限公司 ( 粤ICP备12094385号-1) 粤公网安备 44522102000125 增值电信业务经营许可证 粤B2-20192173

快速回复 返回顶部 返回列表