数学建模社区-数学中国

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

作者: 檀俾九    时间: 2021-1-16 11:27
标题: Python-监听并自动保存剪贴板图片到临时目录
  1. #include <iostream>2 l+ E, ~" ]2 z6 d. K  v0 r$ r; n9 k
  2. #include <Windows.h>
    9 C: n! o: X4 T& O/ ?" j7 U9 O
  3. 4 c0 v9 [" P& }. A( d
  4. extern "C" {! V/ O/ o0 o  l! U6 V
  5.   __declspec(dllexport) BOOL SaveBmp(HBITMAP hBitmap, const wchar_t* FileName);& V' H/ S8 T- _" s# s. N* `+ Z
  6. }9 ^& G) K1 R. z

  7. " c+ B5 ^" R: l  Q/ N2 s9 T" B( q, w
  8. BOOL SaveBmp(HBITMAP hBitmap, const wchar_t* FileName)
    % j& Y  G2 W. D5 L
  9. {
    ' z' g; s, o5 o+ i
  10.   //设备描述表5 G0 C, ~9 y+ m; }/ V; p1 v. B. `; C
  11.   HDC hDC;
    , }( B  V+ X5 k, y
  12.   //当前分辨率下每象素所占字节数
    ! d) L  u9 d$ l; m5 o% R
  13.   int iBits;
    # S2 [7 r1 o( h0 ?0 k
  14.   //位图中每象素所占字节数
    $ `' z3 x9 H3 h
  15.   WORD wBitCount;* W+ p/ I7 J* `* V
  16.   //定义调色板大小, 位图中像素字节大小 ,位图文件大小 , 写入文件字节数
      m* ^3 Q! u; R: j* B8 M5 I8 j
  17.   DWORD dwPaletteSize = 0, dwBmBitsSize = 0, dwDIBSize = 0, dwWritten = 0;. \) Q( q, X" H# h1 s. g
  18.   //位图属性结构
    1 o: j3 r% m5 k9 e  Z* g
  19.   BITMAP Bitmap;
    0 y5 I: V% s  K: I+ i& ^- a) P
  20.   //位图文件头结构: i1 O1 q' M( b" p  U- g
  21.   BITMAPFILEHEADER bmfHdr;. F" T; v* w  T1 v% h
  22.   //位图信息头结构
    : n# Q: N1 f! c( x
  23.   BITMAPINFOHEADER bi;. W; A* J1 p7 ~1 g  p4 F/ e
  24.   //指向位图信息头结构  ; t* b( o! A, ~- D
  25.   LPBITMAPINFOHEADER lpbi;4 \9 F1 x2 E# d. |
  26.   //定义文件,分配内存句柄,调色板句柄 6 x% s3 d2 z5 k8 B
  27.   HANDLE fh, hDib, hPal, hOldPal = NULL;; z) n7 x! n+ v4 E. V5 t' C7 A0 H
  28.   //计算位图文件每个像素所占字节数
    3 {9 T7 a. r* I
  29.   hDC = CreateDC(L"DISPLAY", NULL, NULL, NULL);8 k* p6 @3 G; Z: n8 S: p3 R
  30.   iBits = GetDeviceCaps(hDC, BITSPIXEL) * GetDeviceCaps(hDC, PLANES);" F/ g5 a& v, Q, H4 _0 ]
  31.   DeleteDC(hDC);
    5 Y; G2 l$ m! X- t+ c) ~9 W) Z
  32.   if (iBits <= 1) wBitCount = 1;9 w" [" _+ W) L$ |
  33.   else if (iBits <= 4)  wBitCount = 4;
    8 n/ ]1 M  U* Q5 X+ a* g& ^
  34.   else if (iBits <= 8)  wBitCount = 8;
    & B3 z1 j0 |4 D$ v' J
  35.   else   wBitCount = 24;6 l' p9 \- V5 h) ^8 ^
  36.   GetObject(hBitmap, sizeof(Bitmap), (LPSTR)&Bitmap);
    3 c, E+ Q, V+ ?3 C% H
  37.   bi.biSize = sizeof(BITMAPINFOHEADER);
    8 f1 \8 y6 X6 \% j$ _% j
  38.   bi.biWidth = Bitmap.bmWidth;
    ) z9 v3 L: A; k5 n. E
  39.   bi.biHeight = Bitmap.bmHeight;
    - R5 A+ W5 c1 i* r( Q
  40.   bi.biPlanes = 1;! ]3 M# _4 r! H0 b
  41.   bi.biBitCount = wBitCount;
    ! s: |1 [: \. [! \6 c' X
  42.   bi.biCompression = BI_RGB;
    ' S6 B# d& E  ~$ S3 c* @
  43.   bi.biSizeImage = 0;  H& p- n( S0 `6 K" p, A% I) h7 d) P8 ~/ |
  44.   bi.biXPelsPerMeter = 0;: z4 a. j& u( d6 ?6 M
  45.   bi.biYPelsPerMeter = 0;
    9 k( d* V8 p4 S
  46.   bi.biClrImportant = 0;
    8 T  t( b8 G" s3 o# j/ b  \
  47.   bi.biClrUsed = 0;. f1 v$ S! i0 Z
  48.   dwBmBitsSize = ((Bitmap.bmWidth * wBitCount + 31) / 32) * 4 * Bitmap.bmHeight;& n( I) C! D2 P0 g0 Y6 t
  49.   //为位图内容分配内存
    0 b. [! B% ]9 ^
  50.   hDib = GlobalAlloc(GHND, dwBmBitsSize + dwPaletteSize + sizeof(BITMAPINFOHEADER));" o1 k7 d+ m1 y* ^+ n
  51.   lpbi = (LPBITMAPINFOHEADER)GlobalLock(hDib);& ?; p% B, O' E; O
  52.   *lpbi = bi;
    + d0 e8 T) w8 e! T* u, y1 R

  53. 2 e. T- X- I/ Y8 J4 c* T: L
  54.   // 处理调色板  
    6 D! u" s5 V+ n
  55.   hPal = GetStockObject(DEFAULT_PALETTE);2 N# t( z6 q4 u, i9 i. y  B! S3 R
  56.   if (hPal)
    3 i! W( s3 c7 H1 E, E
  57.   {
    . Q) x/ Y- k4 S- y
  58.     hDC = ::GetDC(NULL);
    7 j+ X' f5 c' p1 s3 ]- f
  59.     hOldPal = ::SelectPalette(hDC, (HPALETTE)hPal, FALSE);
    " ^  R: {9 ^  t& \
  60.     RealizePalette(hDC);3 n* _; ?% P4 Y8 y" u
  61.   }
    ; X: p/ L" m1 q% F1 v
  62.   // 获取该调色板下新的像素值 " c/ ~6 |( J% y8 y
  63.   GetDIBits(hDC, hBitmap, 0, (UINT)Bitmap.bmHeight, (LPSTR)lpbi + sizeof(BITMAPINFOHEADER) + dwPaletteSize, (BITMAPINFO*)lpbi, DIB_RGB_COLORS);2 N" [5 H; f% W: E. X
  64.   //恢复调色板  & m$ i) c7 C& c, L# x
  65.   if (hOldPal)3 g/ c! [6 P* @: T2 E: Q# k
  66.   {/ I& j$ f2 N9 F1 t& y8 k" u/ C
  67.     ::SelectPalette(hDC, (HPALETTE)hOldPal, TRUE);0 R# H  k( s- {$ A4 [: Y& n& c) Q
  68.     RealizePalette(hDC);/ h, Y6 H; \+ k2 D$ A
  69.     ::ReleaseDC(NULL, hDC);
    1 I  h+ O$ Z& v( I
  70.   }/ `. t7 N1 b- m
  71.   //创建位图文件  
    ) b9 p, s" @  t- D3 I3 B
  72.   fh = CreateFile(FileName, GENERIC_WRITE, 0, NULL, CREATE_ALWAYS,
    9 J/ U3 s! n3 Y% C- ]4 E
  73.           FILE_ATTRIBUTE_NORMAL | FILE_FLAG_SEQUENTIAL_SCAN, NULL);5 b, T4 r7 K. }( D  S! G
  74.   if (fh == INVALID_HANDLE_VALUE)  return FALSE;/ o: |. _6 n# }, z( I
  75.   // 设置位图文件头 & C+ C+ `9 M1 i  V* n
  76.   bmfHdr.bfType = 0x4D42; // "BM" + r5 @9 V$ n+ F# L
  77.   dwDIBSize = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER) + dwPaletteSize + dwBmBitsSize;" G: P" f" F8 u3 n3 g: }# o; b% s" q
  78.   bmfHdr.bfSize = dwDIBSize;
    % Y+ e0 M) F, K# ]( S' q/ q
  79.   bmfHdr.bfReserved1 = 0;1 Y% O" ?4 F6 [5 \% z8 v$ C! |
  80.   bmfHdr.bfReserved2 = 0;3 x7 Q6 l; c3 q4 r  n
  81.   bmfHdr.bfOffBits = (DWORD)sizeof(BITMAPFILEHEADER) + (DWORD)sizeof(BITMAPINFOHEADER) + dwPaletteSize;, B! Z$ y( c" X
  82.   // 写入位图文件头
    4 H6 o2 _* S  l3 I
  83.   WriteFile(fh, (LPSTR)&bmfHdr, sizeof(BITMAPFILEHEADER), &dwWritten, NULL);
    7 B6 G' R2 f0 A* _( k6 ?# R
  84.   // 写入位图文件其余内容
    * k  e! b6 e. ]. e9 A: l+ ]' \4 `
  85.   WriteFile(fh, (LPSTR)lpbi, dwDIBSize, &dwWritten, NULL);6 p: }3 _7 J3 W
  86.   //清除  4 j- C6 l% W# G( y9 U6 f& I6 d
  87.   GlobalUnlock(hDib);# P. _  ^% p' d/ E& b; S0 U  n
  88.   GlobalFree(hDib);/ M3 Y& G9 |7 [* R  N
  89.   CloseHandle(fh);0 K8 |( P) Z; `6 d* o: Z
  90. 6 l5 @- s% s* n1 }0 H2 H
  91.   return TRUE;
    4 U7 j2 C9 @& O
  92. }
    6 M/ b! U& x$ t5 S
复制代码
  1. #!/usr/bin/python
    " W& H  U8 j+ ~& k( v
  2. # -*- coding: utf-8 -*-. B4 D/ ^5 G# D2 q$ H3 [- n" b
  3. % I( k0 b0 @9 C$ z8 V" y, U
  4. from ctypes import windll
    4 x5 W1 ?8 l# o4 V5 ]
  5. from win32clipboard import *7 [& y$ s; ]3 k
  6. import tempfile. U  m& z, Q" P8 V6 k; f0 q
  7. import os
    & U8 m( A# ?$ z6 F) e* F
  8. from time import sleep4 _' W1 v1 i6 u% y
  9. - ~3 w( `/ w: a/ N6 V7 F' G2 }6 d
  10. if __name__ == '__main__':
    6 D, s0 k( s5 A  P
  11.     while True:7 ]. p) A0 D6 y, I. R; D8 q
  12.         try:
      S9 ~3 N6 u' n* A- q9 f% S6 x
  13.             OpenClipboard()
    $ o  O5 }6 @8 m
  14.         except Exception:& W; N: ^& Z# B+ ~. X
  15.             print("拒绝访问!"). y7 |3 W4 q, v9 k. U3 T; h
  16.             break
    # v4 U! m  p$ o9 a
  17.         else:- b5 I2 L9 d3 ^$ X4 Q! V
  18.             if IsClipboardFormatAvailable(CF_BITMAP):
    ' v6 Z: k2 Y4 v. y& C% g) g1 E
  19.                 try:
    : Z- H2 k6 d! ^5 k0 u* j
  20.                     dll = windll.LoadLibrary("./SaveBmp.dll")
    : f6 h+ C" w  ^8 e
  21.                 except FileNotFoundError:+ S; A# W. o8 v, G7 {8 x
  22.                     print("依赖库不存在~")
    - w) ?2 D$ ^6 \8 V2 V2 g( r8 \. n
  23.                 else:7 Z9 p, A5 A- r
  24.                     tmpfd, tempfilename = tempfile.mkstemp(suffix='.bmp'). ~! G# s+ Z* j' M+ Q  g$ S
  25.                     os.close(tmpfd)
    6 A& a  Y2 |7 S+ V

  26. 0 l( }1 L: y7 Q1 K2 W% K( |" A
  27.                     hbitmap = GetClipboardData(CF_BITMAP)% t- R% P1 D/ f: ]( ~# G% F7 W3 w
  28.                     dll.SaveBmp(hbitmap, tempfilename)# S  Y, p! q" q1 Z
  29.                     print(tempfilename)+ H" T# m) |5 @( m& O2 |
  30.                     EmptyClipboard()- {( Q1 R8 c8 H" q8 G5 o
  31.             CloseClipboard()
    . }6 Z0 B4 P8 L* W. H3 q
  32.             sleep(0.2)
    6 p+ I2 x5 ]! a1 z- {, v
复制代码
转发自派生社区
Python交流群:1047602540
3 [; z7 S# _8 F2 x" C3 Z8 s





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