Как бороться с Drag'N'Drop от Microsoft

397
28 декабря 2016, 02:14

В процессе поиска решения для этого вопроса, появился новый вопрос.

У контролов WinForms для работы с Drag'n'Drop в .NET предусмотрено несколько типовых событий и метод DoDragDrop.

Но есть несколько проблем связанных с ними. Если мы активируем DoDragDrop по событию MouseDown, то до завершения процесса перетаскивания окно нашей программы не получает события мыши, но получает события связанные с процедурой перетаскивания. Пока вроде все логично, но если после активации перетаскивания объекта мышь не перемещается, то процедура завершается не сразу, а с неопределенным таймаутом, и в это время события мыши не передаются нашему окну, что собственно и вызвало проблему описанную в вопросе по ссылке выше.

Для TreeView и ListView оказалось есть решение из коробки - событие ItemDrag, но для других контролов, которые потенциально могли бы стать источником для Drag'n'Drop, такого решения не предусмотрено.

Пока в голову пришло только одно решение:

  1. По событию MouseDown поднимать флаг о возможном начале перетаскивания и запоминать потенциальный объект перетаскивания в приватных полях формы.

  2. По событию MouseMove проверять флаг и состояние клавиш мыши, и если заданные условия выполнены, вызвать метод DoDragDrop в параметры которого передать предварительно сохраненный объект в качестве данных для перетаскивания. После этого сбросить флаг.

Но мне почему-то кажется что это костыль, потому что в зависимости от того, что и откуда мы собираемся перетаскивать, код будет различаться и его придется дублировать для каждой формы, в которой потребуется такой функционал.

Собственно вопрос, правильно ли я понимаю, что процесс перетаскивания выполняется в контексте операционной системы, а не отдельных программ, для обеспечения возможности перетаскивания объектов между программами? Если предположение верное, то существует ли решение обойти перечисленные проблемы более гибко, без строительства велосипедов из костылей? Если мое предположение не верно - то в ответе хотелось бы увидеть как это работает на самом деле.

Вопрос адресован скорее знатока WinAPI, но решение хотелось бы получить в контексте C#. В принципе, мне, подойдет любое решение, которое можно будет адаптировать для .NET, если оно будет лучше уже изложенного.

READ ALSO
500 Internal error при вызове метода API

500 Internal error при вызове метода API

Проблема в следующем: на платформе asp mvc 5 развернуто приложение, у которого есть некоторый apiПри попытке вызова методов api и передаче в качестве...

367
Упрощение struct->delegate c#

Упрощение struct->delegate c#

Есть запись данного вида

337
Исключение An error occured when call to 'gsapi_init_with_args' is made: -100

Исключение An error occured when call to 'gsapi_init_with_args' is made: -100

Код выдаёт исключение, в чём может быть проблема?

426
Как округлять переменные типа Date

Как округлять переменные типа Date

Есть данные со СКУДЭто время входа и время выхода

370