DoDragDrop () из другого потока - PullRequest
       2

DoDragDrop () из другого потока

0 голосов
/ 21 августа 2010

Каждый раз, когда я хочу позволить пользователю перетащить элемент управления, я вызываю DoDragDrop этого элемента управления.

Перетаскивание работает нормально, но у меня возникают проблемы с окружающими вещами:

  1. DoDragDrop полностью блокирует форму, нет событий таймера, не обрабатываются сообщения рисования.

  2. Блокировка DoDragDrop не только для операции перетаскивания, но и до завершения целевой программы ссобытие drop (код отстой IE explorer.exe).В зависимости от кода другой программы это отстой.

Я думал вызвать DoDragDrop из нового потока.

пробовал это:

Thread dragThread = new Thread(() =>
{
    Form frm = new Form();
    frm.DoDragDrop("data", DragDropEffects.All);
});

dragThread.SetApartmentState(ApartmentState.STA);
dragThread.IsBackground = true;
dragThread.Start();

но этоне похоже на работу.Я имею в виду: при выполнении DoDragDrop из другого потока, подобного этому, другие элементы управления в моей программе или другие программы не получают сообщения перетаскивания.

Какие-либо другие решения?

Ответы [ 3 ]

4 голосов
/ 10 октября 2011

Метод DoDragDrop останавливает обработку событий до первого события мыши (например, перемещение мыши ). Поэтому обходной путь, который я нашел, очень прост - вам просто нужно смоделировать событие мыши с той же позицией мыши непосредственно перед вызовом DoDragDrop:


void XYZControl_MouseDown(object sender, MouseEventArgs e)
{
    var senderControl = (Control) sender;
    ...
    Cursor.Position = senderControl.PointToScreen(new Point(e.X, e.Y));   // Workaround!
    if (DoDragDrop(senderControl, DragDropEffects.Move) == DragDropEffects.Move)
    {
    ...
    }
....
}
1 голос
/ 16 сентября 2010

Вы, вероятно, хотите, чтобы DoDragDrop прекратил работу и выполнял работу асинхронно.

Вот ответ.

1 голос
/ 21 августа 2010

Вам нужно забыть об использовании потока, который будет только доставлять уведомления D + D в окна, созданные в этом потоке.Который не будет вашим контролем.

Я ничего не могу поделать с диагностикой "код - отстой".Сам вызов DoDragDrop () действительно будет блокироваться, пока кнопка мыши не будет отпущена.Другой цикл сообщений, внутренний для кода COM, возьмет на себя и доставит сообщения Windows.Сообщения таймера и рисования должны доставляться как обычно.Диагностика очень трудна, пока вы не отправите какой-либо код репро.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...