数学建模社区-数学中国

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

作者: 檀俾九    时间: 2021-1-16 11:27
标题: Python-监听并自动保存剪贴板图片到临时目录
  1. #include <iostream>
    ! s' _. w/ G- r9 ]; P9 r
  2. #include <Windows.h>" u1 Y" \, ]4 W" s& o
  3. / |, z- _2 H/ @7 U5 b  d1 ^1 X" u
  4. extern "C" {
    * V. g3 F1 ?: I3 R- q' m& y
  5.   __declspec(dllexport) BOOL SaveBmp(HBITMAP hBitmap, const wchar_t* FileName);
    & d, w& T& K: a3 s
  6. }
    $ d! E/ L. }, O3 R" M! q

  7. : ?! d0 ^# C6 |; K2 y7 J
  8. BOOL SaveBmp(HBITMAP hBitmap, const wchar_t* FileName)
    4 x6 N& A* o3 v4 b/ \
  9. {
      S1 z/ y: t( R6 `: |& z
  10.   //设备描述表
    $ V0 L- P5 D/ d9 H4 c
  11.   HDC hDC;/ D% Y  B- K/ J( [, |. f: x
  12.   //当前分辨率下每象素所占字节数
    # P7 y4 @9 Z7 ?' s) q! W2 P% x4 B
  13.   int iBits;5 p, L4 d8 N" z  O; |! |2 v
  14.   //位图中每象素所占字节数0 Q0 ^' m  O7 e& }! R; S2 R( O/ q2 n
  15.   WORD wBitCount;- p0 w0 a( W6 I) e, v( k0 Y1 }
  16.   //定义调色板大小, 位图中像素字节大小 ,位图文件大小 , 写入文件字节数 : r, ^+ J# F. @, M$ T; G% X
  17.   DWORD dwPaletteSize = 0, dwBmBitsSize = 0, dwDIBSize = 0, dwWritten = 0;- i% I  e4 _3 j
  18.   //位图属性结构 8 }" m  I" A4 C' V9 Z$ `, h2 p6 s
  19.   BITMAP Bitmap;
    3 ^8 {! d' K5 U% a$ ]) I/ J
  20.   //位图文件头结构
    ' X7 p% K, ]0 v1 e) N
  21.   BITMAPFILEHEADER bmfHdr;
    8 m) c  E- I+ R& P2 A
  22.   //位图信息头结构
    ' j8 Q0 Q# u# _4 I, v+ o
  23.   BITMAPINFOHEADER bi;
    3 P$ B3 _# h0 r- W) X
  24.   //指向位图信息头结构  & K0 N8 e  |' l0 q4 R' R
  25.   LPBITMAPINFOHEADER lpbi;9 @( w5 n0 D2 u
  26.   //定义文件,分配内存句柄,调色板句柄 # _( R; J8 Q, k: L4 B
  27.   HANDLE fh, hDib, hPal, hOldPal = NULL;
    + p/ m% a  E$ D5 K0 m; C8 p
  28.   //计算位图文件每个像素所占字节数
    7 ?5 G+ T2 W8 y; |
  29.   hDC = CreateDC(L"DISPLAY", NULL, NULL, NULL);5 ]( c  H& S4 c4 n* m/ R
  30.   iBits = GetDeviceCaps(hDC, BITSPIXEL) * GetDeviceCaps(hDC, PLANES);
    3 ?" x$ G+ ~2 p' q- i1 `! N, S  A
  31.   DeleteDC(hDC);
    6 d; {+ o" S; J1 Z: s! m
  32.   if (iBits <= 1) wBitCount = 1;$ [# h9 X5 X0 h7 Q$ B0 K( g! ~/ f6 d
  33.   else if (iBits <= 4)  wBitCount = 4;
    , O5 C- [* N2 Q, T* [
  34.   else if (iBits <= 8)  wBitCount = 8;7 Z$ a! T# ]; V7 W+ i! H3 D
  35.   else   wBitCount = 24;
    * V7 b, Q3 ]: c9 B3 k; ^
  36.   GetObject(hBitmap, sizeof(Bitmap), (LPSTR)&Bitmap);
    " S- O: W: X7 o' O0 T' O
  37.   bi.biSize = sizeof(BITMAPINFOHEADER);/ m; S+ P9 X; x& z" P6 e* D
  38.   bi.biWidth = Bitmap.bmWidth;8 z! Z% u5 o# ]* N" w
  39.   bi.biHeight = Bitmap.bmHeight;
    : l  F& [2 l8 j( X* W1 J3 z
  40.   bi.biPlanes = 1;
    . S8 u7 I9 f# @: f3 Z
  41.   bi.biBitCount = wBitCount;
    7 o' \5 L4 B0 q- @2 G" i+ p
  42.   bi.biCompression = BI_RGB;
    / O$ y  d6 J$ f1 m8 B3 n, a9 A
  43.   bi.biSizeImage = 0;
    * F* w7 i1 f% ?' W' Q
  44.   bi.biXPelsPerMeter = 0;
    $ Q* E1 D" O+ k0 c9 c3 o3 Q0 Y
  45.   bi.biYPelsPerMeter = 0;: o# J6 f( S( ~: ~6 g* V' I9 v
  46.   bi.biClrImportant = 0;
    2 e4 F7 ^) T& h
  47.   bi.biClrUsed = 0;0 g$ ?# M  c1 e9 C# w6 R9 ]/ L: C
  48.   dwBmBitsSize = ((Bitmap.bmWidth * wBitCount + 31) / 32) * 4 * Bitmap.bmHeight;
    / s1 |; H$ b* R6 y7 l8 N5 A* j( w
  49.   //为位图内容分配内存
    ( o  k% n' F8 v3 ]9 |6 P/ v
  50.   hDib = GlobalAlloc(GHND, dwBmBitsSize + dwPaletteSize + sizeof(BITMAPINFOHEADER));
    7 c  y  ]# U8 o2 ^7 _) b
  51.   lpbi = (LPBITMAPINFOHEADER)GlobalLock(hDib);
    * K9 M! M3 N% t3 U
  52.   *lpbi = bi;. n- I% ?  c: u) Q' w# E

  53. / @2 q; N' F  u
  54.   // 处理调色板  4 c2 j: c3 s: F! }+ V% J7 m
  55.   hPal = GetStockObject(DEFAULT_PALETTE);
    ( f$ ^  _6 |% a3 n' K# Y
  56.   if (hPal)
    # i* C! R& I0 }  S
  57.   {
    1 W/ D, ?' Y7 E! ^; B( w1 T
  58.     hDC = ::GetDC(NULL);
    2 H9 H9 k( L2 ?( t! y/ c$ ~7 f/ O
  59.     hOldPal = ::SelectPalette(hDC, (HPALETTE)hPal, FALSE);" h9 n  O+ {( B: f8 Q6 f* B& O
  60.     RealizePalette(hDC);
    6 P3 l: p  S2 X# G' L. k! S4 Q! p
  61.   }
    ; Z4 r- F6 J7 F6 Z
  62.   // 获取该调色板下新的像素值 % T$ r9 q& S% V
  63.   GetDIBits(hDC, hBitmap, 0, (UINT)Bitmap.bmHeight, (LPSTR)lpbi + sizeof(BITMAPINFOHEADER) + dwPaletteSize, (BITMAPINFO*)lpbi, DIB_RGB_COLORS);7 G1 ^) v& {) v
  64.   //恢复调色板  
    : ]1 l( Z$ |" M, F2 `0 \
  65.   if (hOldPal)
    & T7 s' d, R: H' H/ U) D5 N! W5 p
  66.   {
    3 t! {5 C" P& u; ]" ]3 s
  67.     ::SelectPalette(hDC, (HPALETTE)hOldPal, TRUE);& }4 D* z) [4 ~
  68.     RealizePalette(hDC);
    5 X* ?6 y- b8 D; e
  69.     ::ReleaseDC(NULL, hDC);
    9 N* e( s* u; i- z$ R$ R5 j, [
  70.   }
    2 ?9 v' ]$ C: t# |' f! J
  71.   //创建位图文件  ( |5 D/ B) E7 ]& ?- |. Q. j) d
  72.   fh = CreateFile(FileName, GENERIC_WRITE, 0, NULL, CREATE_ALWAYS,
    / t! m2 P( q( ?& l
  73.           FILE_ATTRIBUTE_NORMAL | FILE_FLAG_SEQUENTIAL_SCAN, NULL);
    ; E% F$ v6 J8 r" ~
  74.   if (fh == INVALID_HANDLE_VALUE)  return FALSE;6 E, ~$ M4 {/ {6 d8 W+ S+ ~: f- k# S
  75.   // 设置位图文件头
    , P' Y, w! `( G
  76.   bmfHdr.bfType = 0x4D42; // "BM"   ?- _/ w0 D) c) f( z5 }
  77.   dwDIBSize = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER) + dwPaletteSize + dwBmBitsSize;8 i% ^5 T6 P4 \
  78.   bmfHdr.bfSize = dwDIBSize;; h0 j5 I# g8 P. B
  79.   bmfHdr.bfReserved1 = 0;* W, T6 @9 G" d
  80.   bmfHdr.bfReserved2 = 0;+ N% v) L2 w- _
  81.   bmfHdr.bfOffBits = (DWORD)sizeof(BITMAPFILEHEADER) + (DWORD)sizeof(BITMAPINFOHEADER) + dwPaletteSize;+ y' ?/ f6 p9 H4 h
  82.   // 写入位图文件头 " @* L- [8 I1 s
  83.   WriteFile(fh, (LPSTR)&bmfHdr, sizeof(BITMAPFILEHEADER), &dwWritten, NULL);
    : y4 u5 i. ?+ Q; c' E% D  a" i
  84.   // 写入位图文件其余内容 1 G. o& K/ y9 Q' z
  85.   WriteFile(fh, (LPSTR)lpbi, dwDIBSize, &dwWritten, NULL);
    - ~: P, e' l. ]8 k- ?5 P+ L+ B
  86.   //清除  ( a2 X& A1 _$ [9 m: ~
  87.   GlobalUnlock(hDib);
    5 ?* b1 X4 K$ O; k7 T. `3 n
  88.   GlobalFree(hDib);7 r: p# ?5 ?9 M% F
  89.   CloseHandle(fh);6 D+ d9 r" U' E  ~9 ]) C
  90. 0 m! k/ c6 d* v% G- J
  91.   return TRUE;( y4 m: u9 ?" m$ t5 ^4 ~
  92. }* @7 A" @' u) X. w2 f
复制代码
  1. #!/usr/bin/python1 B( z5 f1 V  A0 \6 q+ s
  2. # -*- coding: utf-8 -*-
    , f/ g) {% B8 V6 L

  3. 2 k0 G0 X- a7 _4 n
  4. from ctypes import windll2 u9 }5 L1 s2 U2 x8 [9 A6 q' g
  5. from win32clipboard import *
    - G( t6 ^% ?/ k" n& j& S
  6. import tempfile
    4 ^$ B( J. ]* N+ V' Y. |* ~
  7. import os
    $ Q& {3 \& r2 J
  8. from time import sleep
    ( ?  |7 ~) o5 W9 J8 F

  9. 1 p: v1 Q5 m1 e
  10. if __name__ == '__main__':
    1 o, }. z; p: g* m' G
  11.     while True:
    . t$ k2 u# O: `2 h2 \; M$ Q  m
  12.         try:
    $ D7 H& G" ]& L) B) j, {9 g: q
  13.             OpenClipboard(), Z. D! Y) C: `0 w$ j- G
  14.         except Exception:! F. _# P% w( E% p. M4 {. M
  15.             print("拒绝访问!")5 @1 E6 ~5 D# Y8 D: S9 {) n
  16.             break
    ) t2 K& X. p5 Y. V0 }
  17.         else:7 p( f5 K5 d$ q% f3 O
  18.             if IsClipboardFormatAvailable(CF_BITMAP):. I3 v* [2 a' Q# o. {. V, b- v7 ~1 V; g
  19.                 try:
    . O5 m& W3 c' Z* `. l3 R" T/ Q
  20.                     dll = windll.LoadLibrary("./SaveBmp.dll")) ^& c8 C; M1 e# X+ J7 X. I
  21.                 except FileNotFoundError:
    , @8 m6 x( o: D. i0 f
  22.                     print("依赖库不存在~")
    7 Q- X1 ^4 z4 ~7 {
  23.                 else:
    * V# i# f8 U; C3 P
  24.                     tmpfd, tempfilename = tempfile.mkstemp(suffix='.bmp')
    5 Q1 _0 `% k% O7 {" C- T! j
  25.                     os.close(tmpfd)4 S: L$ N9 h$ F# p% g: h5 l

  26. , r, e. R3 j0 C, V6 o
  27.                     hbitmap = GetClipboardData(CF_BITMAP)3 o7 l1 b: G4 {! a' R
  28.                     dll.SaveBmp(hbitmap, tempfilename)
    ( i  I, P, J5 B9 X( D, \+ k* j
  29.                     print(tempfilename)2 `* p" _9 u: ?! a4 @! z- I5 [
  30.                     EmptyClipboard()$ U( z; H/ p7 ?# k& f3 m* P
  31.             CloseClipboard()8 e; P* o) c% b1 ~/ C  U/ \
  32.             sleep(0.2)
    * f4 L, B0 V- i. D
复制代码
转发自派生社区
Python交流群:1047602540
  g2 Y* {9 |+ N7 V/ ?* ?9 J+ d. S" X





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