数学建模社区-数学中国
标题:
Python-监听并自动保存剪贴板图片到临时目录
[打印本页]
作者:
檀俾九
时间:
2021-1-16 11:27
标题:
Python-监听并自动保存剪贴板图片到临时目录
#include <iostream>
3 B1 H5 v# y( q# [& R' H% K
#include <Windows.h>
! U; N3 J9 D2 @7 V( q
, n1 K4 T0 m8 m* a* u
extern "C" {
0 Q' r6 p/ G" d3 y
__declspec(dllexport) BOOL SaveBmp(HBITMAP hBitmap, const wchar_t* FileName);
7 E% V" j8 ~7 A3 V L
}
* n, T) K" s5 d' R8 g$ _1 A3 y
- O4 b* i) y3 F4 _- e3 I$ y3 q
BOOL SaveBmp(HBITMAP hBitmap, const wchar_t* FileName)
2 v: q) o7 e) \; N# V
{
z* u _: b& v! l3 H
//设备描述表
0 p, R- q/ G! q4 e6 P! M
HDC hDC;
$ L; [7 P4 G3 ?
//当前分辨率下每象素所占字节数
% |' D- {* A! X( b
int iBits;
& {4 Q. x* I5 a8 U1 A) s* ^1 B
//位图中每象素所占字节数
' @* j, {) _9 j+ r1 j
WORD wBitCount;
) l+ W; z8 i& J3 R1 w3 K" m
//定义调色板大小, 位图中像素字节大小 ,位图文件大小 , 写入文件字节数
, U% Z- X8 [! j) Q# ~
DWORD dwPaletteSize = 0, dwBmBitsSize = 0, dwDIBSize = 0, dwWritten = 0;
1 }# `+ Y, X$ Z; Z$ Q
//位图属性结构
8 S7 }) N; K u+ U8 a
BITMAP Bitmap;
9 o( Z: w: Q7 m# k
//位图文件头结构
, d# Y% v' `3 M( N) H
BITMAPFILEHEADER bmfHdr;
, m) C. C% ]1 a+ _1 P" s
//位图信息头结构
, H4 e, H0 W- `; d) |3 K2 C
BITMAPINFOHEADER bi;
3 l* b6 g% |- ^
//指向位图信息头结构
+ z& K& Y9 J6 A6 A, H
LPBITMAPINFOHEADER lpbi;
" X! R. o) g* [& c4 Y
//定义文件,分配内存句柄,调色板句柄
+ g0 _; f# O" D6 n; a6 L
HANDLE fh, hDib, hPal, hOldPal = NULL;
* w8 ^8 G! U& J5 }- p" L0 y- M" A0 S
//计算位图文件每个像素所占字节数
3 Z9 |1 z2 q1 W3 Z. p7 m
hDC = CreateDC(L"DISPLAY", NULL, NULL, NULL);
, x3 K/ |) t+ @3 s# g+ y
iBits = GetDeviceCaps(hDC, BITSPIXEL) * GetDeviceCaps(hDC, PLANES);
* Q" w; Y7 k6 U. a$ V2 C8 g
DeleteDC(hDC);
. r! `' L$ j! x. P2 t- b- L! y: Z, g
if (iBits <= 1) wBitCount = 1;
0 c3 g, Y9 r8 R- Y
else if (iBits <= 4) wBitCount = 4;
" N! B) z p& ~
else if (iBits <= 8) wBitCount = 8;
7 ~5 [, [- ]9 s- F0 m- M& K; C
else wBitCount = 24;
/ y! @0 p3 N/ \7 z0 Z; e
GetObject(hBitmap, sizeof(Bitmap), (LPSTR)&Bitmap);
+ [3 s3 m9 t+ @' M& w
bi.biSize = sizeof(BITMAPINFOHEADER);
" \5 s8 k# D' E: T5 d ]% U
bi.biWidth = Bitmap.bmWidth;
8 Z/ t( _7 m& a6 i3 z) l5 i$ I
bi.biHeight = Bitmap.bmHeight;
7 C$ D- V( v& e# D
bi.biPlanes = 1;
; v1 P2 p- ]! Q# `1 `5 u
bi.biBitCount = wBitCount;
1 O; a @; c* C
bi.biCompression = BI_RGB;
8 T5 y, v" B0 E
bi.biSizeImage = 0;
) q: b# }7 D& U9 e5 h% U
bi.biXPelsPerMeter = 0;
4 D: I# v% V: T6 U
bi.biYPelsPerMeter = 0;
6 L H: N7 a" O$ E
bi.biClrImportant = 0;
- O4 j! O# m$ p9 M& |
bi.biClrUsed = 0;
) c+ B% _% ? H4 n
dwBmBitsSize = ((Bitmap.bmWidth * wBitCount + 31) / 32) * 4 * Bitmap.bmHeight;
2 q" V2 A$ D* t: c! p6 D
//为位图内容分配内存
6 A" S$ ^/ _3 C( Y
hDib = GlobalAlloc(GHND, dwBmBitsSize + dwPaletteSize + sizeof(BITMAPINFOHEADER));
+ B) b0 w' S @; W
lpbi = (LPBITMAPINFOHEADER)GlobalLock(hDib);
6 D/ u/ X+ \! b$ I
*lpbi = bi;
' c& A3 F3 F& X# y, J3 b
: R E1 h! H+ p: `. b& K
// 处理调色板
N8 M: h- Y0 I0 o% `
hPal = GetStockObject(DEFAULT_PALETTE);
3 `" s, B% F1 n% {0 R# Y& y
if (hPal)
# Q1 {0 q, l& a# Y2 s" x; V: ?3 d: Z
{
; |6 N! U) x. N
hDC = ::GetDC(NULL);
- Q, ~9 ~/ e4 R9 g( l4 x
hOldPal = ::SelectPalette(hDC, (HPALETTE)hPal, FALSE);
2 \2 R) J3 N& U3 F" W7 C- R6 C
RealizePalette(hDC);
* u. i$ m7 L0 w
}
9 E: o$ z) }# a \
// 获取该调色板下新的像素值
# o( n& {, r' A3 F0 M1 T1 A1 X
GetDIBits(hDC, hBitmap, 0, (UINT)Bitmap.bmHeight, (LPSTR)lpbi + sizeof(BITMAPINFOHEADER) + dwPaletteSize, (BITMAPINFO*)lpbi, DIB_RGB_COLORS);
: _5 N, o, c8 M9 C" n
//恢复调色板
9 a6 f* G6 Y# m. N2 ]
if (hOldPal)
8 G# i$ x( H4 K! b } f ?8 E
{
# ~2 R8 x3 d' |
::SelectPalette(hDC, (HPALETTE)hOldPal, TRUE);
1 `& p9 Q, d! ]- S: v; Z( e7 ^, g: I
RealizePalette(hDC);
4 T: n* F# `& Y1 d7 m/ J
::ReleaseDC(NULL, hDC);
k* h) P. |% ]; O! q
}
0 L! H9 U( @# ~% P
//创建位图文件
" {& R( l) S, b/ v9 o3 |
fh = CreateFile(FileName, GENERIC_WRITE, 0, NULL, CREATE_ALWAYS,
" g# h/ G2 k) K: u9 [# T- N0 _* @
FILE_ATTRIBUTE_NORMAL | FILE_FLAG_SEQUENTIAL_SCAN, NULL);
7 @. u* B" \/ X/ e/ e% Q: V* }: m
if (fh == INVALID_HANDLE_VALUE) return FALSE;
! z& A# C. O6 c: W# q$ e
// 设置位图文件头
+ p7 F6 z3 q* o$ |
bmfHdr.bfType = 0x4D42; // "BM"
$ Q$ q2 m- W* u/ H2 S+ `; r$ q. S4 s; v
dwDIBSize = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER) + dwPaletteSize + dwBmBitsSize;
; t) o" k3 s; Z: w
bmfHdr.bfSize = dwDIBSize;
7 \( E7 F- g, d3 |$ u b
bmfHdr.bfReserved1 = 0;
( Y* e5 F( v9 Z Z1 d# e" f: F
bmfHdr.bfReserved2 = 0;
$ r7 |; F' K. |. y0 N
bmfHdr.bfOffBits = (DWORD)sizeof(BITMAPFILEHEADER) + (DWORD)sizeof(BITMAPINFOHEADER) + dwPaletteSize;
7 B3 c q6 \9 y# y& Q f
// 写入位图文件头
, h2 h0 y% n& R( G$ h! i! ?3 D
WriteFile(fh, (LPSTR)&bmfHdr, sizeof(BITMAPFILEHEADER), &dwWritten, NULL);
% j3 v& x4 T% p
// 写入位图文件其余内容
/ `2 `; q, @& U* ^
WriteFile(fh, (LPSTR)lpbi, dwDIBSize, &dwWritten, NULL);
4 W9 d) [. P, d
//清除
% s V6 s* @" |4 B/ o: \
GlobalUnlock(hDib);
6 c# | J/ N" K5 |( y+ Y
GlobalFree(hDib);
6 v! c Y3 f# p$ y) m4 }3 W/ _
CloseHandle(fh);
4 ]3 o$ W: a% B5 J
, R1 o8 b/ N0 P* R0 j
return TRUE;
' y+ R: h e; t& b
}
6 f9 ^# _& P/ u
复制代码
#!/usr/bin/python
: h- [! z4 }* N
# -*- coding: utf-8 -*-
$ ?( X$ f& V" X4 c) {# i. ?# c
5 B; P9 m6 z8 [7 } o" [
from ctypes import windll
/ Z9 Y% S- G5 I! L/ F _
from win32clipboard import *
1 B$ H; x t% S1 A2 S. r$ T
import tempfile
' ^3 b3 W4 G+ A4 T0 h% ]: R
import os
6 O( |' G: T! e5 R. C! s0 l" @$ H* D
from time import sleep
) |7 ^ i# G% e
# Y1 v/ E/ g8 N* o0 b8 i% E
if __name__ == '__main__':
; A6 p9 G9 D0 S4 k( J* t v/ I5 f
while True:
7 r2 p6 ^# P. X7 T" W
try:
* D% x( N( L$ k0 ^, E
OpenClipboard()
" w! R. |, D( o2 ^& Y5 m
except Exception:
9 b; S* I0 ^% ^% x( p
print("拒绝访问!")
" n* M4 b( s, Z3 T3 w( n' q; r
break
2 _, \ a( q8 W- s
else:
) _9 O9 p' S+ Y- R" A
if IsClipboardFormatAvailable(CF_BITMAP):
7 x k5 T" |1 g3 r
try:
5 J6 a- V- | C7 m: t- W3 T; S
dll = windll.LoadLibrary("./SaveBmp.dll")
7 Y% b; O' q j
except FileNotFoundError:
0 K6 W0 Y" @) ^, c2 n6 [
print("依赖库不存在~")
+ N s# {; U, y3 y
else:
% O* b H# t; l0 W6 I% p A" L; L A
tmpfd, tempfilename = tempfile.mkstemp(suffix='.bmp')
' A5 l8 ^2 P$ P' G/ \: O( t1 E9 m
os.close(tmpfd)
0 x3 u& M8 p) p) ?' ]
% J3 T. d, h' w4 a
hbitmap = GetClipboardData(CF_BITMAP)
2 l! }" ?. ^, ^: v: z
dll.SaveBmp(hbitmap, tempfilename)
' T4 D( R$ L' o" q
print(tempfilename)
2 s" S; x, Y! t) B7 K
EmptyClipboard()
$ J" V& u- E4 k5 S* w- Z
CloseClipboard()
6 E* X5 i$ N# k6 K
sleep(0.2)
0 V; R! b: _4 e4 f) b
复制代码
转发自
派生社区
Python交流群:1047602540
. Q$ j R6 a: W; ]9 a9 p8 i
欢迎光临 数学建模社区-数学中国 (http://www.madio.net/)
Powered by Discuz! X2.5