数学建模社区-数学中国

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

作者: 檀俾九    时间: 2021-1-16 11:27
标题: Python-监听并自动保存剪贴板图片到临时目录
  1. #include <iostream>
    + J1 _0 n8 ]1 {" p
  2. #include <Windows.h>( U, {( g& Y% Z
  3. ) O& c' M4 l7 y  C; ?
  4. extern "C" {- P5 ?  W! x. g* ^4 q: V
  5.   __declspec(dllexport) BOOL SaveBmp(HBITMAP hBitmap, const wchar_t* FileName);
    / O, R$ x+ k- j0 N) G2 O8 @
  6. }; s, N, K$ m/ }
  7. 1 o1 M% N1 m( H  {1 g
  8. BOOL SaveBmp(HBITMAP hBitmap, const wchar_t* FileName)9 X0 ^+ x0 Y' @4 L1 C$ x5 U
  9. {+ F) B0 M6 w+ M" @7 d
  10.   //设备描述表
    ( g) A. S- y/ U: \) s
  11.   HDC hDC;
    % J  h/ A. t) v" t; X: {5 c
  12.   //当前分辨率下每象素所占字节数
    0 u) C1 w' `+ u# u
  13.   int iBits;* W- k9 R0 M1 R4 B
  14.   //位图中每象素所占字节数
    5 H& x& B( _" q. ~' T( [# z
  15.   WORD wBitCount;1 y1 X: t3 S7 i. |. `
  16.   //定义调色板大小, 位图中像素字节大小 ,位图文件大小 , 写入文件字节数 " {+ R( @4 f+ [
  17.   DWORD dwPaletteSize = 0, dwBmBitsSize = 0, dwDIBSize = 0, dwWritten = 0;) q! r2 x& G; z3 Y1 ?
  18.   //位图属性结构
    1 q( C/ B2 y' x+ K4 |& E7 c0 _
  19.   BITMAP Bitmap;
    ' D# c+ l9 h# h
  20.   //位图文件头结构
    : ]( |$ H) T" D5 U
  21.   BITMAPFILEHEADER bmfHdr;7 i2 P$ e9 x9 y- l) w6 `* E
  22.   //位图信息头结构 ) y, m1 d: |, q; J" V( L- w1 {; a$ |
  23.   BITMAPINFOHEADER bi;
    / g" X) s8 A* R7 u- X" ~. J5 C
  24.   //指向位图信息头结构  8 G, M: k* c$ e6 `5 O
  25.   LPBITMAPINFOHEADER lpbi;
    ' G% i5 Z0 `2 e" R; R. a" z7 U
  26.   //定义文件,分配内存句柄,调色板句柄 " j% v* w2 M5 z& G% U
  27.   HANDLE fh, hDib, hPal, hOldPal = NULL;" @6 m# ^2 N1 Q9 ~) ^* f
  28.   //计算位图文件每个像素所占字节数
    8 k* d# }+ V5 O
  29.   hDC = CreateDC(L"DISPLAY", NULL, NULL, NULL);# w. K' a. U' U0 b/ p& s& `% P  z' q
  30.   iBits = GetDeviceCaps(hDC, BITSPIXEL) * GetDeviceCaps(hDC, PLANES);6 a" j8 H! R; h! o
  31.   DeleteDC(hDC);" [0 f& R: {/ I
  32.   if (iBits <= 1) wBitCount = 1;. U" C/ S1 E! S! c% _6 _& ^
  33.   else if (iBits <= 4)  wBitCount = 4;4 q6 N$ G! v: N) C  `
  34.   else if (iBits <= 8)  wBitCount = 8;
    & u- G4 s0 t+ j& \# e7 e. A
  35.   else   wBitCount = 24;
    $ Q! l- y# I  g7 T2 ]) V) Z
  36.   GetObject(hBitmap, sizeof(Bitmap), (LPSTR)&Bitmap);2 j! G1 ]: k2 j
  37.   bi.biSize = sizeof(BITMAPINFOHEADER);
    2 j) p  x$ i+ @; y& S
  38.   bi.biWidth = Bitmap.bmWidth;4 h6 _1 y+ ?' \: V3 Z! V
  39.   bi.biHeight = Bitmap.bmHeight;6 F8 p# @5 c" P, r
  40.   bi.biPlanes = 1;" f# Q/ e& K" d  z8 r9 V
  41.   bi.biBitCount = wBitCount;; S' e5 U! N- i1 J% X+ M
  42.   bi.biCompression = BI_RGB;
    # e5 F' l) z( A2 T6 |
  43.   bi.biSizeImage = 0;
    . G- r6 M5 `3 |5 B3 U! E5 H' ^8 c/ c0 x
  44.   bi.biXPelsPerMeter = 0;
    : [8 l7 b6 Q4 K
  45.   bi.biYPelsPerMeter = 0;
    0 _) l% Y* ~% A
  46.   bi.biClrImportant = 0;
    9 F6 G" v8 L8 r* t! d
  47.   bi.biClrUsed = 0;: j7 z" R: D8 G7 B
  48.   dwBmBitsSize = ((Bitmap.bmWidth * wBitCount + 31) / 32) * 4 * Bitmap.bmHeight;4 c* ?; W+ \' E7 t" c1 s- c
  49.   //为位图内容分配内存 4 G# g( p8 c; c4 q8 B7 U; E
  50.   hDib = GlobalAlloc(GHND, dwBmBitsSize + dwPaletteSize + sizeof(BITMAPINFOHEADER));; O+ z' d' a2 A. K: o0 ~
  51.   lpbi = (LPBITMAPINFOHEADER)GlobalLock(hDib);
    5 U6 P+ j) C/ Q$ g1 D6 R
  52.   *lpbi = bi;" x1 G) Y/ d+ a. p$ K/ f: b
  53. ) F8 J$ y- ?  I  u5 w
  54.   // 处理调色板  
    4 {% j7 b3 }8 `6 b! ]
  55.   hPal = GetStockObject(DEFAULT_PALETTE);
    ! P4 ^4 t/ P$ i) Y0 I2 }" I, ~
  56.   if (hPal)( w: i- r- S; F: }. e
  57.   {3 k9 M" h/ p1 K) |" \& T- T
  58.     hDC = ::GetDC(NULL);- A9 ~8 Y: ^( ^4 z
  59.     hOldPal = ::SelectPalette(hDC, (HPALETTE)hPal, FALSE);
    , ^  j/ c- C' I4 @, v
  60.     RealizePalette(hDC);6 A, A$ P' }7 ?% O" h
  61.   }1 I( m4 Y! r0 ^: H% \( j6 C' N
  62.   // 获取该调色板下新的像素值
    1 ?# c* {7 q2 O# J1 _2 e& o
  63.   GetDIBits(hDC, hBitmap, 0, (UINT)Bitmap.bmHeight, (LPSTR)lpbi + sizeof(BITMAPINFOHEADER) + dwPaletteSize, (BITMAPINFO*)lpbi, DIB_RGB_COLORS);; i1 O# N3 Z2 O# A, f
  64.   //恢复调色板  : m6 R2 g" r8 ~4 r
  65.   if (hOldPal)
    4 `8 }2 q" C% R. k8 O7 T) G) }6 j
  66.   {
    ' i# J" I. j5 E& q( l$ C: Y
  67.     ::SelectPalette(hDC, (HPALETTE)hOldPal, TRUE);
    3 G6 i8 b0 y/ }* w& C6 a
  68.     RealizePalette(hDC);- F0 b3 N; E! y  s; p
  69.     ::ReleaseDC(NULL, hDC);
    ) z/ N& r( v+ U( d+ k
  70.   }
    ( `( m% |8 w# R, P9 p4 L- E
  71.   //创建位图文件  
    & l% J) j. z5 i6 \! a
  72.   fh = CreateFile(FileName, GENERIC_WRITE, 0, NULL, CREATE_ALWAYS,6 @& {, Y) a4 Q. c7 A2 U
  73.           FILE_ATTRIBUTE_NORMAL | FILE_FLAG_SEQUENTIAL_SCAN, NULL);" b1 L# ?9 ?. x% v$ W+ X
  74.   if (fh == INVALID_HANDLE_VALUE)  return FALSE;
    2 H5 R# c7 d  {# Q+ s
  75.   // 设置位图文件头
    0 D9 k, s8 z5 U# k
  76.   bmfHdr.bfType = 0x4D42; // "BM" - X) P& q4 {( o6 F1 L1 R
  77.   dwDIBSize = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER) + dwPaletteSize + dwBmBitsSize;
    % O9 o$ J$ G$ H) ^% X
  78.   bmfHdr.bfSize = dwDIBSize;
    2 N5 i; @0 D- s" I( r  L
  79.   bmfHdr.bfReserved1 = 0;4 h( K+ S. L- u, m) _
  80.   bmfHdr.bfReserved2 = 0;0 E& {4 O! G# K5 b4 }' b# X
  81.   bmfHdr.bfOffBits = (DWORD)sizeof(BITMAPFILEHEADER) + (DWORD)sizeof(BITMAPINFOHEADER) + dwPaletteSize;/ I& y+ J9 T- U; w  ~" g, X
  82.   // 写入位图文件头 # D; Z- T" k5 ^
  83.   WriteFile(fh, (LPSTR)&bmfHdr, sizeof(BITMAPFILEHEADER), &dwWritten, NULL);
    : L8 F' `" w. i
  84.   // 写入位图文件其余内容 - v5 m5 E* d) \" x; ^/ O
  85.   WriteFile(fh, (LPSTR)lpbi, dwDIBSize, &dwWritten, NULL);5 f/ n6 i# {) ]* S, \0 _
  86.   //清除  
    ; C9 i" i3 f: c# t, X% j
  87.   GlobalUnlock(hDib);
    : f2 L4 f) i# ^) S% j4 u- a9 q( S  R
  88.   GlobalFree(hDib);7 p1 M; n9 E2 [8 k9 R2 C
  89.   CloseHandle(fh);  A0 m: W& ]8 a4 Q

  90. " I! ^- ]' `9 A; r4 \. N
  91.   return TRUE;
    " \) ?  J) k  b# k
  92. }& G9 V- V! v% M
复制代码
  1. #!/usr/bin/python
    5 q7 l( |; Y) V0 W. W. f# q+ y
  2. # -*- coding: utf-8 -*-& f- {& ^0 g: C: S. k; T

  3. : B( ^. B" `! G# I. a1 w
  4. from ctypes import windll
    $ o9 N9 B; b: U! K9 j: b7 q6 C
  5. from win32clipboard import *
    0 p2 U8 P% t( [0 C/ `) D
  6. import tempfile
    ; W) ~( R: B% ^% {& H6 k
  7. import os
    * s' X$ b  X% n/ @) f
  8. from time import sleep
    ! I2 W$ d0 w$ O) N

  9. 2 n* f0 G0 O7 L/ b4 k; v7 K, U
  10. if __name__ == '__main__':
    5 T. U! A5 C% X6 j" S% |
  11.     while True:
    ' g: s/ A" S- n, D, s& z) E
  12.         try:
    , N7 y+ @/ r/ F0 |6 r0 y" a8 X
  13.             OpenClipboard()
    1 Q  v1 [& `1 O
  14.         except Exception:, ^; f! f7 y& f4 S+ @
  15.             print("拒绝访问!")! |/ g9 D1 _: i% `; ?3 ^6 R( J
  16.             break
    - G9 j' W: C  B$ r
  17.         else:8 p# K. M8 I" k6 V6 N8 Z! N9 g! r
  18.             if IsClipboardFormatAvailable(CF_BITMAP):
    , o' }" s7 q8 q7 ^3 B- ^3 Z3 N7 n
  19.                 try:
    , ?7 k) Q: i3 p- D( v8 s6 i7 Q
  20.                     dll = windll.LoadLibrary("./SaveBmp.dll")
    9 z0 e+ e' B2 d7 g& }, v; }' G
  21.                 except FileNotFoundError:$ X- l2 a& [) g; i5 C8 \
  22.                     print("依赖库不存在~")
    1 A% H8 @, B, o) e
  23.                 else:
    1 T2 X8 |! y% t1 O& O" e: j4 G
  24.                     tmpfd, tempfilename = tempfile.mkstemp(suffix='.bmp')# a) Z, X/ ~- T
  25.                     os.close(tmpfd)" A( i3 C5 v" m

  26. ( y' G4 X3 p: E! E. z
  27.                     hbitmap = GetClipboardData(CF_BITMAP)
    5 I! l7 G4 e7 V" G7 f! E% f; R
  28.                     dll.SaveBmp(hbitmap, tempfilename)
    : Z, d9 l( \. o8 G$ d6 l3 l
  29.                     print(tempfilename)! U, g5 L5 O6 {, h
  30.                     EmptyClipboard()  f* \: U8 P9 z  `/ v2 X! x9 e
  31.             CloseClipboard()3 I2 Z. \+ S0 z# N
  32.             sleep(0.2)
    - u0 b( ^/ W. d6 L' Q! T6 d1 T
复制代码
转发自派生社区
Python交流群:1047602540

0 B& ^% q. `2 N




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