Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Системное программирование и WinAPI > Робота с буффером обмена


Автор: Sergio 9.10.2008, 22:24
Всем привет. 
Как достать с буфера обмена скопированые файлы?  Можно примерчик или линку  smile 
Спасибо.

Автор: azesmcar 10.10.2008, 07:04
посмотри функции

OpenClipboard
GetClipboardData
CloseClipboard

остальное есть в примерах в MSDN

Автор: Sergio 10.10.2008, 14:49
azesmcar, смотрел. Какой парамет использовать при GetClipboardData() ?

Автор: Earnest 10.10.2008, 18:15
Тот, который был использован при SetClipboardData. Ты должен знать, чтО пытаешься извлечь. И сначала надо спросить, есть ли там оно.

Автор: Sergio 10.10.2008, 19:21
Earnest, а есть функция которая вытянет даный тип? На подобии может GetCurrentClipboardType()

Автор: Earnest 11.10.2008, 10:04
Так именно это и делает GetClipboardData - достает данные запрашиваемого типа. А IsClipboardFormatAvailable скажет, есть ли там нужные данные.

Автор: Sergio 11.10.2008, 12:48
Earnest, еще вопрос: когда я выделяю файлы и используюю контрол + С, то какие даные попадают в буффер обмена?
Вот что написал:
Код

while (1)
{
    char * buffer;
    HWND windowPtr = GetForegroundWindow();

    if(OpenClipboard(windowPtr))
    {
        buffer = (char*)GetClipboardData(CF_TEXT);
        printf("Clipboard: %s\n", buffer);
    }

    CloseClipboard();
    CloseHandle(windowPtr);
}        

Вытягивает текст з активного окна. 
Но  не вытягивает файлы (пути) которые были скопированы. 
В чём проблема? Я думаю тип не подходящий. 

Автор: Earnest 11.10.2008, 14:14
А с какой радости он должен пути запоминать? Запоминается действительно текст из окна. А пути хранятся во внутренних данных, до которых ты вряд ли сумеешь добраться. И тип тут не причем - телепатов нет не только среди людей, но и среди программ. Если ты про окно эксплорера, то попробуй прочитать путь из поля-редактора вверху окна. Однако не факт, что он там есть... Наверняка можно добраться через интерфейс эксплорера... но как - без понятия.

Автор: 586 11.10.2008, 18:52
Sergio, для HWND не нужно вызывать CloseHandle.

Автор: Sergio 12.10.2008, 14:15
Нашёл ответ на мсдн но он написан не на С/С++. 
https://forums.microsoft.com/Forums/ShowPost.aspx?PostID=1189429&SiteID=1
Поэтому постарался переписать. Вроде всё правильно но имя в консоль непишется
smile
Код

printf("File Name: %s\n", filename); 

Вот что получилось:
Код

    while (1)
    {
        HANDLE buffer = NULL;
        UINT nFiles = 0;

        HWND windowPtr = GetForegroundWindow();        //FindWindowEx(0, 0, _T("CabinetWClass"), 0);
        
        if (IsClipboardFormatAvailable(CF_HDROP))
        {
            printf("CF_HDROP is available\n");

            if(OpenClipboard(windowPtr))
            {
                buffer = GetClipboardData(CF_HDROP);    
                nFiles = DragQueryFileA((HDROP)buffer, 0xFFFFFFFF, "", 0);

                printf("nFiles: %d\n", nFiles);

                for (int a = 0; a<nFiles; a++)
                {
                    char filename[MAX_PATH];
                    DragQueryFileA((HDROP)buffer, a, filename, strlen(filename));
                    printf("File Name: %s\n", filename);
                }
            }
            CloseClipboard();
        }
    }    

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)