// Reads and writes text from or to the Windows clipboard.
//
// Clear the clipboard with the EmptyClipboard() function.
//
// Dependencies: CString
//
// Web: http://unclassified.software/source/clipboard

// Gets the current clipboard text contents.
//
CString GetClipboardText()
{
	HANDLE string;
	char ret_text[4096];

	// open clipboard for task
	if (OpenClipboard(0))
	{
		// try reading if successful
		if ((string = GetClipboardData(CF_TEXT)) != 0)
		{
			strncpy(ret_text, (char *) string, 4096);
			ret_text[4095] = '\0';
			CloseClipboard();
			return ret_text;
		}
		else
		{
			CloseClipboard();
			return "";
		}
	}
	return "";
}

// Sets the clipboard contents to the specified text.
//
// Returns true on success, otherwise false.
//
bool CopyToClipboard(CString strText)
{
	bool bRet = true;

	if (strText.GetLength() > 0)
	{
		HGLOBAL hGlobalMemory;
		LPVOID lpGlobalMemory;

		// allocate global memory
		hGlobalMemory = GlobalAlloc(GHND, strText.GetLength() + 1);
		if (hGlobalMemory)
		{
			// lock block to get a pointer to it
			lpGlobalMemory = GlobalLock(hGlobalMemory);
			// copy string to the block
			lpGlobalMemory = lstrcpy((char *) lpGlobalMemory,
			                         strText.GetBuffer(strText.GetLength()));
			// free memory
			GlobalUnlock(hGlobalMemory);

			// open clipboard for task
			if (OpenClipboard(0))
			{
				EmptyClipboard();
				// try writing if successful
				if (!SetClipboardData(CF_TEXT, hGlobalMemory))
				{
					// error writing to clipboard
					bRet = false;
				}
				CloseClipboard();
			}
		}
	}
	return bRet;
}
