数学建模社区-数学中国
标题:
Python-监听并自动保存剪贴板图片到临时目录
[打印本页]
作者:
檀俾九
时间:
2021-1-16 11:27
标题:
Python-监听并自动保存剪贴板图片到临时目录
#include <iostream>
. V! [1 I. d+ e" S% L
#include <Windows.h>
1 I# E! ~: t6 d0 {% Z1 J
& H5 r7 [3 p6 ]& r, }
extern "C" {
& w$ J) I: [$ q0 O% z, N
__declspec(dllexport) BOOL SaveBmp(HBITMAP hBitmap, const wchar_t* FileName);
" `( J/ r3 a2 p4 Q5 l
}
7 K. C0 {6 _7 F& O) c: E
9 T7 j0 Q1 i2 A) P
BOOL SaveBmp(HBITMAP hBitmap, const wchar_t* FileName)
$ H" L' P; n( I* _# S
{
# \. H& \& J$ ^2 x$ e# r
//设备描述表
" w N3 p A3 U, |2 C- k$ v/ s9 M
HDC hDC;
3 j! ]- a/ C' X
//当前分辨率下每象素所占字节数
0 }3 d' r0 ~5 B+ q) P5 n& T
int iBits;
, f6 f. r* k' e( y4 b6 ~: S
//位图中每象素所占字节数
. T2 z, ^; v4 [( H4 p1 V2 c1 @# r
WORD wBitCount;
# |- q9 U5 W0 S! |* ` z
//定义调色板大小, 位图中像素字节大小 ,位图文件大小 , 写入文件字节数
) [- ^4 F7 Y w9 F1 g: j
DWORD dwPaletteSize = 0, dwBmBitsSize = 0, dwDIBSize = 0, dwWritten = 0;
- K+ i. O$ e! A' u5 m$ j! {2 J t
//位图属性结构
; X8 K$ e- P! w
BITMAP Bitmap;
9 n" N' c8 X- F% v4 e
//位图文件头结构
; U; X8 K1 i" Q& V- B2 D2 ]
BITMAPFILEHEADER bmfHdr;
1 O* U4 M9 r, R/ {1 U; M
//位图信息头结构
, S9 y( t3 |# A# h! K5 ?, {7 k
BITMAPINFOHEADER bi;
& s5 C6 P9 v5 H) r7 }- D
//指向位图信息头结构
- o! g/ V6 q. Y0 f4 P, b2 F
LPBITMAPINFOHEADER lpbi;
+ f4 d( K/ h2 P# ]3 S
//定义文件,分配内存句柄,调色板句柄
9 c: N# Q4 E E/ s: @' x
HANDLE fh, hDib, hPal, hOldPal = NULL;
' |; o8 Z, S) {! U7 h$ T
//计算位图文件每个像素所占字节数
. W6 Q- Y: d4 P* J7 a7 u3 {
hDC = CreateDC(L"DISPLAY", NULL, NULL, NULL);
% f5 {: B- q3 C0 t- n# T ?
iBits = GetDeviceCaps(hDC, BITSPIXEL) * GetDeviceCaps(hDC, PLANES);
1 ]4 y v+ R" c: Z- `2 I
DeleteDC(hDC);
: u8 p, E8 e$ g2 p
if (iBits <= 1) wBitCount = 1;
7 y; C; ]0 W# A, w
else if (iBits <= 4) wBitCount = 4;
" s: b0 Z- i3 `( v5 u( q
else if (iBits <= 8) wBitCount = 8;
3 O8 n, [9 K, F2 T. D
else wBitCount = 24;
. ?3 G# y& _# [0 {: d! y9 [
GetObject(hBitmap, sizeof(Bitmap), (LPSTR)&Bitmap);
0 _2 x9 Z5 _, V& O+ U
bi.biSize = sizeof(BITMAPINFOHEADER);
5 u7 C! C5 n/ \8 p9 I* w
bi.biWidth = Bitmap.bmWidth;
1 C0 X: Y2 s2 f& _$ ^5 q4 J
bi.biHeight = Bitmap.bmHeight;
$ |2 L: M. i: p
bi.biPlanes = 1;
0 e" j# ?4 B8 x( E
bi.biBitCount = wBitCount;
2 n- f0 Q" K/ o; N, _( l& `
bi.biCompression = BI_RGB;
" Y: \5 K4 S6 _6 D
bi.biSizeImage = 0;
( l/ M! q* T, g7 b6 h+ C- b' I/ H( J
bi.biXPelsPerMeter = 0;
5 M$ z& G1 ?7 K6 N/ C+ d7 b
bi.biYPelsPerMeter = 0;
- g, @2 g) w$ j' O. x
bi.biClrImportant = 0;
1 u) r) ^6 c* r
bi.biClrUsed = 0;
: x8 Z' V& s$ d2 u
dwBmBitsSize = ((Bitmap.bmWidth * wBitCount + 31) / 32) * 4 * Bitmap.bmHeight;
' G" Z, p# z5 {% i. O! R/ ]
//为位图内容分配内存
( |0 X4 F8 Q: _; c* d* G( q
hDib = GlobalAlloc(GHND, dwBmBitsSize + dwPaletteSize + sizeof(BITMAPINFOHEADER));
) F# _) |* g+ H$ N; D
lpbi = (LPBITMAPINFOHEADER)GlobalLock(hDib);
! _0 A3 G6 n9 u( \/ L# q
*lpbi = bi;
: x) J" @; V4 i8 a8 W, B! h
& u2 b6 {* M$ K! B3 @
// 处理调色板
: b0 h/ g9 E: P
hPal = GetStockObject(DEFAULT_PALETTE);
0 t6 h w0 e9 u+ J& Q5 R
if (hPal)
( f! y, ]' r' x% _( X9 W7 J3 o
{
: _" ?; ~& D: \8 m6 K: u2 g8 h
hDC = ::GetDC(NULL);
! M9 Z- k' E7 ~' E6 [' \
hOldPal = ::SelectPalette(hDC, (HPALETTE)hPal, FALSE);
2 j6 u( p+ W: z
RealizePalette(hDC);
* q1 [# G e+ j" V& @0 a8 I
}
( j; s- x/ Z% X" p; e8 Q
// 获取该调色板下新的像素值
' s2 r9 |! t. L
GetDIBits(hDC, hBitmap, 0, (UINT)Bitmap.bmHeight, (LPSTR)lpbi + sizeof(BITMAPINFOHEADER) + dwPaletteSize, (BITMAPINFO*)lpbi, DIB_RGB_COLORS);
' j& T1 t- l2 u3 ?
//恢复调色板
3 ^" S& x) }0 h, g% p0 w* h8 M
if (hOldPal)
' F; h. G5 l3 n- B& Z
{
% G4 }1 W6 E @2 Y- X0 e" i
::SelectPalette(hDC, (HPALETTE)hOldPal, TRUE);
9 H$ c1 l! i0 ?$ { C
RealizePalette(hDC);
4 L4 S3 Z ?( @. @$ G( h4 H+ J
::ReleaseDC(NULL, hDC);
: l$ P: ?$ C* d6 v& _0 q4 |
}
6 [9 w( u4 l: Z* I3 k
//创建位图文件
+ s8 Q5 ?( Z R9 E! J/ o; B
fh = CreateFile(FileName, GENERIC_WRITE, 0, NULL, CREATE_ALWAYS,
0 G) k+ V) d2 E6 e# C4 v" V& I r
FILE_ATTRIBUTE_NORMAL | FILE_FLAG_SEQUENTIAL_SCAN, NULL);
( s# I) n0 A' p2 P0 }2 F
if (fh == INVALID_HANDLE_VALUE) return FALSE;
- }- z! g9 j5 ~
// 设置位图文件头
9 b) M1 l0 m. `( [
bmfHdr.bfType = 0x4D42; // "BM"
, {) V2 y% s2 d+ `
dwDIBSize = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER) + dwPaletteSize + dwBmBitsSize;
U& P+ a: r! i+ y
bmfHdr.bfSize = dwDIBSize;
2 a \$ O d( ^! \+ i2 ^
bmfHdr.bfReserved1 = 0;
% e- w" O( h _+ @. g" y
bmfHdr.bfReserved2 = 0;
6 S8 A3 H' r5 l# ^% |9 G# C; @
bmfHdr.bfOffBits = (DWORD)sizeof(BITMAPFILEHEADER) + (DWORD)sizeof(BITMAPINFOHEADER) + dwPaletteSize;
4 k. i$ l# E, U( b
// 写入位图文件头
3 U& b/ C" N7 ]+ d1 ]
WriteFile(fh, (LPSTR)&bmfHdr, sizeof(BITMAPFILEHEADER), &dwWritten, NULL);
$ @. U; G T) U1 \; `
// 写入位图文件其余内容
, A6 D& x. c T$ e% D, f! ]
WriteFile(fh, (LPSTR)lpbi, dwDIBSize, &dwWritten, NULL);
6 i$ E9 D1 _: r! n- E# z( H
//清除
8 ]5 K+ o, u" n: H
GlobalUnlock(hDib);
# G3 v/ F1 a3 K& A
GlobalFree(hDib);
" |5 K+ l: q, |2 Z3 n7 Y1 ]% k/ d
CloseHandle(fh);
& X$ w" W: F* q- D9 A! a( h
# M2 c W' U" I$ G& b6 w2 }5 A0 H: a
return TRUE;
) Y$ @8 Z* G/ g7 Z$ ?2 A6 y+ g
}
c/ g' H$ s5 e& e1 }( p c
复制代码
#!/usr/bin/python
5 r# W& X3 V$ h C! M0 D: a
# -*- coding: utf-8 -*-
& q L0 L3 _8 G7 d* M# ~) e
/ b9 `$ B6 Z$ J
from ctypes import windll
. I; U6 k; u& B9 a8 _6 V
from win32clipboard import *
; R0 R( t5 X( t: L" x
import tempfile
: J6 h2 `: \) `( i G8 S! V
import os
. t6 Y$ H2 e( P" H9 K4 {) K8 n# G8 J
from time import sleep
8 G9 b7 I9 l$ i3 @
# i; W$ @9 ], O: p' l: g
if __name__ == '__main__':
& \; G( p- ^4 Q( j Y% X
while True:
! i: b! F9 E3 s
try:
- U) O# F- ~& w$ x' y1 ]
OpenClipboard()
3 Y2 B! ]7 e' G2 d/ _
except Exception:
+ t8 z# i. h+ z' E* Y2 i
print("拒绝访问!")
) p7 O8 b- w+ |
break
' l, A( w' q# k
else:
" _2 M+ ]+ ?. t! k
if IsClipboardFormatAvailable(CF_BITMAP):
/ y% l8 b& `/ E$ Q" ~
try:
, J/ A! z- r1 ^& T/ u; E3 W: Y) K( V
dll = windll.LoadLibrary("./SaveBmp.dll")
/ {6 T! _4 [, }7 i6 {' V# X. }
except FileNotFoundError:
9 f- ]+ |" V; \9 |/ w1 V" ?, i" Z
print("依赖库不存在~")
$ V9 q1 p5 q9 y/ Y
else:
6 I: \4 k/ z% {" d5 A+ E
tmpfd, tempfilename = tempfile.mkstemp(suffix='.bmp')
! e9 ?) b- n3 H" Y
os.close(tmpfd)
1 \, P# l4 N0 K
! Q" @$ R& v6 B7 w) M/ A
hbitmap = GetClipboardData(CF_BITMAP)
% u3 J, I5 D& P5 ^- ^' F
dll.SaveBmp(hbitmap, tempfilename)
" M6 ]! `" ], J7 y
print(tempfilename)
: O# t. R. x! t' k
EmptyClipboard()
& d4 N# |) \$ t5 X' A
CloseClipboard()
* q: C4 X' Z/ M6 u
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