数学建模社区-数学中国
标题:
Python-监听并自动保存剪贴板图片到临时目录
[打印本页]
作者:
檀俾九
时间:
2021-1-16 11:27
标题:
Python-监听并自动保存剪贴板图片到临时目录
#include <iostream>
+ J1 _0 n8 ]1 {" p
#include <Windows.h>
( U, {( g& Y% Z
) O& c' M4 l7 y C; ?
extern "C" {
- P5 ? W! x. g* ^4 q: V
__declspec(dllexport) BOOL SaveBmp(HBITMAP hBitmap, const wchar_t* FileName);
/ O, R$ x+ k- j0 N) G2 O8 @
}
; s, N, K$ m/ }
1 o1 M% N1 m( H {1 g
BOOL SaveBmp(HBITMAP hBitmap, const wchar_t* FileName)
9 X0 ^+ x0 Y' @4 L1 C$ x5 U
{
+ F) B0 M6 w+ M" @7 d
//设备描述表
( g) A. S- y/ U: \) s
HDC hDC;
% J h/ A. t) v" t; X: {5 c
//当前分辨率下每象素所占字节数
0 u) C1 w' `+ u# u
int iBits;
* W- k9 R0 M1 R4 B
//位图中每象素所占字节数
5 H& x& B( _" q. ~' T( [# z
WORD wBitCount;
1 y1 X: t3 S7 i. |. `
//定义调色板大小, 位图中像素字节大小 ,位图文件大小 , 写入文件字节数
" {+ R( @4 f+ [
DWORD dwPaletteSize = 0, dwBmBitsSize = 0, dwDIBSize = 0, dwWritten = 0;
) q! r2 x& G; z3 Y1 ?
//位图属性结构
1 q( C/ B2 y' x+ K4 |& E7 c0 _
BITMAP Bitmap;
' D# c+ l9 h# h
//位图文件头结构
: ]( |$ H) T" D5 U
BITMAPFILEHEADER bmfHdr;
7 i2 P$ e9 x9 y- l) w6 `* E
//位图信息头结构
) y, m1 d: |, q; J" V( L- w1 {; a$ |
BITMAPINFOHEADER bi;
/ g" X) s8 A* R7 u- X" ~. J5 C
//指向位图信息头结构
8 G, M: k* c$ e6 `5 O
LPBITMAPINFOHEADER lpbi;
' G% i5 Z0 `2 e" R; R. a" z7 U
//定义文件,分配内存句柄,调色板句柄
" j% v* w2 M5 z& G% U
HANDLE fh, hDib, hPal, hOldPal = NULL;
" @6 m# ^2 N1 Q9 ~) ^* f
//计算位图文件每个像素所占字节数
8 k* d# }+ V5 O
hDC = CreateDC(L"DISPLAY", NULL, NULL, NULL);
# w. K' a. U' U0 b/ p& s& `% P z' q
iBits = GetDeviceCaps(hDC, BITSPIXEL) * GetDeviceCaps(hDC, PLANES);
6 a" j8 H! R; h! o
DeleteDC(hDC);
" [0 f& R: {/ I
if (iBits <= 1) wBitCount = 1;
. U" C/ S1 E! S! c% _6 _& ^
else if (iBits <= 4) wBitCount = 4;
4 q6 N$ G! v: N) C `
else if (iBits <= 8) wBitCount = 8;
& u- G4 s0 t+ j& \# e7 e. A
else wBitCount = 24;
$ Q! l- y# I g7 T2 ]) V) Z
GetObject(hBitmap, sizeof(Bitmap), (LPSTR)&Bitmap);
2 j! G1 ]: k2 j
bi.biSize = sizeof(BITMAPINFOHEADER);
2 j) p x$ i+ @; y& S
bi.biWidth = Bitmap.bmWidth;
4 h6 _1 y+ ?' \: V3 Z! V
bi.biHeight = Bitmap.bmHeight;
6 F8 p# @5 c" P, r
bi.biPlanes = 1;
" f# Q/ e& K" d z8 r9 V
bi.biBitCount = wBitCount;
; S' e5 U! N- i1 J% X+ M
bi.biCompression = BI_RGB;
# e5 F' l) z( A2 T6 |
bi.biSizeImage = 0;
. G- r6 M5 `3 |5 B3 U! E5 H' ^8 c/ c0 x
bi.biXPelsPerMeter = 0;
: [8 l7 b6 Q4 K
bi.biYPelsPerMeter = 0;
0 _) l% Y* ~% A
bi.biClrImportant = 0;
9 F6 G" v8 L8 r* t! d
bi.biClrUsed = 0;
: j7 z" R: D8 G7 B
dwBmBitsSize = ((Bitmap.bmWidth * wBitCount + 31) / 32) * 4 * Bitmap.bmHeight;
4 c* ?; W+ \' E7 t" c1 s- c
//为位图内容分配内存
4 G# g( p8 c; c4 q8 B7 U; E
hDib = GlobalAlloc(GHND, dwBmBitsSize + dwPaletteSize + sizeof(BITMAPINFOHEADER));
; O+ z' d' a2 A. K: o0 ~
lpbi = (LPBITMAPINFOHEADER)GlobalLock(hDib);
5 U6 P+ j) C/ Q$ g1 D6 R
*lpbi = bi;
" x1 G) Y/ d+ a. p$ K/ f: b
) F8 J$ y- ? I u5 w
// 处理调色板
4 {% j7 b3 }8 `6 b! ]
hPal = GetStockObject(DEFAULT_PALETTE);
! P4 ^4 t/ P$ i) Y0 I2 }" I, ~
if (hPal)
( w: i- r- S; F: }. e
{
3 k9 M" h/ p1 K) |" \& T- T
hDC = ::GetDC(NULL);
- A9 ~8 Y: ^( ^4 z
hOldPal = ::SelectPalette(hDC, (HPALETTE)hPal, FALSE);
, ^ j/ c- C' I4 @, v
RealizePalette(hDC);
6 A, A$ P' }7 ?% O" h
}
1 I( m4 Y! r0 ^: H% \( j6 C' N
// 获取该调色板下新的像素值
1 ?# c* {7 q2 O# J1 _2 e& o
GetDIBits(hDC, hBitmap, 0, (UINT)Bitmap.bmHeight, (LPSTR)lpbi + sizeof(BITMAPINFOHEADER) + dwPaletteSize, (BITMAPINFO*)lpbi, DIB_RGB_COLORS);
; i1 O# N3 Z2 O# A, f
//恢复调色板
: m6 R2 g" r8 ~4 r
if (hOldPal)
4 `8 }2 q" C% R. k8 O7 T) G) }6 j
{
' i# J" I. j5 E& q( l$ C: Y
::SelectPalette(hDC, (HPALETTE)hOldPal, TRUE);
3 G6 i8 b0 y/ }* w& C6 a
RealizePalette(hDC);
- F0 b3 N; E! y s; p
::ReleaseDC(NULL, hDC);
) z/ N& r( v+ U( d+ k
}
( `( m% |8 w# R, P9 p4 L- E
//创建位图文件
& l% J) j. z5 i6 \! a
fh = CreateFile(FileName, GENERIC_WRITE, 0, NULL, CREATE_ALWAYS,
6 @& {, Y) a4 Q. c7 A2 U
FILE_ATTRIBUTE_NORMAL | FILE_FLAG_SEQUENTIAL_SCAN, NULL);
" b1 L# ?9 ?. x% v$ W+ X
if (fh == INVALID_HANDLE_VALUE) return FALSE;
2 H5 R# c7 d {# Q+ s
// 设置位图文件头
0 D9 k, s8 z5 U# k
bmfHdr.bfType = 0x4D42; // "BM"
- X) P& q4 {( o6 F1 L1 R
dwDIBSize = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER) + dwPaletteSize + dwBmBitsSize;
% O9 o$ J$ G$ H) ^% X
bmfHdr.bfSize = dwDIBSize;
2 N5 i; @0 D- s" I( r L
bmfHdr.bfReserved1 = 0;
4 h( K+ S. L- u, m) _
bmfHdr.bfReserved2 = 0;
0 E& {4 O! G# K5 b4 }' b# X
bmfHdr.bfOffBits = (DWORD)sizeof(BITMAPFILEHEADER) + (DWORD)sizeof(BITMAPINFOHEADER) + dwPaletteSize;
/ I& y+ J9 T- U; w ~" g, X
// 写入位图文件头
# D; Z- T" k5 ^
WriteFile(fh, (LPSTR)&bmfHdr, sizeof(BITMAPFILEHEADER), &dwWritten, NULL);
: L8 F' `" w. i
// 写入位图文件其余内容
- v5 m5 E* d) \" x; ^/ O
WriteFile(fh, (LPSTR)lpbi, dwDIBSize, &dwWritten, NULL);
5 f/ n6 i# {) ]* S, \0 _
//清除
; C9 i" i3 f: c# t, X% j
GlobalUnlock(hDib);
: f2 L4 f) i# ^) S% j4 u- a9 q( S R
GlobalFree(hDib);
7 p1 M; n9 E2 [8 k9 R2 C
CloseHandle(fh);
A0 m: W& ]8 a4 Q
" I! ^- ]' `9 A; r4 \. N
return TRUE;
" \) ? J) k b# k
}
& G9 V- V! v% M
复制代码
#!/usr/bin/python
5 q7 l( |; Y) V0 W. W. f# q+ y
# -*- coding: utf-8 -*-
& f- {& ^0 g: C: S. k; T
: B( ^. B" `! G# I. a1 w
from ctypes import windll
$ o9 N9 B; b: U! K9 j: b7 q6 C
from win32clipboard import *
0 p2 U8 P% t( [0 C/ `) D
import tempfile
; W) ~( R: B% ^% {& H6 k
import os
* s' X$ b X% n/ @) f
from time import sleep
! I2 W$ d0 w$ O) N
2 n* f0 G0 O7 L/ b4 k; v7 K, U
if __name__ == '__main__':
5 T. U! A5 C% X6 j" S% |
while True:
' g: s/ A" S- n, D, s& z) E
try:
, N7 y+ @/ r/ F0 |6 r0 y" a8 X
OpenClipboard()
1 Q v1 [& `1 O
except Exception:
, ^; f! f7 y& f4 S+ @
print("拒绝访问!")
! |/ g9 D1 _: i% `; ?3 ^6 R( J
break
- G9 j' W: C B$ r
else:
8 p# K. M8 I" k6 V6 N8 Z! N9 g! r
if IsClipboardFormatAvailable(CF_BITMAP):
, o' }" s7 q8 q7 ^3 B- ^3 Z3 N7 n
try:
, ?7 k) Q: i3 p- D( v8 s6 i7 Q
dll = windll.LoadLibrary("./SaveBmp.dll")
9 z0 e+ e' B2 d7 g& }, v; }' G
except FileNotFoundError:
$ X- l2 a& [) g; i5 C8 \
print("依赖库不存在~")
1 A% H8 @, B, o) e
else:
1 T2 X8 |! y% t1 O& O" e: j4 G
tmpfd, tempfilename = tempfile.mkstemp(suffix='.bmp')
# a) Z, X/ ~- T
os.close(tmpfd)
" A( i3 C5 v" m
( y' G4 X3 p: E! E. z
hbitmap = GetClipboardData(CF_BITMAP)
5 I! l7 G4 e7 V" G7 f! E% f; R
dll.SaveBmp(hbitmap, tempfilename)
: Z, d9 l( \. o8 G$ d6 l3 l
print(tempfilename)
! U, g5 L5 O6 {, h
EmptyClipboard()
f* \: U8 P9 z `/ v2 X! x9 e
CloseClipboard()
3 I2 Z. \+ S0 z# N
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