-
Notifications
You must be signed in to change notification settings - Fork 2
Expand file tree
/
Copy pathClipboardBackup.cpp
More file actions
106 lines (78 loc) · 2.28 KB
/
Copy pathClipboardBackup.cpp
File metadata and controls
106 lines (78 loc) · 2.28 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
// From:
// https://www.codeproject.com/Articles/11372/Clipboard-backup-Visual-C
//////////////////////////////////////////////////////////////////////
// ClipboardBackup.cpp: implementation of the CClipboardBackup class.
//////////////////////////////////////////////////////////////////////
#include "stdafx.h"
#include "ClipboardBackup.h"
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
CClipboardBackup::CClipboardBackup()
{
Backup();
}
CClipboardBackup::~CClipboardBackup()
{
ClearBackupDatas();
}
BOOL CClipboardBackup::Backup()
{
if( ! ::OpenClipboard(NULL) )
return FALSE;
ClearBackupDatas();
UINT format = 0;
while( (format = ::EnumClipboardFormats(format)) != 0 )
{
ClipboardData data;
data.m_nFormat = format;
if( format <= 14 )
data.m_szFormatName[0] = 0;
else if( GetClipboardFormatName(format, data.m_szFormatName, 100) == 0 )
data.m_szFormatName[0] = 0;
HANDLE hMem = ::GetClipboardData( format );
if( hMem == NULL )
continue;
data.m_nLength = ::GlobalSize(hMem);
LPVOID pMem = ::GlobalLock( hMem );
data.m_pData = new char[data.m_nLength];
memcpy(data.m_pData, pMem, data.m_nLength);
m_lstData.AddTail(data);
}
::CloseClipboard();
return TRUE;
}
BOOL CClipboardBackup::Restore()
{
if( ! ::OpenClipboard(NULL) )
return FALSE;
::EmptyClipboard();
POSITION pos = m_lstData.GetHeadPosition();
while( pos != NULL )
{
ClipboardData & data = m_lstData.GetNext( pos );
UINT format = data.m_nFormat;
if( data.m_szFormatName[0] != 0 )
{
UINT u = RegisterClipboardFormat( data.m_szFormatName );
if( u > 0 ) format = u;
}
HANDLE hMem = ::GlobalAlloc( GMEM_MOVEABLE | GMEM_DDESHARE, data.m_nLength );
LPVOID pMem = ::GlobalLock( hMem );
memcpy( pMem, data.m_pData, data.m_nLength );
::GlobalUnlock( hMem );
::SetClipboardData( format, hMem );
}
::CloseClipboard();
return TRUE;
}
VOID CClipboardBackup::ClearBackupDatas()
{
POSITION pos = m_lstData.GetHeadPosition();
while( pos != NULL )
{
ClipboardData & data = m_lstData.GetNext( pos );
delete [] data.m_pData;
}
m_lstData.RemoveAll();
}