Na początku chciałbym wszystkich przywitać, jestem nowy na forum :)
Mam za zadanie tworzenie backup'ów wszystkich kopiowanych/wklejanych plików w systemie. Pierwsze co przyszło mi do głowy to odbieranie wiadomości WM_DRAWCLIPBOARD, tak więc zrobiłem i wyskrobałem takie coś:
case WM_DRAWCLIPBOARD:
{
if(IsClipboardFormatAvailable(CF_HDROP) == true && OpenClipboard(NULL) == true)
{
HGLOBAL hGlobal = GetClipboardData(CF_HDROP);
if(hGlobal != NULL)
{
std::vector<std::string> copiedFiles;
UINT numberCopiedFiles;
char filePath[MAX_PATH + 1];
HDROP hDrop = (HDROP)GlobalLock(hGlobal);
if(hDrop != NULL)
{
numberCopiedFiles = DragQueryFile(hDrop, 0xFFFFFFFF, NULL, 0);
for(UINT i = 0; i < numberCopiedFiles; i++)
{
DragQueryFile(hDrop, i, filePath, MAX_PATH + 1);
// tutaj operacje
}
GlobalUnlock(hGlobal);
}
}
CloseClipboard();
}
}
Lecz po kilku testach zorientowałem się, iż WM_DRAWCLIPBOARD jest wysyłana zarówno podczas kopiowania jak i wycinania. Od razu spostrzegłem, że może to powodować błąd w pewnych sytuacjach, np przypuśćmy taki scenariusz: użytkownik wyciął plik, mój program pobiera jego ścieżkę, następnie użytkownik wkleja ten plik do innego folderu, a więc mój program zawiera już nieistniejącą ścieżkę pliku. Dlatego ten pomysł raczej odpada. Pomyślałem, że lepszym rozwiązaniem było by otrzymywać listę plików(ich ścieżki) kiedy zostaną już gdzieś wklejone, a nie kiedy zostały skopiowane/wycięte, lecz za bardzo nie wiem jak się za to zabrać.
EDIT: znalazłem coś o co mi chodzi: Clipboard.GetFileDropList(), lecz jest to funkcją framework'u .NET, ja potrzebuje takiego odpowiednika dla C++.