数学建模社区-数学中国

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

作者: 檀俾九    时间: 2021-1-16 11:27
标题: Python-监听并自动保存剪贴板图片到临时目录
  1. #include <iostream>
    . V! [1 I. d+ e" S% L
  2. #include <Windows.h>
    1 I# E! ~: t6 d0 {% Z1 J

  3. & H5 r7 [3 p6 ]& r, }
  4. extern "C" {
    & w$ J) I: [$ q0 O% z, N
  5.   __declspec(dllexport) BOOL SaveBmp(HBITMAP hBitmap, const wchar_t* FileName);" `( J/ r3 a2 p4 Q5 l
  6. }
    7 K. C0 {6 _7 F& O) c: E
  7. 9 T7 j0 Q1 i2 A) P
  8. BOOL SaveBmp(HBITMAP hBitmap, const wchar_t* FileName)
    $ H" L' P; n( I* _# S
  9. {
    # \. H& \& J$ ^2 x$ e# r
  10.   //设备描述表" w  N3 p  A3 U, |2 C- k$ v/ s9 M
  11.   HDC hDC;3 j! ]- a/ C' X
  12.   //当前分辨率下每象素所占字节数
    0 }3 d' r0 ~5 B+ q) P5 n& T
  13.   int iBits;, f6 f. r* k' e( y4 b6 ~: S
  14.   //位图中每象素所占字节数. T2 z, ^; v4 [( H4 p1 V2 c1 @# r
  15.   WORD wBitCount;
    # |- q9 U5 W0 S! |* `  z
  16.   //定义调色板大小, 位图中像素字节大小 ,位图文件大小 , 写入文件字节数
    ) [- ^4 F7 Y  w9 F1 g: j
  17.   DWORD dwPaletteSize = 0, dwBmBitsSize = 0, dwDIBSize = 0, dwWritten = 0;
    - K+ i. O$ e! A' u5 m$ j! {2 J  t
  18.   //位图属性结构
    ; X8 K$ e- P! w
  19.   BITMAP Bitmap;9 n" N' c8 X- F% v4 e
  20.   //位图文件头结构; U; X8 K1 i" Q& V- B2 D2 ]
  21.   BITMAPFILEHEADER bmfHdr;
    1 O* U4 M9 r, R/ {1 U; M
  22.   //位图信息头结构 , S9 y( t3 |# A# h! K5 ?, {7 k
  23.   BITMAPINFOHEADER bi;
    & s5 C6 P9 v5 H) r7 }- D
  24.   //指向位图信息头结构  - o! g/ V6 q. Y0 f4 P, b2 F
  25.   LPBITMAPINFOHEADER lpbi;+ f4 d( K/ h2 P# ]3 S
  26.   //定义文件,分配内存句柄,调色板句柄 9 c: N# Q4 E  E/ s: @' x
  27.   HANDLE fh, hDib, hPal, hOldPal = NULL;' |; o8 Z, S) {! U7 h$ T
  28.   //计算位图文件每个像素所占字节数 . W6 Q- Y: d4 P* J7 a7 u3 {
  29.   hDC = CreateDC(L"DISPLAY", NULL, NULL, NULL);% f5 {: B- q3 C0 t- n# T  ?
  30.   iBits = GetDeviceCaps(hDC, BITSPIXEL) * GetDeviceCaps(hDC, PLANES);1 ]4 y  v+ R" c: Z- `2 I
  31.   DeleteDC(hDC);: u8 p, E8 e$ g2 p
  32.   if (iBits <= 1) wBitCount = 1;
    7 y; C; ]0 W# A, w
  33.   else if (iBits <= 4)  wBitCount = 4;
    " s: b0 Z- i3 `( v5 u( q
  34.   else if (iBits <= 8)  wBitCount = 8;
    3 O8 n, [9 K, F2 T. D
  35.   else   wBitCount = 24;
    . ?3 G# y& _# [0 {: d! y9 [
  36.   GetObject(hBitmap, sizeof(Bitmap), (LPSTR)&Bitmap);
    0 _2 x9 Z5 _, V& O+ U
  37.   bi.biSize = sizeof(BITMAPINFOHEADER);
    5 u7 C! C5 n/ \8 p9 I* w
  38.   bi.biWidth = Bitmap.bmWidth;
    1 C0 X: Y2 s2 f& _$ ^5 q4 J
  39.   bi.biHeight = Bitmap.bmHeight;
    $ |2 L: M. i: p
  40.   bi.biPlanes = 1;0 e" j# ?4 B8 x( E
  41.   bi.biBitCount = wBitCount;2 n- f0 Q" K/ o; N, _( l& `
  42.   bi.biCompression = BI_RGB;
    " Y: \5 K4 S6 _6 D
  43.   bi.biSizeImage = 0;( l/ M! q* T, g7 b6 h+ C- b' I/ H( J
  44.   bi.biXPelsPerMeter = 0;5 M$ z& G1 ?7 K6 N/ C+ d7 b
  45.   bi.biYPelsPerMeter = 0;- g, @2 g) w$ j' O. x
  46.   bi.biClrImportant = 0;
    1 u) r) ^6 c* r
  47.   bi.biClrUsed = 0;: x8 Z' V& s$ d2 u
  48.   dwBmBitsSize = ((Bitmap.bmWidth * wBitCount + 31) / 32) * 4 * Bitmap.bmHeight;' G" Z, p# z5 {% i. O! R/ ]
  49.   //为位图内容分配内存
    ( |0 X4 F8 Q: _; c* d* G( q
  50.   hDib = GlobalAlloc(GHND, dwBmBitsSize + dwPaletteSize + sizeof(BITMAPINFOHEADER));) F# _) |* g+ H$ N; D
  51.   lpbi = (LPBITMAPINFOHEADER)GlobalLock(hDib);! _0 A3 G6 n9 u( \/ L# q
  52.   *lpbi = bi;: x) J" @; V4 i8 a8 W, B! h

  53. & u2 b6 {* M$ K! B3 @
  54.   // 处理调色板  
    : b0 h/ g9 E: P
  55.   hPal = GetStockObject(DEFAULT_PALETTE);
    0 t6 h  w0 e9 u+ J& Q5 R
  56.   if (hPal)
    ( f! y, ]' r' x% _( X9 W7 J3 o
  57.   {
    : _" ?; ~& D: \8 m6 K: u2 g8 h
  58.     hDC = ::GetDC(NULL);! M9 Z- k' E7 ~' E6 [' \
  59.     hOldPal = ::SelectPalette(hDC, (HPALETTE)hPal, FALSE);
    2 j6 u( p+ W: z
  60.     RealizePalette(hDC);
    * q1 [# G  e+ j" V& @0 a8 I
  61.   }( j; s- x/ Z% X" p; e8 Q
  62.   // 获取该调色板下新的像素值
    ' s2 r9 |! t. L
  63.   GetDIBits(hDC, hBitmap, 0, (UINT)Bitmap.bmHeight, (LPSTR)lpbi + sizeof(BITMAPINFOHEADER) + dwPaletteSize, (BITMAPINFO*)lpbi, DIB_RGB_COLORS);
    ' j& T1 t- l2 u3 ?
  64.   //恢复调色板  
    3 ^" S& x) }0 h, g% p0 w* h8 M
  65.   if (hOldPal)' F; h. G5 l3 n- B& Z
  66.   {
    % G4 }1 W6 E  @2 Y- X0 e" i
  67.     ::SelectPalette(hDC, (HPALETTE)hOldPal, TRUE);9 H$ c1 l! i0 ?$ {  C
  68.     RealizePalette(hDC);4 L4 S3 Z  ?( @. @$ G( h4 H+ J
  69.     ::ReleaseDC(NULL, hDC);: l$ P: ?$ C* d6 v& _0 q4 |
  70.   }6 [9 w( u4 l: Z* I3 k
  71.   //创建位图文件  
    + s8 Q5 ?( Z  R9 E! J/ o; B
  72.   fh = CreateFile(FileName, GENERIC_WRITE, 0, NULL, CREATE_ALWAYS,0 G) k+ V) d2 E6 e# C4 v" V& I  r
  73.           FILE_ATTRIBUTE_NORMAL | FILE_FLAG_SEQUENTIAL_SCAN, NULL);( s# I) n0 A' p2 P0 }2 F
  74.   if (fh == INVALID_HANDLE_VALUE)  return FALSE;
    - }- z! g9 j5 ~
  75.   // 设置位图文件头 9 b) M1 l0 m. `( [
  76.   bmfHdr.bfType = 0x4D42; // "BM" , {) V2 y% s2 d+ `
  77.   dwDIBSize = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER) + dwPaletteSize + dwBmBitsSize;  U& P+ a: r! i+ y
  78.   bmfHdr.bfSize = dwDIBSize;
    2 a  \$ O  d( ^! \+ i2 ^
  79.   bmfHdr.bfReserved1 = 0;% e- w" O( h  _+ @. g" y
  80.   bmfHdr.bfReserved2 = 0;
    6 S8 A3 H' r5 l# ^% |9 G# C; @
  81.   bmfHdr.bfOffBits = (DWORD)sizeof(BITMAPFILEHEADER) + (DWORD)sizeof(BITMAPINFOHEADER) + dwPaletteSize;
    4 k. i$ l# E, U( b
  82.   // 写入位图文件头
    3 U& b/ C" N7 ]+ d1 ]
  83.   WriteFile(fh, (LPSTR)&bmfHdr, sizeof(BITMAPFILEHEADER), &dwWritten, NULL);
    $ @. U; G  T) U1 \; `
  84.   // 写入位图文件其余内容
    , A6 D& x. c  T$ e% D, f! ]
  85.   WriteFile(fh, (LPSTR)lpbi, dwDIBSize, &dwWritten, NULL);6 i$ E9 D1 _: r! n- E# z( H
  86.   //清除  
    8 ]5 K+ o, u" n: H
  87.   GlobalUnlock(hDib);
    # G3 v/ F1 a3 K& A
  88.   GlobalFree(hDib);
    " |5 K+ l: q, |2 Z3 n7 Y1 ]% k/ d
  89.   CloseHandle(fh);
    & X$ w" W: F* q- D9 A! a( h
  90. # M2 c  W' U" I$ G& b6 w2 }5 A0 H: a
  91.   return TRUE;) Y$ @8 Z* G/ g7 Z$ ?2 A6 y+ g
  92. }
      c/ g' H$ s5 e& e1 }( p  c
复制代码
  1. #!/usr/bin/python
    5 r# W& X3 V$ h  C! M0 D: a
  2. # -*- coding: utf-8 -*-& q  L0 L3 _8 G7 d* M# ~) e
  3. / b9 `$ B6 Z$ J
  4. from ctypes import windll. I; U6 k; u& B9 a8 _6 V
  5. from win32clipboard import *
    ; R0 R( t5 X( t: L" x
  6. import tempfile
    : J6 h2 `: \) `( i  G8 S! V
  7. import os
    . t6 Y$ H2 e( P" H9 K4 {) K8 n# G8 J
  8. from time import sleep8 G9 b7 I9 l$ i3 @

  9. # i; W$ @9 ], O: p' l: g
  10. if __name__ == '__main__':& \; G( p- ^4 Q( j  Y% X
  11.     while True:! i: b! F9 E3 s
  12.         try:
    - U) O# F- ~& w$ x' y1 ]
  13.             OpenClipboard()
    3 Y2 B! ]7 e' G2 d/ _
  14.         except Exception:+ t8 z# i. h+ z' E* Y2 i
  15.             print("拒绝访问!")
    ) p7 O8 b- w+ |
  16.             break' l, A( w' q# k
  17.         else:" _2 M+ ]+ ?. t! k
  18.             if IsClipboardFormatAvailable(CF_BITMAP):
    / y% l8 b& `/ E$ Q" ~
  19.                 try:
    , J/ A! z- r1 ^& T/ u; E3 W: Y) K( V
  20.                     dll = windll.LoadLibrary("./SaveBmp.dll")/ {6 T! _4 [, }7 i6 {' V# X. }
  21.                 except FileNotFoundError:
    9 f- ]+ |" V; \9 |/ w1 V" ?, i" Z
  22.                     print("依赖库不存在~")
    $ V9 q1 p5 q9 y/ Y
  23.                 else:
    6 I: \4 k/ z% {" d5 A+ E
  24.                     tmpfd, tempfilename = tempfile.mkstemp(suffix='.bmp')! e9 ?) b- n3 H" Y
  25.                     os.close(tmpfd)1 \, P# l4 N0 K
  26. ! Q" @$ R& v6 B7 w) M/ A
  27.                     hbitmap = GetClipboardData(CF_BITMAP)% u3 J, I5 D& P5 ^- ^' F
  28.                     dll.SaveBmp(hbitmap, tempfilename)
    " M6 ]! `" ], J7 y
  29.                     print(tempfilename): O# t. R. x! t' k
  30.                     EmptyClipboard()& d4 N# |) \$ t5 X' A
  31.             CloseClipboard()
    * q: C4 X' Z/ M6 u
  32.             sleep(0.2)' T. Q  q' J& C0 K9 N  D
复制代码
转发自派生社区
Python交流群:1047602540
) y4 S9 R1 ~0 J; H





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