数学建模社区-数学中国
标题:
Python-监听并自动保存剪贴板图片到临时目录
[打印本页]
作者:
檀俾九
时间:
2021-1-16 11:27
标题:
Python-监听并自动保存剪贴板图片到临时目录
#include <iostream>
! s' _. w/ G- r9 ]; P9 r
#include <Windows.h>
" u1 Y" \, ]4 W" s& o
/ |, z- _2 H/ @7 U5 b d1 ^1 X" u
extern "C" {
* V. g3 F1 ?: I3 R- q' m& y
__declspec(dllexport) BOOL SaveBmp(HBITMAP hBitmap, const wchar_t* FileName);
& d, w& T& K: a3 s
}
$ d! E/ L. }, O3 R" M! q
: ?! d0 ^# C6 |; K2 y7 J
BOOL SaveBmp(HBITMAP hBitmap, const wchar_t* FileName)
4 x6 N& A* o3 v4 b/ \
{
S1 z/ y: t( R6 `: |& z
//设备描述表
$ V0 L- P5 D/ d9 H4 c
HDC hDC;
/ D% Y B- K/ J( [, |. f: x
//当前分辨率下每象素所占字节数
# P7 y4 @9 Z7 ?' s) q! W2 P% x4 B
int iBits;
5 p, L4 d8 N" z O; |! |2 v
//位图中每象素所占字节数
0 Q0 ^' m O7 e& }! R; S2 R( O/ q2 n
WORD wBitCount;
- p0 w0 a( W6 I) e, v( k0 Y1 }
//定义调色板大小, 位图中像素字节大小 ,位图文件大小 , 写入文件字节数
: r, ^+ J# F. @, M$ T; G% X
DWORD dwPaletteSize = 0, dwBmBitsSize = 0, dwDIBSize = 0, dwWritten = 0;
- i% I e4 _3 j
//位图属性结构
8 }" m I" A4 C' V9 Z$ `, h2 p6 s
BITMAP Bitmap;
3 ^8 {! d' K5 U% a$ ]) I/ J
//位图文件头结构
' X7 p% K, ]0 v1 e) N
BITMAPFILEHEADER bmfHdr;
8 m) c E- I+ R& P2 A
//位图信息头结构
' j8 Q0 Q# u# _4 I, v+ o
BITMAPINFOHEADER bi;
3 P$ B3 _# h0 r- W) X
//指向位图信息头结构
& K0 N8 e |' l0 q4 R' R
LPBITMAPINFOHEADER lpbi;
9 @( w5 n0 D2 u
//定义文件,分配内存句柄,调色板句柄
# _( R; J8 Q, k: L4 B
HANDLE fh, hDib, hPal, hOldPal = NULL;
+ p/ m% a E$ D5 K0 m; C8 p
//计算位图文件每个像素所占字节数
7 ?5 G+ T2 W8 y; |
hDC = CreateDC(L"DISPLAY", NULL, NULL, NULL);
5 ]( c H& S4 c4 n* m/ R
iBits = GetDeviceCaps(hDC, BITSPIXEL) * GetDeviceCaps(hDC, PLANES);
3 ?" x$ G+ ~2 p' q- i1 `! N, S A
DeleteDC(hDC);
6 d; {+ o" S; J1 Z: s! m
if (iBits <= 1) wBitCount = 1;
$ [# h9 X5 X0 h7 Q$ B0 K( g! ~/ f6 d
else if (iBits <= 4) wBitCount = 4;
, O5 C- [* N2 Q, T* [
else if (iBits <= 8) wBitCount = 8;
7 Z$ a! T# ]; V7 W+ i! H3 D
else wBitCount = 24;
* V7 b, Q3 ]: c9 B3 k; ^
GetObject(hBitmap, sizeof(Bitmap), (LPSTR)&Bitmap);
" S- O: W: X7 o' O0 T' O
bi.biSize = sizeof(BITMAPINFOHEADER);
/ m; S+ P9 X; x& z" P6 e* D
bi.biWidth = Bitmap.bmWidth;
8 z! Z% u5 o# ]* N" w
bi.biHeight = Bitmap.bmHeight;
: l F& [2 l8 j( X* W1 J3 z
bi.biPlanes = 1;
. S8 u7 I9 f# @: f3 Z
bi.biBitCount = wBitCount;
7 o' \5 L4 B0 q- @2 G" i+ p
bi.biCompression = BI_RGB;
/ O$ y d6 J$ f1 m8 B3 n, a9 A
bi.biSizeImage = 0;
* F* w7 i1 f% ?' W' Q
bi.biXPelsPerMeter = 0;
$ Q* E1 D" O+ k0 c9 c3 o3 Q0 Y
bi.biYPelsPerMeter = 0;
: o# J6 f( S( ~: ~6 g* V' I9 v
bi.biClrImportant = 0;
2 e4 F7 ^) T& h
bi.biClrUsed = 0;
0 g$ ?# M c1 e9 C# w6 R9 ]/ L: C
dwBmBitsSize = ((Bitmap.bmWidth * wBitCount + 31) / 32) * 4 * Bitmap.bmHeight;
/ s1 |; H$ b* R6 y7 l8 N5 A* j( w
//为位图内容分配内存
( o k% n' F8 v3 ]9 |6 P/ v
hDib = GlobalAlloc(GHND, dwBmBitsSize + dwPaletteSize + sizeof(BITMAPINFOHEADER));
7 c y ]# U8 o2 ^7 _) b
lpbi = (LPBITMAPINFOHEADER)GlobalLock(hDib);
* K9 M! M3 N% t3 U
*lpbi = bi;
. n- I% ? c: u) Q' w# E
/ @2 q; N' F u
// 处理调色板
4 c2 j: c3 s: F! }+ V% J7 m
hPal = GetStockObject(DEFAULT_PALETTE);
( f$ ^ _6 |% a3 n' K# Y
if (hPal)
# i* C! R& I0 } S
{
1 W/ D, ?' Y7 E! ^; B( w1 T
hDC = ::GetDC(NULL);
2 H9 H9 k( L2 ?( t! y/ c$ ~7 f/ O
hOldPal = ::SelectPalette(hDC, (HPALETTE)hPal, FALSE);
" h9 n O+ {( B: f8 Q6 f* B& O
RealizePalette(hDC);
6 P3 l: p S2 X# G' L. k! S4 Q! p
}
; Z4 r- F6 J7 F6 Z
// 获取该调色板下新的像素值
% T$ r9 q& S% V
GetDIBits(hDC, hBitmap, 0, (UINT)Bitmap.bmHeight, (LPSTR)lpbi + sizeof(BITMAPINFOHEADER) + dwPaletteSize, (BITMAPINFO*)lpbi, DIB_RGB_COLORS);
7 G1 ^) v& {) v
//恢复调色板
: ]1 l( Z$ |" M, F2 `0 \
if (hOldPal)
& T7 s' d, R: H' H/ U) D5 N! W5 p
{
3 t! {5 C" P& u; ]" ]3 s
::SelectPalette(hDC, (HPALETTE)hOldPal, TRUE);
& }4 D* z) [4 ~
RealizePalette(hDC);
5 X* ?6 y- b8 D; e
::ReleaseDC(NULL, hDC);
9 N* e( s* u; i- z$ R$ R5 j, [
}
2 ?9 v' ]$ C: t# |' f! J
//创建位图文件
( |5 D/ B) E7 ]& ?- |. Q. j) d
fh = CreateFile(FileName, GENERIC_WRITE, 0, NULL, CREATE_ALWAYS,
/ t! m2 P( q( ?& l
FILE_ATTRIBUTE_NORMAL | FILE_FLAG_SEQUENTIAL_SCAN, NULL);
; E% F$ v6 J8 r" ~
if (fh == INVALID_HANDLE_VALUE) return FALSE;
6 E, ~$ M4 {/ {6 d8 W+ S+ ~: f- k# S
// 设置位图文件头
, P' Y, w! `( G
bmfHdr.bfType = 0x4D42; // "BM"
?- _/ w0 D) c) f( z5 }
dwDIBSize = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER) + dwPaletteSize + dwBmBitsSize;
8 i% ^5 T6 P4 \
bmfHdr.bfSize = dwDIBSize;
; h0 j5 I# g8 P. B
bmfHdr.bfReserved1 = 0;
* W, T6 @9 G" d
bmfHdr.bfReserved2 = 0;
+ N% v) L2 w- _
bmfHdr.bfOffBits = (DWORD)sizeof(BITMAPFILEHEADER) + (DWORD)sizeof(BITMAPINFOHEADER) + dwPaletteSize;
+ y' ?/ f6 p9 H4 h
// 写入位图文件头
" @* L- [8 I1 s
WriteFile(fh, (LPSTR)&bmfHdr, sizeof(BITMAPFILEHEADER), &dwWritten, NULL);
: y4 u5 i. ?+ Q; c' E% D a" i
// 写入位图文件其余内容
1 G. o& K/ y9 Q' z
WriteFile(fh, (LPSTR)lpbi, dwDIBSize, &dwWritten, NULL);
- ~: P, e' l. ]8 k- ?5 P+ L+ B
//清除
( a2 X& A1 _$ [9 m: ~
GlobalUnlock(hDib);
5 ?* b1 X4 K$ O; k7 T. `3 n
GlobalFree(hDib);
7 r: p# ?5 ?9 M% F
CloseHandle(fh);
6 D+ d9 r" U' E ~9 ]) C
0 m! k/ c6 d* v% G- J
return TRUE;
( y4 m: u9 ?" m$ t5 ^4 ~
}
* @7 A" @' u) X. w2 f
复制代码
#!/usr/bin/python
1 B( z5 f1 V A0 \6 q+ s
# -*- coding: utf-8 -*-
, f/ g) {% B8 V6 L
2 k0 G0 X- a7 _4 n
from ctypes import windll
2 u9 }5 L1 s2 U2 x8 [9 A6 q' g
from win32clipboard import *
- G( t6 ^% ?/ k" n& j& S
import tempfile
4 ^$ B( J. ]* N+ V' Y. |* ~
import os
$ Q& {3 \& r2 J
from time import sleep
( ? |7 ~) o5 W9 J8 F
1 p: v1 Q5 m1 e
if __name__ == '__main__':
1 o, }. z; p: g* m' G
while True:
. t$ k2 u# O: `2 h2 \; M$ Q m
try:
$ D7 H& G" ]& L) B) j, {9 g: q
OpenClipboard()
, Z. D! Y) C: `0 w$ j- G
except Exception:
! F. _# P% w( E% p. M4 {. M
print("拒绝访问!")
5 @1 E6 ~5 D# Y8 D: S9 {) n
break
) t2 K& X. p5 Y. V0 }
else:
7 p( f5 K5 d$ q% f3 O
if IsClipboardFormatAvailable(CF_BITMAP):
. I3 v* [2 a' Q# o. {. V, b- v7 ~1 V; g
try:
. O5 m& W3 c' Z* `. l3 R" T/ Q
dll = windll.LoadLibrary("./SaveBmp.dll")
) ^& c8 C; M1 e# X+ J7 X. I
except FileNotFoundError:
, @8 m6 x( o: D. i0 f
print("依赖库不存在~")
7 Q- X1 ^4 z4 ~7 {
else:
* V# i# f8 U; C3 P
tmpfd, tempfilename = tempfile.mkstemp(suffix='.bmp')
5 Q1 _0 `% k% O7 {" C- T! j
os.close(tmpfd)
4 S: L$ N9 h$ F# p% g: h5 l
, r, e. R3 j0 C, V6 o
hbitmap = GetClipboardData(CF_BITMAP)
3 o7 l1 b: G4 {! a' R
dll.SaveBmp(hbitmap, tempfilename)
( i I, P, J5 B9 X( D, \+ k* j
print(tempfilename)
2 `* p" _9 u: ?! a4 @! z- I5 [
EmptyClipboard()
$ U( z; H/ p7 ?# k& f3 m* P
CloseClipboard()
8 e; P* o) c% b1 ~/ C U/ \
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