Фича Drag-and-Drop в приложениях Delphi: решение проблем на удаленном рабочем столе Windows Server 2019
Работа с фичами drag-and-drop в приложениях на Delphi может вызвать сложности при выполнении в удаленном рабочем столе, например, на Windows Server 2019. В статье мы рассмотрим проблематику, которая возникает при попытке перетаскивания файлов из локальной среды в приложение, работающее на удаленной машине, и предложим решения, основанные на передовом опыте и лучших практиках.
Проблема
Пользователи часто сталкиваются с трудностями при использовании функции перетаскивания файлов (drag-and-drop) в приложениях Delphi, запущенных в удаленном рабочем столе. Несмотря на то, что код работает корректно в локальной среде, проблемы могут возникать при попытке переноса файлов из локальной системы на удаленное приложение.
Пример кода для локальной среды
constructor TForm1.Create(AOwner: TComponent);
begin
inherited;
ChangeWindowMessageFilter(WM_DROPFILES, MSGFLT_ADD);
ChangeWindowMessageFilter(WM_COPYDATA, MSGFLT_ADD);
ChangeWindowMessageFilter(WM_COPYGLOBALDATA, MSGFLT_ADD);
DragAcceptFiles(Handle, True);
end;
destructor TForm1.Destroy;
begin
DragAcceptFiles(Handle, False);
inherited;
end;
procedure TForm1.GetDropFilenames(const ADropHandle: HDROP);
var
I, LFileCount, LLength: Integer;
LFilename: string;
begin
LFileCount := DragQueryFile(ADropHandle, $FFFFFFFF, nil, 0);
for I := 0 to LFileCount - 1 do
begin
LLength := DragQueryFile(ADropHandle, I, nil, 0) + 1;
SetLength(LFilename, LLength);
DragQueryFile(ADropHandle, I, PChar(LFilename), LLength);
LLength := Pos(#0, LFilename);
if LLength > 0 then
LFilename := LFilename.Substring(0, LLength - 1);
LogMemo.Lines.Add('Filename Copied To Clipboard: ' + LFilename);
end;
end;
procedure TForm1.WMDropFiles(var Msg: TWMDropFiles);
begin
GetDropFilenames(Msg.Drop);
Msg.Result := 0;
inherited;
end;
При использовании данного кода в локальной среде перетаскивание файлов на приложение приводит к тому, что имена файлов добавляются в Memo.
Потенциальное решение
Некоторые пользователи предполагали, что запуск приложения с повышенными привилегиями может решить проблему, но это не всегда работает. В качестве альтернативного подхода было предложено реализовать интерфейс IDropTarget и зарегистрировать его с помощью RegisterDragDrop(). Это может быть более предпочтительным способом, так как обработка WM_DROPFILES устарела.
Важные замечания
IDropTarget: Реализация интерфейса IDropTarget и использование RegisterDragDrop() может быть предпочтительнее, особенно учитывая устаревание обработки WM_DROPFILES.
Среда RDP: Важно понимать, что приложение в удаленной рабочей среде RDP не является целевым объектом для перетаскивания файлов из локальной системы. Это может быть связано с ограничениями терминальных служб.
Нативная работа: Перетаскивание файлов между оболочками разных машин не поддерживается по умолчанию, что указывает на необходимость настройки, а не изменения кода.
Заключение
Для решения проблемы с перетаскиванием файлов в приложениях Delphi, работающих на удаленном рабочем столе Windows Server 2019, следует рассмотреть реализацию интерфейса IDropTarget и использование функции RegisterDragDrop(). Также важно учитывать специфику работы удаленных рабочих столов и возможные ограничения, связанные с терминальными службами.
Обратите внимание, что данная статья содержит общие рекомендации и не включает подробное руководство по реализации IDropTarget, что может потребовать дополнительного изучения и экспериментов с вашей стороны.
Проблемы и решения при реализации функционала drag-and-drop в приложениях Delphi для удаленной рабочей среды Windows Server 2019.
Комментарии и вопросы
Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS