数学建模社区-数学中国

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

作者: 檀俾九    时间: 2021-1-16 11:27
标题: Python-监听并自动保存剪贴板图片到临时目录
  1. #include <iostream>
    - k7 d- C5 n& D& T5 a# H
  2. #include <Windows.h>( I+ b9 Q8 J5 N0 ]

  3. . u% r. T" a/ @; m/ _, C! V9 g. c
  4. extern "C" {
    / ]/ [2 V8 d1 l% y5 E
  5.   __declspec(dllexport) BOOL SaveBmp(HBITMAP hBitmap, const wchar_t* FileName);
    " ^1 `8 q5 j# e; C5 b8 }& K& S$ P& X
  6. }- C# q+ N* G$ v9 l' M

  7. 7 O3 m( H- J. M" j8 U1 Q$ A
  8. BOOL SaveBmp(HBITMAP hBitmap, const wchar_t* FileName): u9 c" q- H+ `' s
  9. {8 m& L. T2 C9 ]
  10.   //设备描述表2 w  ]! e" L  W9 F0 V! z$ C- Q
  11.   HDC hDC;# R5 \, I, H- F
  12.   //当前分辨率下每象素所占字节数
    2 {% H7 i; U3 x! @7 [4 k8 S
  13.   int iBits;
    2 e( C6 N/ m9 [/ d6 e- S1 q4 [
  14.   //位图中每象素所占字节数5 l' b% A& |) F; o
  15.   WORD wBitCount;
    & V/ a; e) F# S3 C& w0 ^# Z& y
  16.   //定义调色板大小, 位图中像素字节大小 ,位图文件大小 , 写入文件字节数
    ! o7 w, }4 V! ^/ K
  17.   DWORD dwPaletteSize = 0, dwBmBitsSize = 0, dwDIBSize = 0, dwWritten = 0;5 r' L, ?3 _" B7 l' f/ g0 m
  18.   //位图属性结构   U7 G; j0 K# [0 [$ |, `
  19.   BITMAP Bitmap;
    ; h$ @9 L, i8 U
  20.   //位图文件头结构
    - D! u; ~( L3 ?3 s4 B5 Z
  21.   BITMAPFILEHEADER bmfHdr;
    - s% V" x+ _: Q3 a/ A
  22.   //位图信息头结构
    - g+ r1 T* S/ e" N7 r. a; h% D
  23.   BITMAPINFOHEADER bi;% J: h0 P4 y( K# z: S" ^' }
  24.   //指向位图信息头结构    |. u/ F* p6 P- ?; @
  25.   LPBITMAPINFOHEADER lpbi;
    ; s+ B" c8 D! a8 Y
  26.   //定义文件,分配内存句柄,调色板句柄 6 Y6 y" e- ?0 G1 r4 q
  27.   HANDLE fh, hDib, hPal, hOldPal = NULL;
    : H' A' c. f% |1 P
  28.   //计算位图文件每个像素所占字节数   O; `2 j" j" i- h+ x/ K1 `
  29.   hDC = CreateDC(L"DISPLAY", NULL, NULL, NULL);" n: o: [  G1 I1 F) O" g: M
  30.   iBits = GetDeviceCaps(hDC, BITSPIXEL) * GetDeviceCaps(hDC, PLANES);0 b  c. Z- X& {, ^9 u
  31.   DeleteDC(hDC);
      ?- Q& f& v" A+ g
  32.   if (iBits <= 1) wBitCount = 1;8 L9 U$ v, Z2 f: Y$ I& J" g
  33.   else if (iBits <= 4)  wBitCount = 4;
    8 U0 j' O: E: l. t" j
  34.   else if (iBits <= 8)  wBitCount = 8;
    ! ], n, E/ N7 t. A' e0 e8 {
  35.   else   wBitCount = 24;
    , v3 {8 W* j- R2 T8 |% d9 i
  36.   GetObject(hBitmap, sizeof(Bitmap), (LPSTR)&Bitmap);
    6 U: Q2 ]5 a8 ~4 o7 L$ s0 r( z) A% Q
  37.   bi.biSize = sizeof(BITMAPINFOHEADER);
    5 f% g1 m+ Y1 ]/ k
  38.   bi.biWidth = Bitmap.bmWidth;: _$ M5 K9 f# ?  d9 I
  39.   bi.biHeight = Bitmap.bmHeight;. B0 L+ z7 M  ?) [
  40.   bi.biPlanes = 1;# Z& u% K/ S& L; w& r6 F
  41.   bi.biBitCount = wBitCount;5 D9 g1 l& f, h
  42.   bi.biCompression = BI_RGB;
    9 R1 l6 s% W( D0 s) L6 c
  43.   bi.biSizeImage = 0;* j( X8 I& |6 _
  44.   bi.biXPelsPerMeter = 0;
    , T, \$ }0 q2 t0 e
  45.   bi.biYPelsPerMeter = 0;  n( d& C$ P5 ?
  46.   bi.biClrImportant = 0;3 w) `0 L( m6 f& Q2 D( [
  47.   bi.biClrUsed = 0;
    4 c! Z) g- ?" e4 c, ^; B& [
  48.   dwBmBitsSize = ((Bitmap.bmWidth * wBitCount + 31) / 32) * 4 * Bitmap.bmHeight;2 n% D" g% t# B7 P) w( Y
  49.   //为位图内容分配内存 8 d, c$ j: D9 h( `& W
  50.   hDib = GlobalAlloc(GHND, dwBmBitsSize + dwPaletteSize + sizeof(BITMAPINFOHEADER));; E: r' L- p, B' L( B3 c5 c' {
  51.   lpbi = (LPBITMAPINFOHEADER)GlobalLock(hDib);
    ; l: G: G* r: a3 [0 l( x
  52.   *lpbi = bi;
    0 N  {6 J0 K# j

  53. 5 y; U& b; A0 B
  54.   // 处理调色板  / k. f" X+ N0 c" c$ }! K
  55.   hPal = GetStockObject(DEFAULT_PALETTE);
    + @6 J/ r& C7 ]* F
  56.   if (hPal)- i( j, ]6 A% a0 Y
  57.   {
    ; x, O& O4 r8 b. G+ V
  58.     hDC = ::GetDC(NULL);
    # s9 K3 E% R' ]8 l
  59.     hOldPal = ::SelectPalette(hDC, (HPALETTE)hPal, FALSE);6 W6 U) R+ {' l) L, ?7 V2 a4 j9 ~5 L+ A
  60.     RealizePalette(hDC);$ ?  i! n& ?0 l6 a8 ~* z  h
  61.   }8 ?" q0 i# u) f( ^& R& P. o
  62.   // 获取该调色板下新的像素值
    * v/ g7 i4 W/ d' m
  63.   GetDIBits(hDC, hBitmap, 0, (UINT)Bitmap.bmHeight, (LPSTR)lpbi + sizeof(BITMAPINFOHEADER) + dwPaletteSize, (BITMAPINFO*)lpbi, DIB_RGB_COLORS);3 L; n) Z9 X4 a. O0 |% s
  64.   //恢复调色板  ! c8 y" t8 f$ J5 a5 K$ M. p+ z
  65.   if (hOldPal)% B  n' ]  e9 m. [1 K
  66.   {% M, Y0 j$ D/ q. T  C. n( M4 W
  67.     ::SelectPalette(hDC, (HPALETTE)hOldPal, TRUE);
    & M9 E3 t7 d0 q1 v+ n0 ]: {) }
  68.     RealizePalette(hDC);
    3 g; q$ [4 H$ P* T
  69.     ::ReleaseDC(NULL, hDC);
    3 d  k, o5 [8 e8 d" e$ P
  70.   }7 W9 U. \/ U# M# P) T+ J( |
  71.   //创建位图文件  7 h6 j' m. I( x/ O. S) T
  72.   fh = CreateFile(FileName, GENERIC_WRITE, 0, NULL, CREATE_ALWAYS,$ ?! F9 U& Y* S3 o7 \
  73.           FILE_ATTRIBUTE_NORMAL | FILE_FLAG_SEQUENTIAL_SCAN, NULL);7 a. Q' W2 M/ I3 H- e! v* F
  74.   if (fh == INVALID_HANDLE_VALUE)  return FALSE;$ J7 A* l: W# s0 i2 M7 \1 Z
  75.   // 设置位图文件头 : V! E% e/ K3 [. d* t
  76.   bmfHdr.bfType = 0x4D42; // "BM"
    - H0 L2 Y4 b/ e
  77.   dwDIBSize = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER) + dwPaletteSize + dwBmBitsSize;
    ) N, Q1 S% _& R/ I8 r4 R! s
  78.   bmfHdr.bfSize = dwDIBSize;
    " E3 v0 }0 m/ u) h
  79.   bmfHdr.bfReserved1 = 0;0 C" O- ?1 a0 |, r
  80.   bmfHdr.bfReserved2 = 0;- c" T" B  N; V* Y6 {. ^7 N
  81.   bmfHdr.bfOffBits = (DWORD)sizeof(BITMAPFILEHEADER) + (DWORD)sizeof(BITMAPINFOHEADER) + dwPaletteSize;8 T2 V: N8 J. v' N+ \
  82.   // 写入位图文件头
    " s! b! V$ C- u/ T* ~
  83.   WriteFile(fh, (LPSTR)&bmfHdr, sizeof(BITMAPFILEHEADER), &dwWritten, NULL);+ o0 M2 {' X! r9 a9 G6 c0 r
  84.   // 写入位图文件其余内容
    : S1 H, }* f$ Z
  85.   WriteFile(fh, (LPSTR)lpbi, dwDIBSize, &dwWritten, NULL);
    * s5 \4 F. S( n6 I- g, G
  86.   //清除  4 a' N  [/ e) t5 Z2 z8 C# L5 T
  87.   GlobalUnlock(hDib);4 [2 f. d$ {) X0 f% Q$ ~
  88.   GlobalFree(hDib);
    $ y  V' d* x' M, ], q
  89.   CloseHandle(fh);; \3 g8 [( M8 e: H0 h+ w% ^4 J* S
  90. * b* r2 D+ D7 |  w. ]
  91.   return TRUE;. O- j( Q; Y' b( x6 h
  92. }
    0 U. r" F# [+ A1 ?, q/ _
复制代码
  1. #!/usr/bin/python
    5 U4 v7 d6 o; b' D1 E8 d! p
  2. # -*- coding: utf-8 -*-
    & s" J4 J, }- k9 Z
  3. 9 W% i2 k1 Y$ v4 q
  4. from ctypes import windll
      V2 \) P( o3 K- O. H7 X
  5. from win32clipboard import *# p3 y3 ?+ _+ i6 [
  6. import tempfile
    4 L0 v. I. ^& r8 u
  7. import os, u/ V  Q- j6 w: `5 _
  8. from time import sleep8 S$ h% U# f6 \! l+ Z( c
  9. 5 q5 B+ w3 P/ `
  10. if __name__ == '__main__':4 k1 Y  g0 Y' K4 m" y' Q
  11.     while True:! A* A5 U- n+ P, ?* p
  12.         try:
    ; V4 K% [& C5 M7 ]/ Z
  13.             OpenClipboard()
    4 _' a) ?7 M6 K: u/ A; d3 r
  14.         except Exception:
    / o" Q% `, B/ N  O% b  E& L
  15.             print("拒绝访问!")1 S# w: t  F* y# D# B8 {) F7 x( a
  16.             break
    / @$ l+ \, v  o; e; M1 }* O+ |
  17.         else:
    ) i  j, c! u' E  }" t$ F6 h* k
  18.             if IsClipboardFormatAvailable(CF_BITMAP):$ Q; ]* W: f2 }3 X( z
  19.                 try:
    5 m9 N5 m- |" W2 k$ x  ~  V
  20.                     dll = windll.LoadLibrary("./SaveBmp.dll"), f% i8 l5 g2 C4 T0 I
  21.                 except FileNotFoundError:* m- F3 m% k. Z1 M& K5 c- d' {
  22.                     print("依赖库不存在~"). [& e$ y6 k  e' m7 b" V& b
  23.                 else:
    3 Y7 k0 t0 ]  E
  24.                     tmpfd, tempfilename = tempfile.mkstemp(suffix='.bmp')& R5 B- Z- h- f$ ~) {' |
  25.                     os.close(tmpfd)  E& J, G/ w6 Y

  26.   {: z% D7 }& e3 R. e1 c' W. X
  27.                     hbitmap = GetClipboardData(CF_BITMAP)4 j, `/ r5 |" {  M6 |7 j
  28.                     dll.SaveBmp(hbitmap, tempfilename)8 M! Z! e/ _  `, b5 V- ~' }
  29.                     print(tempfilename)
    " C, D: k/ \% N1 @; J6 M( a4 k8 m! f
  30.                     EmptyClipboard()5 F( z; h7 a. r4 M/ ~+ C5 a3 i7 z0 c
  31.             CloseClipboard()  U4 V2 \: _! V! H- W
  32.             sleep(0.2)" E5 d$ }% [$ L3 E
复制代码
转发自派生社区
Python交流群:1047602540

% h5 x0 q9 w& y$ b




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