数学建模社区-数学中国
标题:
Python-监听并自动保存剪贴板图片到临时目录
[打印本页]
作者:
檀俾九
时间:
2021-1-16 11:27
标题:
Python-监听并自动保存剪贴板图片到临时目录
#include <iostream>
- k7 d- C5 n& D& T5 a# H
#include <Windows.h>
( I+ b9 Q8 J5 N0 ]
. u% r. T" a/ @; m/ _, C! V9 g. c
extern "C" {
/ ]/ [2 V8 d1 l% y5 E
__declspec(dllexport) BOOL SaveBmp(HBITMAP hBitmap, const wchar_t* FileName);
" ^1 `8 q5 j# e; C5 b8 }& K& S$ P& X
}
- C# q+ N* G$ v9 l' M
7 O3 m( H- J. M" j8 U1 Q$ A
BOOL SaveBmp(HBITMAP hBitmap, const wchar_t* FileName)
: u9 c" q- H+ `' s
{
8 m& L. T2 C9 ]
//设备描述表
2 w ]! e" L W9 F0 V! z$ C- Q
HDC hDC;
# R5 \, I, H- F
//当前分辨率下每象素所占字节数
2 {% H7 i; U3 x! @7 [4 k8 S
int iBits;
2 e( C6 N/ m9 [/ d6 e- S1 q4 [
//位图中每象素所占字节数
5 l' b% A& |) F; o
WORD wBitCount;
& V/ a; e) F# S3 C& w0 ^# Z& y
//定义调色板大小, 位图中像素字节大小 ,位图文件大小 , 写入文件字节数
! o7 w, }4 V! ^/ K
DWORD dwPaletteSize = 0, dwBmBitsSize = 0, dwDIBSize = 0, dwWritten = 0;
5 r' L, ?3 _" B7 l' f/ g0 m
//位图属性结构
U7 G; j0 K# [0 [$ |, `
BITMAP Bitmap;
; h$ @9 L, i8 U
//位图文件头结构
- D! u; ~( L3 ?3 s4 B5 Z
BITMAPFILEHEADER bmfHdr;
- s% V" x+ _: Q3 a/ A
//位图信息头结构
- g+ r1 T* S/ e" N7 r. a; h% D
BITMAPINFOHEADER bi;
% J: h0 P4 y( K# z: S" ^' }
//指向位图信息头结构
|. u/ F* p6 P- ?; @
LPBITMAPINFOHEADER lpbi;
; s+ B" c8 D! a8 Y
//定义文件,分配内存句柄,调色板句柄
6 Y6 y" e- ?0 G1 r4 q
HANDLE fh, hDib, hPal, hOldPal = NULL;
: H' A' c. f% |1 P
//计算位图文件每个像素所占字节数
O; `2 j" j" i- h+ x/ K1 `
hDC = CreateDC(L"DISPLAY", NULL, NULL, NULL);
" n: o: [ G1 I1 F) O" g: M
iBits = GetDeviceCaps(hDC, BITSPIXEL) * GetDeviceCaps(hDC, PLANES);
0 b c. Z- X& {, ^9 u
DeleteDC(hDC);
?- Q& f& v" A+ g
if (iBits <= 1) wBitCount = 1;
8 L9 U$ v, Z2 f: Y$ I& J" g
else if (iBits <= 4) wBitCount = 4;
8 U0 j' O: E: l. t" j
else if (iBits <= 8) wBitCount = 8;
! ], n, E/ N7 t. A' e0 e8 {
else wBitCount = 24;
, v3 {8 W* j- R2 T8 |% d9 i
GetObject(hBitmap, sizeof(Bitmap), (LPSTR)&Bitmap);
6 U: Q2 ]5 a8 ~4 o7 L$ s0 r( z) A% Q
bi.biSize = sizeof(BITMAPINFOHEADER);
5 f% g1 m+ Y1 ]/ k
bi.biWidth = Bitmap.bmWidth;
: _$ M5 K9 f# ? d9 I
bi.biHeight = Bitmap.bmHeight;
. B0 L+ z7 M ?) [
bi.biPlanes = 1;
# Z& u% K/ S& L; w& r6 F
bi.biBitCount = wBitCount;
5 D9 g1 l& f, h
bi.biCompression = BI_RGB;
9 R1 l6 s% W( D0 s) L6 c
bi.biSizeImage = 0;
* j( X8 I& |6 _
bi.biXPelsPerMeter = 0;
, T, \$ }0 q2 t0 e
bi.biYPelsPerMeter = 0;
n( d& C$ P5 ?
bi.biClrImportant = 0;
3 w) `0 L( m6 f& Q2 D( [
bi.biClrUsed = 0;
4 c! Z) g- ?" e4 c, ^; B& [
dwBmBitsSize = ((Bitmap.bmWidth * wBitCount + 31) / 32) * 4 * Bitmap.bmHeight;
2 n% D" g% t# B7 P) w( Y
//为位图内容分配内存
8 d, c$ j: D9 h( `& W
hDib = GlobalAlloc(GHND, dwBmBitsSize + dwPaletteSize + sizeof(BITMAPINFOHEADER));
; E: r' L- p, B' L( B3 c5 c' {
lpbi = (LPBITMAPINFOHEADER)GlobalLock(hDib);
; l: G: G* r: a3 [0 l( x
*lpbi = bi;
0 N {6 J0 K# j
5 y; U& b; A0 B
// 处理调色板
/ k. f" X+ N0 c" c$ }! K
hPal = GetStockObject(DEFAULT_PALETTE);
+ @6 J/ r& C7 ]* F
if (hPal)
- i( j, ]6 A% a0 Y
{
; x, O& O4 r8 b. G+ V
hDC = ::GetDC(NULL);
# s9 K3 E% R' ]8 l
hOldPal = ::SelectPalette(hDC, (HPALETTE)hPal, FALSE);
6 W6 U) R+ {' l) L, ?7 V2 a4 j9 ~5 L+ A
RealizePalette(hDC);
$ ? i! n& ?0 l6 a8 ~* z h
}
8 ?" q0 i# u) f( ^& R& P. o
// 获取该调色板下新的像素值
* v/ g7 i4 W/ d' m
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
//恢复调色板
! c8 y" t8 f$ J5 a5 K$ M. p+ z
if (hOldPal)
% B n' ] e9 m. [1 K
{
% M, Y0 j$ D/ q. T C. n( M4 W
::SelectPalette(hDC, (HPALETTE)hOldPal, TRUE);
& M9 E3 t7 d0 q1 v+ n0 ]: {) }
RealizePalette(hDC);
3 g; q$ [4 H$ P* T
::ReleaseDC(NULL, hDC);
3 d k, o5 [8 e8 d" e$ P
}
7 W9 U. \/ U# M# P) T+ J( |
//创建位图文件
7 h6 j' m. I( x/ O. S) T
fh = CreateFile(FileName, GENERIC_WRITE, 0, NULL, CREATE_ALWAYS,
$ ?! F9 U& Y* S3 o7 \
FILE_ATTRIBUTE_NORMAL | FILE_FLAG_SEQUENTIAL_SCAN, NULL);
7 a. Q' W2 M/ I3 H- e! v* F
if (fh == INVALID_HANDLE_VALUE) return FALSE;
$ J7 A* l: W# s0 i2 M7 \1 Z
// 设置位图文件头
: V! E% e/ K3 [. d* t
bmfHdr.bfType = 0x4D42; // "BM"
- H0 L2 Y4 b/ e
dwDIBSize = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER) + dwPaletteSize + dwBmBitsSize;
) N, Q1 S% _& R/ I8 r4 R! s
bmfHdr.bfSize = dwDIBSize;
" E3 v0 }0 m/ u) h
bmfHdr.bfReserved1 = 0;
0 C" O- ?1 a0 |, r
bmfHdr.bfReserved2 = 0;
- c" T" B N; V* Y6 {. ^7 N
bmfHdr.bfOffBits = (DWORD)sizeof(BITMAPFILEHEADER) + (DWORD)sizeof(BITMAPINFOHEADER) + dwPaletteSize;
8 T2 V: N8 J. v' N+ \
// 写入位图文件头
" s! b! V$ C- u/ T* ~
WriteFile(fh, (LPSTR)&bmfHdr, sizeof(BITMAPFILEHEADER), &dwWritten, NULL);
+ o0 M2 {' X! r9 a9 G6 c0 r
// 写入位图文件其余内容
: S1 H, }* f$ Z
WriteFile(fh, (LPSTR)lpbi, dwDIBSize, &dwWritten, NULL);
* s5 \4 F. S( n6 I- g, G
//清除
4 a' N [/ e) t5 Z2 z8 C# L5 T
GlobalUnlock(hDib);
4 [2 f. d$ {) X0 f% Q$ ~
GlobalFree(hDib);
$ y V' d* x' M, ], q
CloseHandle(fh);
; \3 g8 [( M8 e: H0 h+ w% ^4 J* S
* b* r2 D+ D7 | w. ]
return TRUE;
. O- j( Q; Y' b( x6 h
}
0 U. r" F# [+ A1 ?, q/ _
复制代码
#!/usr/bin/python
5 U4 v7 d6 o; b' D1 E8 d! p
# -*- coding: utf-8 -*-
& s" J4 J, }- k9 Z
9 W% i2 k1 Y$ v4 q
from ctypes import windll
V2 \) P( o3 K- O. H7 X
from win32clipboard import *
# p3 y3 ?+ _+ i6 [
import tempfile
4 L0 v. I. ^& r8 u
import os
, u/ V Q- j6 w: `5 _
from time import sleep
8 S$ h% U# f6 \! l+ Z( c
5 q5 B+ w3 P/ `
if __name__ == '__main__':
4 k1 Y g0 Y' K4 m" y' Q
while True:
! A* A5 U- n+ P, ?* p
try:
; V4 K% [& C5 M7 ]/ Z
OpenClipboard()
4 _' a) ?7 M6 K: u/ A; d3 r
except Exception:
/ o" Q% `, B/ N O% b E& L
print("拒绝访问!")
1 S# w: t F* y# D# B8 {) F7 x( a
break
/ @$ l+ \, v o; e; M1 }* O+ |
else:
) i j, c! u' E }" t$ F6 h* k
if IsClipboardFormatAvailable(CF_BITMAP):
$ Q; ]* W: f2 }3 X( z
try:
5 m9 N5 m- |" W2 k$ x ~ V
dll = windll.LoadLibrary("./SaveBmp.dll")
, f% i8 l5 g2 C4 T0 I
except FileNotFoundError:
* m- F3 m% k. Z1 M& K5 c- d' {
print("依赖库不存在~")
. [& e$ y6 k e' m7 b" V& b
else:
3 Y7 k0 t0 ] E
tmpfd, tempfilename = tempfile.mkstemp(suffix='.bmp')
& R5 B- Z- h- f$ ~) {' |
os.close(tmpfd)
E& J, G/ w6 Y
{: z% D7 }& e3 R. e1 c' W. X
hbitmap = GetClipboardData(CF_BITMAP)
4 j, `/ r5 |" { M6 |7 j
dll.SaveBmp(hbitmap, tempfilename)
8 M! Z! e/ _ `, b5 V- ~' }
print(tempfilename)
" C, D: k/ \% N1 @; J6 M( a4 k8 m! f
EmptyClipboard()
5 F( z; h7 a. r4 M/ ~+ C5 a3 i7 z0 c
CloseClipboard()
U4 V2 \: _! V! H- W
sleep(0.2)
" E5 d$ }% [$ L3 E
复制代码
转发自
派生社区
Python交流群:1047602540
% h5 x0 q9 w& y$ b
欢迎光临 数学建模社区-数学中国 (http://www.madio.net/)
Powered by Discuz! X2.5