Перетаскивание окон с помощью MoveWindow
От: korggrodno  
Дата: 10.09.10 17:39
Оценка:
Хочу написать код который будет расставлять окна от одной программы (не моя программа).
Программирую я на C#.net

Вначале Я написал следующие код.

WAPI.SetCursorPos(x1,y1); // устанавливаем курсор над шапкой окна
WAPI.mouse_event((int)(WAPI.MouseEventFlags.LEFTDOWN), 0, 0, 0, 0); //надавливаем левую кнопку мыши
Thread.Sleep(100); // ждем некоторое время пока окно среагирует на клик (без этой задержки не работало)
WAPI.SetCursorPos(x2,y2); ( перемещаем курсор мыши с захваченным окном в нужное место)
WAPI.mouse_event((int)(WAPI.MouseEventFlags.LEFTUP), 0, 0, 0, 0); // отпускаем левую кнопку мыши.

И это работало.
Но у кода на лицо недостатки
1) Мышь летает по экрану во время расстановки окон
2) В коде задержка . И окна от этого видно глазом как расставляются друг за другом.

Потом я порылся по WinApi И нашел такие инструменты как SetWindowPos и MoveWindow
Переписал свой код вначале с использование SetWindowPos но были глюки и потом переписал с использованием MoveWindow
И код работал одинаково. С одним и тем же глюком.

Сейчас о глюке подробнее.

Допустим у меня есть 3 окна
посылаю всем
WAPI.MoveWindow(_handle, pX, pY, r.Width, r.Height, true);
И все окна мгновенно становятся там где нужно
Затем примерно через полминуты (в зависимости от того как прыгают динамические контролы в окнах)
То окно которому MoveWindow послано первому.
Перепрыгивает в старую позицию. (Старая позиция- та позиция у окна которая была до отправки ему MoveWindow)
Причем остальные окна после этого скачка остаются там куда их переместили. И дальше все ок.

Тот же самый глюк наблюдается со скочком первого окна .
Если закрыть второе или третье окно.

Вот лог сообщений которые окно получает во время перепрыга отловленный с помощью spy++
http://xmages.net/storage/10/1/0/b/a/upload/71504a86.jpg
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.