数学建模社区-数学中国

标题: Python-监听并自动保存剪贴板图片到临时目录 [打印本页]

作者: 檀俾九    时间: 2021-1-16 11:27
标题: Python-监听并自动保存剪贴板图片到临时目录
  1. #include <iostream>3 B1 H5 v# y( q# [& R' H% K
  2. #include <Windows.h>
    ! U; N3 J9 D2 @7 V( q

  3. , n1 K4 T0 m8 m* a* u
  4. extern "C" {0 Q' r6 p/ G" d3 y
  5.   __declspec(dllexport) BOOL SaveBmp(HBITMAP hBitmap, const wchar_t* FileName);
    7 E% V" j8 ~7 A3 V  L
  6. }
    * n, T) K" s5 d' R8 g$ _1 A3 y
  7. - O4 b* i) y3 F4 _- e3 I$ y3 q
  8. BOOL SaveBmp(HBITMAP hBitmap, const wchar_t* FileName)2 v: q) o7 e) \; N# V
  9. {  z* u  _: b& v! l3 H
  10.   //设备描述表0 p, R- q/ G! q4 e6 P! M
  11.   HDC hDC;$ L; [7 P4 G3 ?
  12.   //当前分辨率下每象素所占字节数% |' D- {* A! X( b
  13.   int iBits;
    & {4 Q. x* I5 a8 U1 A) s* ^1 B
  14.   //位图中每象素所占字节数' @* j, {) _9 j+ r1 j
  15.   WORD wBitCount;
    ) l+ W; z8 i& J3 R1 w3 K" m
  16.   //定义调色板大小, 位图中像素字节大小 ,位图文件大小 , 写入文件字节数 , U% Z- X8 [! j) Q# ~
  17.   DWORD dwPaletteSize = 0, dwBmBitsSize = 0, dwDIBSize = 0, dwWritten = 0;1 }# `+ Y, X$ Z; Z$ Q
  18.   //位图属性结构
    8 S7 }) N; K  u+ U8 a
  19.   BITMAP Bitmap;
    9 o( Z: w: Q7 m# k
  20.   //位图文件头结构
    , d# Y% v' `3 M( N) H
  21.   BITMAPFILEHEADER bmfHdr;
    , m) C. C% ]1 a+ _1 P" s
  22.   //位图信息头结构
    , H4 e, H0 W- `; d) |3 K2 C
  23.   BITMAPINFOHEADER bi;
    3 l* b6 g% |- ^
  24.   //指向位图信息头结构  
    + z& K& Y9 J6 A6 A, H
  25.   LPBITMAPINFOHEADER lpbi;" X! R. o) g* [& c4 Y
  26.   //定义文件,分配内存句柄,调色板句柄
    + g0 _; f# O" D6 n; a6 L
  27.   HANDLE fh, hDib, hPal, hOldPal = NULL;* w8 ^8 G! U& J5 }- p" L0 y- M" A0 S
  28.   //计算位图文件每个像素所占字节数 3 Z9 |1 z2 q1 W3 Z. p7 m
  29.   hDC = CreateDC(L"DISPLAY", NULL, NULL, NULL);
    , x3 K/ |) t+ @3 s# g+ y
  30.   iBits = GetDeviceCaps(hDC, BITSPIXEL) * GetDeviceCaps(hDC, PLANES);
    * Q" w; Y7 k6 U. a$ V2 C8 g
  31.   DeleteDC(hDC);
    . r! `' L$ j! x. P2 t- b- L! y: Z, g
  32.   if (iBits <= 1) wBitCount = 1;0 c3 g, Y9 r8 R- Y
  33.   else if (iBits <= 4)  wBitCount = 4;" N! B) z  p& ~
  34.   else if (iBits <= 8)  wBitCount = 8;7 ~5 [, [- ]9 s- F0 m- M& K; C
  35.   else   wBitCount = 24;
    / y! @0 p3 N/ \7 z0 Z; e
  36.   GetObject(hBitmap, sizeof(Bitmap), (LPSTR)&Bitmap);
    + [3 s3 m9 t+ @' M& w
  37.   bi.biSize = sizeof(BITMAPINFOHEADER);
    " \5 s8 k# D' E: T5 d  ]% U
  38.   bi.biWidth = Bitmap.bmWidth;
    8 Z/ t( _7 m& a6 i3 z) l5 i$ I
  39.   bi.biHeight = Bitmap.bmHeight;
    7 C$ D- V( v& e# D
  40.   bi.biPlanes = 1;; v1 P2 p- ]! Q# `1 `5 u
  41.   bi.biBitCount = wBitCount;
    1 O; a  @; c* C
  42.   bi.biCompression = BI_RGB;8 T5 y, v" B0 E
  43.   bi.biSizeImage = 0;) q: b# }7 D& U9 e5 h% U
  44.   bi.biXPelsPerMeter = 0;
    4 D: I# v% V: T6 U
  45.   bi.biYPelsPerMeter = 0;
    6 L  H: N7 a" O$ E
  46.   bi.biClrImportant = 0;- O4 j! O# m$ p9 M& |
  47.   bi.biClrUsed = 0;
    ) c+ B% _% ?  H4 n
  48.   dwBmBitsSize = ((Bitmap.bmWidth * wBitCount + 31) / 32) * 4 * Bitmap.bmHeight;2 q" V2 A$ D* t: c! p6 D
  49.   //为位图内容分配内存
    6 A" S$ ^/ _3 C( Y
  50.   hDib = GlobalAlloc(GHND, dwBmBitsSize + dwPaletteSize + sizeof(BITMAPINFOHEADER));
    + B) b0 w' S  @; W
  51.   lpbi = (LPBITMAPINFOHEADER)GlobalLock(hDib);
    6 D/ u/ X+ \! b$ I
  52.   *lpbi = bi;' c& A3 F3 F& X# y, J3 b
  53. : R  E1 h! H+ p: `. b& K
  54.   // 处理调色板  
      N8 M: h- Y0 I0 o% `
  55.   hPal = GetStockObject(DEFAULT_PALETTE);3 `" s, B% F1 n% {0 R# Y& y
  56.   if (hPal)
    # Q1 {0 q, l& a# Y2 s" x; V: ?3 d: Z
  57.   {
    ; |6 N! U) x. N
  58.     hDC = ::GetDC(NULL);
    - Q, ~9 ~/ e4 R9 g( l4 x
  59.     hOldPal = ::SelectPalette(hDC, (HPALETTE)hPal, FALSE);
    2 \2 R) J3 N& U3 F" W7 C- R6 C
  60.     RealizePalette(hDC);* u. i$ m7 L0 w
  61.   }
    9 E: o$ z) }# a  \
  62.   // 获取该调色板下新的像素值
    # o( n& {, r' A3 F0 M1 T1 A1 X
  63.   GetDIBits(hDC, hBitmap, 0, (UINT)Bitmap.bmHeight, (LPSTR)lpbi + sizeof(BITMAPINFOHEADER) + dwPaletteSize, (BITMAPINFO*)lpbi, DIB_RGB_COLORS);
    : _5 N, o, c8 M9 C" n
  64.   //恢复调色板  
    9 a6 f* G6 Y# m. N2 ]
  65.   if (hOldPal)8 G# i$ x( H4 K! b  }  f  ?8 E
  66.   {# ~2 R8 x3 d' |
  67.     ::SelectPalette(hDC, (HPALETTE)hOldPal, TRUE);
    1 `& p9 Q, d! ]- S: v; Z( e7 ^, g: I
  68.     RealizePalette(hDC);
    4 T: n* F# `& Y1 d7 m/ J
  69.     ::ReleaseDC(NULL, hDC);  k* h) P. |% ]; O! q
  70.   }
    0 L! H9 U( @# ~% P
  71.   //创建位图文件  " {& R( l) S, b/ v9 o3 |
  72.   fh = CreateFile(FileName, GENERIC_WRITE, 0, NULL, CREATE_ALWAYS,
    " g# h/ G2 k) K: u9 [# T- N0 _* @
  73.           FILE_ATTRIBUTE_NORMAL | FILE_FLAG_SEQUENTIAL_SCAN, NULL);
    7 @. u* B" \/ X/ e/ e% Q: V* }: m
  74.   if (fh == INVALID_HANDLE_VALUE)  return FALSE;
    ! z& A# C. O6 c: W# q$ e
  75.   // 设置位图文件头 + p7 F6 z3 q* o$ |
  76.   bmfHdr.bfType = 0x4D42; // "BM"
    $ Q$ q2 m- W* u/ H2 S+ `; r$ q. S4 s; v
  77.   dwDIBSize = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER) + dwPaletteSize + dwBmBitsSize;
    ; t) o" k3 s; Z: w
  78.   bmfHdr.bfSize = dwDIBSize;
    7 \( E7 F- g, d3 |$ u  b
  79.   bmfHdr.bfReserved1 = 0;( Y* e5 F( v9 Z  Z1 d# e" f: F
  80.   bmfHdr.bfReserved2 = 0;$ r7 |; F' K. |. y0 N
  81.   bmfHdr.bfOffBits = (DWORD)sizeof(BITMAPFILEHEADER) + (DWORD)sizeof(BITMAPINFOHEADER) + dwPaletteSize;
    7 B3 c  q6 \9 y# y& Q  f
  82.   // 写入位图文件头 , h2 h0 y% n& R( G$ h! i! ?3 D
  83.   WriteFile(fh, (LPSTR)&bmfHdr, sizeof(BITMAPFILEHEADER), &dwWritten, NULL);% j3 v& x4 T% p
  84.   // 写入位图文件其余内容 / `2 `; q, @& U* ^
  85.   WriteFile(fh, (LPSTR)lpbi, dwDIBSize, &dwWritten, NULL);
    4 W9 d) [. P, d
  86.   //清除  % s  V6 s* @" |4 B/ o: \
  87.   GlobalUnlock(hDib);
    6 c# |  J/ N" K5 |( y+ Y
  88.   GlobalFree(hDib);
    6 v! c  Y3 f# p$ y) m4 }3 W/ _
  89.   CloseHandle(fh);
    4 ]3 o$ W: a% B5 J
  90. , R1 o8 b/ N0 P* R0 j
  91.   return TRUE;
    ' y+ R: h  e; t& b
  92. }6 f9 ^# _& P/ u
复制代码
  1. #!/usr/bin/python: h- [! z4 }* N
  2. # -*- coding: utf-8 -*-
    $ ?( X$ f& V" X4 c) {# i. ?# c

  3. 5 B; P9 m6 z8 [7 }  o" [
  4. from ctypes import windll/ Z9 Y% S- G5 I! L/ F  _
  5. from win32clipboard import *
    1 B$ H; x  t% S1 A2 S. r$ T
  6. import tempfile
    ' ^3 b3 W4 G+ A4 T0 h% ]: R
  7. import os
    6 O( |' G: T! e5 R. C! s0 l" @$ H* D
  8. from time import sleep
    ) |7 ^  i# G% e

  9. # Y1 v/ E/ g8 N* o0 b8 i% E
  10. if __name__ == '__main__':
    ; A6 p9 G9 D0 S4 k( J* t  v/ I5 f
  11.     while True:7 r2 p6 ^# P. X7 T" W
  12.         try:* D% x( N( L$ k0 ^, E
  13.             OpenClipboard()
    " w! R. |, D( o2 ^& Y5 m
  14.         except Exception:
    9 b; S* I0 ^% ^% x( p
  15.             print("拒绝访问!")" n* M4 b( s, Z3 T3 w( n' q; r
  16.             break2 _, \  a( q8 W- s
  17.         else:) _9 O9 p' S+ Y- R" A
  18.             if IsClipboardFormatAvailable(CF_BITMAP):
    7 x  k5 T" |1 g3 r
  19.                 try:5 J6 a- V- |  C7 m: t- W3 T; S
  20.                     dll = windll.LoadLibrary("./SaveBmp.dll")
    7 Y% b; O' q  j
  21.                 except FileNotFoundError:
    0 K6 W0 Y" @) ^, c2 n6 [
  22.                     print("依赖库不存在~")+ N  s# {; U, y3 y
  23.                 else:% O* b  H# t; l0 W6 I% p  A" L; L  A
  24.                     tmpfd, tempfilename = tempfile.mkstemp(suffix='.bmp')
    ' A5 l8 ^2 P$ P' G/ \: O( t1 E9 m
  25.                     os.close(tmpfd)0 x3 u& M8 p) p) ?' ]

  26. % J3 T. d, h' w4 a
  27.                     hbitmap = GetClipboardData(CF_BITMAP)
    2 l! }" ?. ^, ^: v: z
  28.                     dll.SaveBmp(hbitmap, tempfilename)
    ' T4 D( R$ L' o" q
  29.                     print(tempfilename)2 s" S; x, Y! t) B7 K
  30.                     EmptyClipboard()$ J" V& u- E4 k5 S* w- Z
  31.             CloseClipboard()6 E* X5 i$ N# k6 K
  32.             sleep(0.2)
    0 V; R! b: _4 e4 f) b
复制代码
转发自派生社区
Python交流群:1047602540
. Q$ j  R6 a: W; ]9 a9 p8 i





欢迎光临 数学建模社区-数学中国 (http://www.madio.net/) Powered by Discuz! X2.5