Как "заставить" Windows копировать файл в заданную папку при выполнении Drag'n'drop независимо от того, находится ли файл на том же диске, что и папка, или нет? (по умолчанию поведени е виндовс — копировать с других дисков и перемещать, если source file и drop target folder находятся на одном диске).
23.07.07 18:08: Перенесено модератором из 'C/C++' — Кодт
26.07.07 21:26: Перенесено модератором из 'Прочее'. Вопрос по Shell Extensions — Кодт
Здравствуйте, ab1111, Вы писали:
A>Как "заставить" Windows копировать файл в заданную папку при выполнении Drag'n'drop независимо от того, находится ли файл на том же диске, что и папка, или нет? (по умолчанию поведени е виндовс — копировать с других дисков и перемещать, если source file и drop target folder находятся на одном диске).
Нажать и держать Ctrl во время отпускания правой кнопки мыши.
Здравствуйте, Кодт, Вы писали: >... К>Нажать и держать Ctrl во время отпускания правой кнопки мыши.
К сожалению, не подходит. Уточнение — при обычном перетягивании (никаких клавиш модификаторов или же перетягиваний правой кнопкой). То есть для пользователя эта папка должна быть обычной и он должен использовать drag-n-drop обычным способом. Но при этом файл должен всегда копироваться. Допускаются специфичные настройки системы, shell extensions etc.
Здравствуйте, Кодт, Вы писали: К>Нажать и держать Ctrl во время отпускания правой кнопки мыши.
Почему правой?
2 ab1111:
Удерживая Ctrl, сделайте обычный drag'n'drop (левой кнопкой мыши). При этом курсор будет такой: стрелка и квадратик с плюсом (Windows XP, настройки по умолчанию).
Здравствуйте, Пётр Седов, Вы писали:
К>>Нажать и держать Ctrl во время отпускания правой кнопки мыши. ПС>Почему правой?
Потому что ошибся Я использую правильное решение, а в эксплорер лазаю только от безысходности.
ПС>P. S. А теперь правильное решение: F5 в Far-е .
Ес, ыт ыз!
Здравствуйте, Пётр Седов, Вы писали:
ПС>Здравствуйте, Кодт, Вы писали: К>>Нажать и держать Ctrl во время отпускания правой кнопки мыши. ПС>Почему правой?
ПС>2 ab1111: ПС>Удерживая Ctrl, сделайте обычный drag'n'drop (левой кнопкой мыши). При этом курсор будет такой: стрелка и квадратик с плюсом (Windows XP, настройки по умолчанию).
ПС>P. S. А теперь правильное решение: F5 в Far-е .
Лично _я_ знаю о всех этих способах с правыми кнопками и клавишами-модификаторами... Решение делается не для себя, а для среднестатистического пользователя. То есть пользователь, не задумываясь, должен получать всегда копирование при перетягивании в конкретную папку. НЕ нажимая при этом доп. клавиш и используя обычное перетягивание левой кнопкой. То есть вопрос в категорию "программирование" (или возможно "настройка ОС") но никак в использование Винды для новичков
Здравствуйте, ab1111, Вы писали:
A>Решение делается не для себя, а для среднестатистического пользователя. То есть пользователь, не задумываясь, должен получать всегда копирование при перетягивании в конкретную папку. НЕ нажимая при этом доп. клавиш и используя обычное перетягивание левой кнопкой.
Имеет смысл почитать статьи из раздела «Windows Shell».
Также на ум приходит следующее решение. Когда Windows начинает работать, автоматически запускается наша программа. Она показывает окно. У этого окна есть расширенный стиль (extended style) WS_EX_ACCEPTFILES, поэтому на это окно можно перетаскивать файлы из Explorer-а (drag'n'drop-ом), окно при этом получает сообщение WM_DROPFILES. Параметр wParam – это HDROP, из него можно вытащить пути файлов с помощью функции DragQueryFile.
Можно сделать так, чтобы это окно было похоже не на стандартное окно с рамкой (title bar и так далее), а на иконку c текстом. Для этого нужно:
* Указать тип окна WS_POPUP (а не WS_OVERLAPPED; у overlapped-окон всегда есть title bar).
* Сделать окно сложной (то есть не прямоугольной) формы. Есть два способа:
1. Создать GDI-регион (например, с помощью функции ExtCreateRegion) и назначить его окну с помощью функции SetWindowRgn.
2. Начиная с Windows 2000 можно создать layered-окно (расширенный стиль WS_EX_LAYERED) и указать некоторый цвет как «прозрачный» с помощью функции SetLayeredWindowAttributes. Pixel-ы окна «прозрачного» цвета не видны, вместо них виден фон (desktop или другие окна).
.
A>То есть вопрос в категорию "программирование" (или возможно "настройка ОС") но никак в использование Винды для новичков
Тогда да, эту ветку надо перенести в форум «WinAPI».
Здравствуйте, ab1111, Вы писали:
A>Как "заставить" Windows копировать файл в заданную папку при выполнении Drag'n'drop независимо от того, находится ли файл на том же диске, что и папка, или нет? (по умолчанию поведени е виндовс — копировать с других дисков и перемещать, если source file и drop target folder находятся на одном диске).
Зажать Ctrl? только какое отношение к теме топика?
Здравствуйте, OdesitVadim, Вы писали: OV>Зажать Ctrl? только какое отношение к теме топика?
Насколько я понял, ab1111 хочет сделать высокоуровневый интуитивно-понятный (drag'n'drop) интерфейс пользователя. Но не для себя, а для стороннего пользователя, которому не обязательно знать Far или что-нибудь подобное. Поэтому ab1111 хочет, чтобы при перетаскивании файлов на иконку его folder-а выполнялись необычные действия (не то, что по умолчанию в Explorer-е). В Windows уже есть аналогичные feature: если файл перетащить на иконку recycled bin, то файл «исчезнет»; если файл перетащить на иконку принтера, то Windows попытается распечатать файл.
Попробую переформулировать вопрос в виде use-case.
1) Открываем в первом окне Windows Explorer папку C:\test1
2) Открываем во втором окне Windows Explorer папку C:\test2
3) Выделяем и тащим левой кнопкой мыши файл test.txt из окна C:\test2 в окно C:\test1
Получаем: файл test.txt _перемещён_ из test2 в test1.
Требуется: файл test.txt скопирован из test2 в test1, при этом никаких дополнительных действий вроде нажатий клавиши Ctrl не придпринималось.
---
В принципе да, Вы правы, я ожидал решить это с Shell Extensions. Но _как_ это сделать найти мне не удалось, собственно из-за чего и возник вопрос здесь.
ЗЫ Изначально вопрос публиковался в С/С++, но был перенесён ув. модератором.
Здравствуйте, Пётр Седов, Вы писали:
ПС>Насколько я понял, ab1111 хочет сделать высокоуровневый интуитивно-понятный (drag'n'drop) интерфейс пользователя. Но не для себя, а для стороннего пользователя, которому не обязательно знать Far или что-нибудь подобное. Поэтому ab1111 хочет, чтобы при перетаскивании файлов на иконку его folder-а выполнялись необычные действия (не то, что по умолчанию в Explorer-е). В Windows уже есть аналогичные feature: если файл перетащить на иконку recycled bin, то файл «исчезнет»; если файл перетащить на иконку принтера, то Windows попытается распечатать файл.
А если перетащить на ярлык папки с сетевого диска, то файлы скопируются независимо от ctrl.
Т.е., решение вполне обыденное — сделать для этого пользователя(ей) папку(и) на сервере.
От оной централизации может быть и другая польза, IMHO.
Здравствуйте, ab1111, Вы писали:
A>Как "заставить" Windows копировать файл в заданную папку при выполнении Drag'n'drop независимо от того, находится ли файл на том же диске, что и папка, или нет? (по умолчанию поведени е виндовс — копировать с других дисков и перемещать, если source file и drop target folder находятся на одном диске).
Если у Вас свое приложение которое умеет работать с Shell Namespace Extension (грубо говоря свой explorer, реализующий IShellFolder и т.п.), то достаточно использовать DROPEFFECT_COPY в ф-х вроде DoDragDrop.
короче дорога лежит сюда, может быть кстати вот серьезный пример для старта покопать
вообще, полной уверенности что есть официальный COM/Shell способ для кастомизации под себя drag drop операций на уровне shell namespace, когда и source и target чужие — у меня нет.
Но если даже Shell Extensions вдруг окажется недостаточно — всегда можно в чужом процессе, вроде самого explorer — внедриться и поставить хуки на нужные места (тот же DoDragDrop), где и подменять требования move на copy. И\или, возможно, придется следить за запросом интерфейсов IDropTarget и отслеживать потом вызовы их методов DragEnter/DragLeave/Drop — с той же целью подмены запрошенного DROPEFFECT на свой.
... << RSDN@Home 1.2.0 alpha rev. 685>>
Valery A. Boronin, RSDN Team, linkedin.com\in\boronin
R&D Mgmt & Security. AppSec & SDL. Data Protection and Systems Programming. FDE, DLP, Incident Management. Windows Filesystems and Drivers.