1 #include <Windows.h>
2 
3 namespace Clipboard
4 {
Copy(const char * data,int len)5   void Copy( const char * data, int len )
6   {
7     HWND hWnd = GetForegroundWindow();
8     if ( !::OpenClipboard( hWnd ) )
9       return;
10 
11     HGLOBAL hData = GlobalAlloc( GMEM_MOVEABLE, ( len + 1 ) * sizeof( char ) );
12     if ( !hData ) {
13       CloseClipboard();
14       return;
15     }
16 
17     WCHAR * pMem = (WCHAR*) GlobalLock( hData );
18     if ( !pMem ) {
19       GlobalFree( hData );
20       CloseClipboard();
21       return;
22     }
23 
24     ZeroMemory( pMem, ( len + 1 ) * sizeof( char ) );
25     CopyMemory( pMem, data, ( len + 1 ) * sizeof( char ) );
26 
27     GlobalUnlock( hData );
28 
29     EmptyClipboard();
30 
31     SetClipboardData( CF_TEXT, hData );
32 
33     CloseClipboard();
34   }
35 
GetContentsLength()36   int GetContentsLength()
37   {
38     HWND hWnd = GetForegroundWindow();
39     if ( !::OpenClipboard( hWnd ) )
40       return 0;
41 
42     HANDLE hData = GetClipboardData( CF_TEXT );
43     if ( !hData ) {
44       CloseClipboard();
45       return 0;
46     }
47 
48     const char * buffer = (const char*) GlobalLock( hData );
49     if ( !buffer ) {
50       CloseClipboard();
51       return 0;
52     }
53 
54     int n = strlen( buffer );
55 
56     GlobalUnlock( hData );
57 
58     CloseClipboard();
59 
60     return n;
61   }
62 
GetContents(char * data,int len)63   void GetContents( char * data, int len )
64   {
65     HWND hWnd = GetForegroundWindow();
66     if ( !::OpenClipboard( hWnd ) )
67       return;
68 
69     HANDLE hData = GetClipboardData( CF_TEXT );
70     if ( !hData ) {
71       CloseClipboard();
72       return;
73     }
74 
75     const char * buffer = (const char*) GlobalLock( hData );
76     if ( !buffer ) {
77       CloseClipboard();
78       return;
79     }
80 
81     strncpy( data, buffer, len );
82 
83     GlobalUnlock( hData );
84 
85     CloseClipboard();
86   }
87 
88 }
89