Getting Clipboard History in C++
#include <windows.h>
#include <roapi.h>
#include <stdio.h>
#include <windows.applicationmodel.datatransfer.h>
#include <windows.foundation.h>
using namespace ABI::Windows::Foundation;
using namespace ABI::Windows::ApplicationModel::DataTransfer;
#pragma comment(lib, "runtimeobject.lib")
MIDL_INTERFACE("4da6d9df-4e7e-50ff-93d5-dcb5dfd1c6de")
IAsyncOperation_HSTRING : public IInspectable
{
public:
virtual HRESULT STDMETHODCALLTYPE put_Completed(IInspectable * handler) = 0;
virtual HRESULT STDMETHODCALLTYPE get_Completed(IInspectable** handler) = 0;
virtual HRESULT STDMETHODCALLTYPE GetResults(HSTRING* result) = 0;
};
SIZE_T StringLengthW(_In_ LPCWSTR String)
{
LPCWSTR String2;
for (String2 = String; *String2; ++String2);
return (String2 - String);
}
HRESULT RoWalkClipboardManagerObject(__FIVectorView_1_Windows__CApplicationModel__CDataTransfer__CClipboardHistoryItem* Items)
{
HRESULT Result = S_OK;
IClipboardHistoryItem* Object = NULL;
UINT32 Count = 0;
IDataPackageView* Data = NULL;
__FIAsyncOperation_1_HSTRING* TextObject = NULL;
HSTRING Text = NULL;
HSTRING UniqueId = NULL;
Result = Items->get_Size(&Count);
if (!SUCCEEDED(Result))
goto EXIT_ROUTINE;
for (UINT32 i = 0; i < Count; i++)
{
Result = Items->GetAt(i, &Object);
if (SUCCEEDED(Result))
{
Result = Object->get_Id(&UniqueId);
if (SUCCEEDED(Result))
{
Result = Object->get_Content(&Data);
if (SUCCEEDED(Result))
{
Result = Data->GetTextAsync(&TextObject);
if (SUCCEEDED(Result))
{
Result = TextObject->GetResults(&Text);
if (SUCCEEDED(Result))
printf("[+] Count: %d Item ID: %ws\r\nText Buffer: %ws\r\n", i, WindowsGetStringRawBuffer(UniqueId, NULL), WindowsGetStringRawBuffer(Text, NULL));
}
}
}
}
if(Text)
WindowsDeleteString(Text);
if (TextObject)
TextObject->Release();
if (Data)
Data->Release();
if (Object)
Object->Release();
if (UniqueId)
WindowsDeleteString(UniqueId);
}
Object = NULL;
UniqueId = NULL;
Data = NULL;
TextObject = NULL;
EXIT_ROUTINE:
if (Text)
WindowsDeleteString(Text);
if (TextObject)
TextObject->Release();
if (Data)
Data->Release();
if (Object)
Object->Release();
if (UniqueId)
WindowsDeleteString(UniqueId);
return Result;
}
INT main(VOID)
{
IClipboardStatics2* Statics = NULL;
IInspectable* ClipboardFactory = NULL;
HRESULT Result = S_OK;
HSTRING ClipboardStringObject = NULL;
__FIAsyncOperation_1_Windows__CApplicationModel__CDataTransfer__CClipboardHistoryItemsResult* AsyncOp = NULL;
__FIVectorView_1_Windows__CApplicationModel__CDataTransfer__CClipboardHistoryItem* Items = NULL;
IClipboardHistoryItemsResult* HistoryResults = NULL;
Result = RoInitialize(RO_INIT_SINGLETHREADED);
if (!SUCCEEDED(Result))
goto EXIT_ROUTINE;
Result = WindowsCreateString(L"Windows.ApplicationModel.DataTransfer.Clipboard", (UINT32)StringLengthW(L"Windows.ApplicationModel.DataTransfer.Clipboard"), &ClipboardStringObject);
if (!SUCCEEDED(Result))
goto EXIT_ROUTINE;
#pragma warning(push)
#pragma warning(disable: 6387)
Result = RoGetActivationFactory(ClipboardStringObject, __uuidof(IClipboardStatics2), (PVOID*)&ClipboardFactory);
#pragma warning(pop)
if (!SUCCEEDED(Result))
goto EXIT_ROUTINE;
Result = ClipboardFactory->QueryInterface(&Statics);
if (!SUCCEEDED(Result))
goto EXIT_ROUTINE;
Result = Statics->GetHistoryItemsAsync(&AsyncOp);
if (!SUCCEEDED(Result))
goto EXIT_ROUTINE;
Result = AsyncOp->GetResults(&HistoryResults);
if (!SUCCEEDED(Result))
goto EXIT_ROUTINE;
Result = HistoryResults->get_Items(&Items);
if (!SUCCEEDED(Result))
goto EXIT_ROUTINE;
Result = RoWalkClipboardManagerObject(Items);
if (!SUCCEEDED(Result))
goto EXIT_ROUTINE;
EXIT_ROUTINE:
if (ClipboardFactory)
WindowsDeleteString(ClipboardStringObject);
if (ClipboardFactory)
ClipboardFactory->Release();
if (Statics)
Statics->Release();
if (AsyncOp)
AsyncOp->Release();
if (HistoryResults)
HistoryResults->Release();
if (Items)
Items->Release();
return Result;
}Last updated