Вы еще перетаскиваете окна за заголовок?

Хочу поделиться небольшим скриптом, который мне хорошо экономит нервы при работе с современными оконными объектами Windows. Я "старый дроид" и поэтому предпочитаю, чтобы моя операционная система при переходе от версии к версии не меняла свой графический интерфейс. Не зря говорят: "раньше трава была зеленее". Вот так и у меня: при установке очередной версии Windows (начиная с 7) я каждый раз ставлю Classic Shell с пуском в стиле W95/98/XP. Почему я так люблю эти графические стили? Да потому что они были идеально рассчитаны на работу с мышью и годами приучали нас.

Одним из моментов, который не дает мне покоя в современной Windows, является постоянные эксперименты с заголовками окон в плане стилей: их то ужимают, то растягивают, то сливают по цвету с фоном. Например, если в браузере открыто много вкладок и он не в полноэкранном режиме, то сложно перетащить его мышкой за верхний край, потому что этого края нет—всё пространство занято вкладками. В Windows 98 и XP такой ерунды не было: при любом раскладе всегда был заголовок окна с приятным градиентом, за который ты мог перетаскивать окно. А сейчас посадили модных дизайнеров, и они испортили UI/UX.

Иногда какие-то умные программисты создают шикарные вещи—позволяют окно своего приложения таскать за любую его часть. Это очень удобно, и я захотел, чтобы у меня так работали все мои программы. Я перебрал несколько вариантов, на чём написать, и остановился на старом добром AutoIt. Идеальный язык автоматизации Windows с возможностью компилировать в относительно небольшой exe-файл. Из коробки идёт сворачивание приложения в трей.

Но просто так позволить окну перетаскиваться при зажатой левой кнопке—это опрометчиво, ведь тогда перестанут работать скроллы, перетаскивание файлов и прочая drag-and-drop возня. Соответственно, нужно сделать горячую клавишу, при зажатии которой можно перетаскивать окна мышкой. На роль этой клавиши идеально подходит Alt. Побочным эффектом скрипта является то, что можно таскать абсолютно любое окно (потому что в Windows окнами сделано очень многое). Например, кнопка "Пуск"—это окно, и её можно утащить куда угодно; она будет там висеть, пока не нажмете на клавишу Win, которая восстанавливает её координаты. Также можно двигать само меню "Пуск".

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

В итоге скрипт получился таким:

#include <WindowsConstants.au3>
#include <MsgBoxConstants.au3>
#include <Misc.au3>

Global $hWnd = 0

Global $isDragging = False

While True

; Проверяем, зажата ли левая кнопка мыши

If _IsPressed('01') and _IsPressed('12') Then

; Получаем текущее положение мыши

Local $mousePos = MouseGetPos()

If _IsMouseOnWindow($mousePos[0], $mousePos[1]) Then

; Если окно не выбрано, выбираем его

If $hWnd = 0 Then

$hWnd = WinGetHandle("")

; Запоминаем начальную позицию курсора

$startX = $mousePos[0]

$startY = $mousePos[1]

$winPos = WinGetPos($hWnd)

$offsetX = $startX - $winPos[0]

$offsetY = $startY - $winPos[1]

EndIf

$isDragging = True

EndIf

Else

; Отпускаем окно при отпускании левой кнопки

If $isDragging Then

$hWnd = 0

$isDragging = False

EndIf

EndIf

; Если мы в режиме перетаскивания

If $isDragging Then

; Получаем текущее положение мыши

$mousePos = MouseGetPos()

; Перемещаем окно

WinMove($hWnd, "", $mousePos[0] - $offsetX, $mousePos[1] - $offsetY)

EndIf

Sleep(5)

WEnd

Func _IsMouseOnWindow($x, $y)

; Создаем область определения для поиска окна под мышью

Local $hWndUnderMouse = WinGetHandle("")

Return ($hWndUnderMouse <> "")

EndFunc

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

Если кто-то так же страдает от тонких полосок для перетаскивания или одинакового цвета фона активной области окна и заголовка - думаю вам такое пригодится.

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

22
16 комментариев

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

6
1

Ну так я дед) и меня бесит что иной раз заголовок сливается с активной частью окна - а теперь мне похуй. Я тащу за любое магкое место.

Нихуя не понял, у меня пластиковые окна стоят, где у них заголовок?

Да вон же, наверху

3

Ничего себе. А я думал, что я последний, кто ещё пишет на autoit.

Да, я по молодости помню проги объемные писал - автоматизацию для предприятия по тестированию авиационного ПО. Раньше люди сидели и руками прокликивали гуевое приложение и убивали тонну времени. С автоитом приложуху просто поставили на виртуалку, запустили скрипт и он сам так все прокликивал согласно сценарию в экселе. Такчто автоит - это база автоматизации винды. Особенно когда его к питону прикрутили - то и приятнее стало писать логику.

1

Классный хуй огроменные яйца