Re[6]: Как "сэмулировать" драг-и-дроп?
От: alexqc Россия
Дата: 29.10.03 15:59
Оценка:
Здравствуйте, Patalog, Вы писали:

P>Здравствуйте, alexqc, Вы писали:


P>[]


A>>Попробую свой первоначальный вопрос уточнить — есть некая программа (не моя, и менять я в ней ничего не могу), которая может принимать DnD. Мне нужно ей файлик для открытия подсунуть, это как раз было бы просто через DnD сделать, послав в ее окно WM_DROPFILES. Да вот загвоздка — не могу для WM_DROPFILES HDROP-параметр сформировать. Неужели это прерогатива только системы?


P>Так бы и говорил сразу, а то я понял так, что тебе нужно засунуть все это дело в clipboard, дабы потом можно было в проводнике сделать paste...

Про клипбоард я вообще ни слова не говорил.

P>В твоем случае еще проще, просто делаешь

P>
P>const TCHAR* name1 = _T("c:\\temp\\mycoolfile1.txt");
P>const TCHAR* name2 = _T("c:\\temp\\mycoolfile2.txt");
P>drop_names names;
P>names.add(name1);
P>names.add(name2);
P>const TCHAR* file_names = names.lock();

P>DROPFILES drop_struct = { sizeof(drop_struct), { 0, 0 }, 0, 0 };
P>const size_t drop_size = sizeof(drop_struct) + names.size();

P>HGLOBAL drop_data = GlobalAlloc(0, drop_size);
P>unsigned char* clip_data = reinterpret_cast<unsigned char*>(drop_data);
P>memcpy(clip_data, &drop_struct, sizeof(drop_struct));
P>memcpy(clip_data + sizeof(drop_struct), file_names, names.size());

P>SendMessage(somebodycoolappwindow, WM_DROPFILES, (WPARAM)drop_data, 0);
P>

P>впрочем, лишние танцы вокруг HGLOBAL можно тоже убрать, но это не суть важно.
P>ЗЫ А вообще в TFM'е писано
P>

P>DROPFILES Structure
P>--------------------------------------------------------------------------------
P>Defines the CF_HDROP clipboard format. The data that follows is a double null-terminated list of file names.

P>так что мог бы и сам догадаться

Я для проверки делал

    int size=strlen(lpDroppedText)+2+sizeof(DROPFILES);
    HGLOBAL drop_data = GlobalAlloc(GMEM_ZEROINIT | GMEM_MOVEABLE | GMEM_DDESHARE, size);

    struct DROP_DATA{
    DROPFILES df;
    char names[1];
    } *hal=(DROP_DATA*)GlobalLock(drop_data);

    memset(hal,0,size);
    hal->df.fNC=sizeof(DROPFILES);
    strcpy(hal->names,lpDroppedText);
    GlobalUnlock(drop_data);

    int ret=DragQueryFile(HDROP (drop_data)
        ,UINT(0xFFFFFFFF), NULL,0);

    GlobalFree(drop_data);


получаю ret=0, т.е. ошибку.

Точно ли drop_data в этом случае тот самый HDROP? (об этом как раз в TFM нет ни слова )

P>ЗЗЫ Хотя ежели ты сообщение шлешь в другое приложение, тогда скорее всего в clipboard таки пихать придется, а в SendMessage отдавать то, что вернет SetClipboardData.


Что-то извратом пахнет, да и clipboard портить...
Живи, Україно, прекрасна і сильна
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.