Везде с той или иной степенью подробности описана реализация Drag&Drop на принимающей стороне (WM_DROPFILES c параметром HDROP, DragQueryFile и т.д.), но нигде нет о стороне передающей. Вопрос: как мне програмно сделать d&d, или иначе как сформировать этот самый HDROP. Про ОЛЕшный вариант читал, не подходит.
Здравствуйте, Patalog, Вы писали:
P>Например так — P>[.......] P>ЗЫ Особо не тестил, так что може где огрехи есть, но думаю идея понятна.
Как раз не понятна . Вернее, что делаете понятно, не понятно что мне с этим делать дальше. Что мне делать с клипбордом, в котором список файлов лежит?
Попробую свой первоначальный вопрос уточнить — есть некая программа (не моя, и менять я в ней ничего не могу), которая может принимать DnD. Мне нужно ей файлик для открытия подсунуть, это как раз было бы просто через DnD сделать, послав в ее окно WM_DROPFILES. Да вот загвоздка — не могу для WM_DROPFILES HDROP-параметр сформировать. Неужели это прерогатива только системы?
[]
A>Попробую свой первоначальный вопрос уточнить — есть некая программа (не моя, и менять я в ней ничего не могу), которая может принимать DnD. Мне нужно ей файлик для открытия подсунуть, это как раз было бы просто через DnD сделать, послав в ее окно WM_DROPFILES. Да вот загвоздка — не могу для WM_DROPFILES HDROP-параметр сформировать. Неужели это прерогатива только системы?
Так бы и говорил сразу, а то я понял так, что тебе нужно засунуть все это дело в clipboard, дабы потом можно было в проводнике сделать paste...
В твоем случае еще проще, просто делаешь
впрочем, лишние танцы вокруг 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.
Здравствуйте, Patalog, Вы писали:
P>Здравствуйте, alexqc, Вы писали:
P>[]
A>>Попробую свой первоначальный вопрос уточнить — есть некая программа (не моя, и менять я в ней ничего не могу), которая может принимать DnD. Мне нужно ей файлик для открытия подсунуть, это как раз было бы просто через DnD сделать, послав в ее окно WM_DROPFILES. Да вот загвоздка — не могу для WM_DROPFILES HDROP-параметр сформировать. Неужели это прерогатива только системы?
P>Так бы и говорил сразу, а то я понял так, что тебе нужно засунуть все это дело в clipboard, дабы потом можно было в проводнике сделать paste...
Про клипбоард я вообще ни слова не говорил.
P>В твоем случае еще проще, просто делаешь 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.
Точно ли drop_data в этом случае тот самый HDROP? (об этом как раз в TFM нет ни слова )
P>ЗЗЫ Хотя ежели ты сообщение шлешь в другое приложение, тогда скорее всего в clipboard таки пихать придется, а в SendMessage отдавать то, что вернет SetClipboardData.
[]
P>>Так бы и говорил сразу, а то я понял так, что тебе нужно засунуть все это дело в clipboard, дабы потом можно было в проводнике сделать paste...
A>Про клипбоард я вообще ни слова не говорил.
Ну это я почему-то так понял
[]
A>Я для проверки делал
A> int size=strlen(lpDroppedText)+2+sizeof(DROPFILES);
A> HGLOBAL drop_data = GlobalAlloc(GMEM_ZEROINIT | GMEM_MOVEABLE | GMEM_DDESHARE, size);
A> struct DROP_DATA{
A> DROPFILES df;
A> char names[1];
A> } *hal=(DROP_DATA*)GlobalLock(drop_data);
A> memset(hal,0,size); // не нужно, у тебя же GMEM_ZEROINIT
hal->>df.fNC=sizeof(DROPFILES);
A> strcpy(hal->names,lpDroppedText);
A> GlobalUnlock(drop_data);// Думается это надо делать после DragQueryFile
A> int ret=DragQueryFile(HDROP (drop_data)
A> ,UINT(0xFFFFFFFF), NULL,0);
A> GlobalFree(drop_data);
A>получаю ret=0, т.е. ошибку.
A>Точно ли drop_data в этом случае тот самый HDROP? (об этом как раз в TFM нет ни слова )
Дык я же приводил цитату из TFM. К тому же реальность данная мне в ощущениях это подтверждает.
P>>ЗЗЫ Хотя ежели ты сообщение шлешь в другое приложение, тогда скорее всего в clipboard таки пихать придется, а в SendMessage отдавать то, что вернет SetClipboardData.
A>Что-то извратом пахнет, да и clipboard портить...
Ну clipboard то ты не испортишь, бо таким образом copy\paste в explorer (или еще куда) проще всего сделать.
Правда для WM_DROPFILES это не работает, собст. как я и думал из-за границ процесса.
Вобщем лови. Писано в MFC'ях, но думается под голое API переделать труда не составит. Запускаешь 2 экземпляра приложения и тащиш мышой из одного в другое.
ЗЫ Ежели надо чтоб работало и под w9x, то придеться вместо VirtualAllocEx\WriteProcessMemory использовать внедрение dll. Подробнее об этом полно инфы тут на сайте, ну иеще конечно у Рихтера.
Я понял в чем дело. Досадная описка, незамеченная ни мной, ни Вами:
A>> hal->df.fNC=sizeof(DROPFILES);
вместо hal->df.pFiles=sizeof(DROPFILES);
А с остальным — memset лишнее, согласен, а вот GlobalUnlock надо наверно все же до DragQueryFile делать.
Потом, после DragQueryFile я делаю GlobalFree.
И такой вопрос — DragFinish что освободит? Я к тому, что если приложение куда я WM_DROPFILES пошлю сделает DragFinish, мне уже GlobalFree не надо будет делать?