数学建模社区-数学中国
标题:
Python-监听并自动保存剪贴板图片到临时目录
[打印本页]
作者:
檀俾九
时间:
2021-1-16 11:27
标题:
Python-监听并自动保存剪贴板图片到临时目录
#include <iostream>
2 l+ E, ~" ]2 z6 d. K v0 r$ r; n9 k
#include <Windows.h>
9 C: n! o: X4 T& O/ ?" j7 U9 O
4 c0 v9 [" P& }. A( d
extern "C" {
! V/ O/ o0 o l! U6 V
__declspec(dllexport) BOOL SaveBmp(HBITMAP hBitmap, const wchar_t* FileName);
& V' H/ S8 T- _" s# s. N* `+ Z
}
9 ^& G) K1 R. z
" c+ B5 ^" R: l Q/ N2 s9 T" B( q, w
BOOL SaveBmp(HBITMAP hBitmap, const wchar_t* FileName)
% j& Y G2 W. D5 L
{
' z' g; s, o5 o+ i
//设备描述表
5 G0 C, ~9 y+ m; }/ V; p1 v. B. `; C
HDC hDC;
, }( B V+ X5 k, y
//当前分辨率下每象素所占字节数
! d) L u9 d$ l; m5 o% R
int iBits;
# S2 [7 r1 o( h0 ?0 k
//位图中每象素所占字节数
$ `' z3 x9 H3 h
WORD wBitCount;
* W+ p/ I7 J* `* V
//定义调色板大小, 位图中像素字节大小 ,位图文件大小 , 写入文件字节数
m* ^3 Q! u; R: j* B8 M5 I8 j
DWORD dwPaletteSize = 0, dwBmBitsSize = 0, dwDIBSize = 0, dwWritten = 0;
. \) Q( q, X" H# h1 s. g
//位图属性结构
1 o: j3 r% m5 k9 e Z* g
BITMAP Bitmap;
0 y5 I: V% s K: I+ i& ^- a) P
//位图文件头结构
: i1 O1 q' M( b" p U- g
BITMAPFILEHEADER bmfHdr;
. F" T; v* w T1 v% h
//位图信息头结构
: n# Q: N1 f! c( x
BITMAPINFOHEADER bi;
. W; A* J1 p7 ~1 g p4 F/ e
//指向位图信息头结构
; t* b( o! A, ~- D
LPBITMAPINFOHEADER lpbi;
4 \9 F1 x2 E# d. |
//定义文件,分配内存句柄,调色板句柄
6 x% s3 d2 z5 k8 B
HANDLE fh, hDib, hPal, hOldPal = NULL;
; z) n7 x! n+ v4 E. V5 t' C7 A0 H
//计算位图文件每个像素所占字节数
3 {9 T7 a. r* I
hDC = CreateDC(L"DISPLAY", NULL, NULL, NULL);
8 k* p6 @3 G; Z: n8 S: p3 R
iBits = GetDeviceCaps(hDC, BITSPIXEL) * GetDeviceCaps(hDC, PLANES);
" F/ g5 a& v, Q, H4 _0 ]
DeleteDC(hDC);
5 Y; G2 l$ m! X- t+ c) ~9 W) Z
if (iBits <= 1) wBitCount = 1;
9 w" [" _+ W) L$ |
else if (iBits <= 4) wBitCount = 4;
8 n/ ]1 M U* Q5 X+ a* g& ^
else if (iBits <= 8) wBitCount = 8;
& B3 z1 j0 |4 D$ v' J
else wBitCount = 24;
6 l' p9 \- V5 h) ^8 ^
GetObject(hBitmap, sizeof(Bitmap), (LPSTR)&Bitmap);
3 c, E+ Q, V+ ?3 C% H
bi.biSize = sizeof(BITMAPINFOHEADER);
8 f1 \8 y6 X6 \% j$ _% j
bi.biWidth = Bitmap.bmWidth;
) z9 v3 L: A; k5 n. E
bi.biHeight = Bitmap.bmHeight;
- R5 A+ W5 c1 i* r( Q
bi.biPlanes = 1;
! ]3 M# _4 r! H0 b
bi.biBitCount = wBitCount;
! s: |1 [: \. [! \6 c' X
bi.biCompression = BI_RGB;
' S6 B# d& E ~$ S3 c* @
bi.biSizeImage = 0;
H& p- n( S0 `6 K" p, A% I) h7 d) P8 ~/ |
bi.biXPelsPerMeter = 0;
: z4 a. j& u( d6 ?6 M
bi.biYPelsPerMeter = 0;
9 k( d* V8 p4 S
bi.biClrImportant = 0;
8 T t( b8 G" s3 o# j/ b \
bi.biClrUsed = 0;
. f1 v$ S! i0 Z
dwBmBitsSize = ((Bitmap.bmWidth * wBitCount + 31) / 32) * 4 * Bitmap.bmHeight;
& n( I) C! D2 P0 g0 Y6 t
//为位图内容分配内存
0 b. [! B% ]9 ^
hDib = GlobalAlloc(GHND, dwBmBitsSize + dwPaletteSize + sizeof(BITMAPINFOHEADER));
" o1 k7 d+ m1 y* ^+ n
lpbi = (LPBITMAPINFOHEADER)GlobalLock(hDib);
& ?; p% B, O' E; O
*lpbi = bi;
+ d0 e8 T) w8 e! T* u, y1 R
2 e. T- X- I/ Y8 J4 c* T: L
// 处理调色板
6 D! u" s5 V+ n
hPal = GetStockObject(DEFAULT_PALETTE);
2 N# t( z6 q4 u, i9 i. y B! S3 R
if (hPal)
3 i! W( s3 c7 H1 E, E
{
. Q) x/ Y- k4 S- y
hDC = ::GetDC(NULL);
7 j+ X' f5 c' p1 s3 ]- f
hOldPal = ::SelectPalette(hDC, (HPALETTE)hPal, FALSE);
" ^ R: {9 ^ t& \
RealizePalette(hDC);
3 n* _; ?% P4 Y8 y" u
}
; X: p/ L" m1 q% F1 v
// 获取该调色板下新的像素值
" c/ ~6 |( J% y8 y
GetDIBits(hDC, hBitmap, 0, (UINT)Bitmap.bmHeight, (LPSTR)lpbi + sizeof(BITMAPINFOHEADER) + dwPaletteSize, (BITMAPINFO*)lpbi, DIB_RGB_COLORS);
2 N" [5 H; f% W: E. X
//恢复调色板
& m$ i) c7 C& c, L# x
if (hOldPal)
3 g/ c! [6 P* @: T2 E: Q# k
{
/ I& j$ f2 N9 F1 t& y8 k" u/ C
::SelectPalette(hDC, (HPALETTE)hOldPal, TRUE);
0 R# H k( s- {$ A4 [: Y& n& c) Q
RealizePalette(hDC);
/ h, Y6 H; \+ k2 D$ A
::ReleaseDC(NULL, hDC);
1 I h+ O$ Z& v( I
}
/ `. t7 N1 b- m
//创建位图文件
) b9 p, s" @ t- D3 I3 B
fh = CreateFile(FileName, GENERIC_WRITE, 0, NULL, CREATE_ALWAYS,
9 J/ U3 s! n3 Y% C- ]4 E
FILE_ATTRIBUTE_NORMAL | FILE_FLAG_SEQUENTIAL_SCAN, NULL);
5 b, T4 r7 K. }( D S! G
if (fh == INVALID_HANDLE_VALUE) return FALSE;
/ o: |. _6 n# }, z( I
// 设置位图文件头
& C+ C+ `9 M1 i V* n
bmfHdr.bfType = 0x4D42; // "BM"
+ r5 @9 V$ n+ F# L
dwDIBSize = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER) + dwPaletteSize + dwBmBitsSize;
" G: P" f" F8 u3 n3 g: }# o; b% s" q
bmfHdr.bfSize = dwDIBSize;
% Y+ e0 M) F, K# ]( S' q/ q
bmfHdr.bfReserved1 = 0;
1 Y% O" ?4 F6 [5 \% z8 v$ C! |
bmfHdr.bfReserved2 = 0;
3 x7 Q6 l; c3 q4 r n
bmfHdr.bfOffBits = (DWORD)sizeof(BITMAPFILEHEADER) + (DWORD)sizeof(BITMAPINFOHEADER) + dwPaletteSize;
, B! Z$ y( c" X
// 写入位图文件头
4 H6 o2 _* S l3 I
WriteFile(fh, (LPSTR)&bmfHdr, sizeof(BITMAPFILEHEADER), &dwWritten, NULL);
7 B6 G' R2 f0 A* _( k6 ?# R
// 写入位图文件其余内容
* k e! b6 e. ]. e9 A: l+ ]' \4 `
WriteFile(fh, (LPSTR)lpbi, dwDIBSize, &dwWritten, NULL);
6 p: }3 _7 J3 W
//清除
4 j- C6 l% W# G( y9 U6 f& I6 d
GlobalUnlock(hDib);
# P. _ ^% p' d/ E& b; S0 U n
GlobalFree(hDib);
/ M3 Y& G9 |7 [* R N
CloseHandle(fh);
0 K8 |( P) Z; `6 d* o: Z
6 l5 @- s% s* n1 }0 H2 H
return TRUE;
4 U7 j2 C9 @& O
}
6 M/ b! U& x$ t5 S
复制代码
#!/usr/bin/python
" W& H U8 j+ ~& k( v
# -*- coding: utf-8 -*-
. B4 D/ ^5 G# D2 q$ H3 [- n" b
% I( k0 b0 @9 C$ z8 V" y, U
from ctypes import windll
4 x5 W1 ?8 l# o4 V5 ]
from win32clipboard import *
7 [& y$ s; ]3 k
import tempfile
. U m& z, Q" P8 V6 k; f0 q
import os
& U8 m( A# ?$ z6 F) e* F
from time import sleep
4 _' W1 v1 i6 u% y
- ~3 w( `/ w: a/ N6 V7 F' G2 }6 d
if __name__ == '__main__':
6 D, s0 k( s5 A P
while True:
7 ]. p) A0 D6 y, I. R; D8 q
try:
S9 ~3 N6 u' n* A- q9 f% S6 x
OpenClipboard()
$ o O5 }6 @8 m
except Exception:
& W; N: ^& Z# B+ ~. X
print("拒绝访问!")
. y7 |3 W4 q, v9 k. U3 T; h
break
# v4 U! m p$ o9 a
else:
- b5 I2 L9 d3 ^$ X4 Q! V
if IsClipboardFormatAvailable(CF_BITMAP):
' v6 Z: k2 Y4 v. y& C% g) g1 E
try:
: Z- H2 k6 d! ^5 k0 u* j
dll = windll.LoadLibrary("./SaveBmp.dll")
: f6 h+ C" w ^8 e
except FileNotFoundError:
+ S; A# W. o8 v, G7 {8 x
print("依赖库不存在~")
- w) ?2 D$ ^6 \8 V2 V2 g( r8 \. n
else:
7 Z9 p, A5 A- r
tmpfd, tempfilename = tempfile.mkstemp(suffix='.bmp')
. ~! G# s+ Z* j' M+ Q g$ S
os.close(tmpfd)
6 A& a Y2 |7 S+ V
0 l( }1 L: y7 Q1 K2 W% K( |" A
hbitmap = GetClipboardData(CF_BITMAP)
% t- R% P1 D/ f: ]( ~# G% F7 W3 w
dll.SaveBmp(hbitmap, tempfilename)
# S Y, p! q" q1 Z
print(tempfilename)
+ H" T# m) |5 @( m& O2 |
EmptyClipboard()
- {( Q1 R8 c8 H" q8 G5 o
CloseClipboard()
. }6 Z0 B4 P8 L* W. H3 q
sleep(0.2)
6 p+ I2 x5 ]! a1 z- {, v
复制代码
转发自
派生社区
Python交流群:1047602540
3 [; z7 S# _8 F2 x" C3 Z8 s
欢迎光临 数学建模社区-数学中国 (http://www.madio.net/)
Powered by Discuz! X2.5