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

[]

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


Так бы и говорил сразу, а то я понял так, что тебе нужно засунуть все это дело в clipboard, дабы потом можно было в проводнике сделать paste...
В твоем случае еще проще, просто делаешь
const TCHAR* name1 = _T("c:\\temp\\mycoolfile1.txt");
const TCHAR* name2 = _T("c:\\temp\\mycoolfile2.txt");
drop_names names;
names.add(name1);
names.add(name2);
const TCHAR* file_names = names.lock();

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

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

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

впрочем, лишние танцы вокруг HGLOBAL можно тоже убрать, но это не суть важно.

ЗЫ А вообще в TFM'е писано

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

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

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