
ropblHa


Полезности::Часть 1
Хочу поделиться небольшим скриптом, который мне хорошо экономит нервы при работе с современными оконными объектами 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 я, не задумываясь где мой курсор, спокойно перетаскиваю или просто сдвигаю активное окно куда мне нужно.
Если кто-то так же страдает от тонких полосок для перетаскивания или одинакового цвета фона активной области окна и заголовка - думаю вам такое пригодится.
Любителей таскать окна с клавиатуры сразу предупрежу - это я умею. Просто не всегда удобно, ну и плюс с клавиатуры есть только ряд дискретных позиций.
p.s. Пикабу не умеет форматировать код:( - ну понятно..это ж не Хабр
Тишина была недолгой...
Тишина и покой были недолгими. Мирно дремавшие частицы вдруг сорвались с места. Вихри электрических полей захватили их и потащили через дебри кристаллических решеток.
Их движение незамедлительно вызвало ток в проводниках и полупроводниках. Одни конденсаторы с удовольствием приступили к накоплению энергии, другие с горестью разряжались, сетуя на слишком высокие тактовые частоты. Полевые транзисторы, почувствовав потенциалы, начали открываться и закрываться, формируя из непрерывного потока частиц осмысленные сигналы.
На эти пляски в низкоуровневых трущобах сверху взирала интегральная микросхема, лениво отыгрывающая свою роль. Щелкали триггеры, ждали своей очереди пороговые элементы, рулили потоками инверторы, конъюнкторы и дизъюнкторы.
Где-то вдали взвыл тактовый генератор процессора, возвещающий о том, что пора бы отдать данные дальше и микросхема, щелкнув полевиками, выплюнула последовательность в бездну проводников.
Управляющий сигнал рванул по магистралям и сгинул в недрах центрального процессора.
Процессор проснулся, отряхнувшись от остатков дремы.
Он рассмотрел пришедший сигнал, задумался, глянул в оперативку, что то там перетасовал и уверившись в своих намерениях, запустил целый каскад сигналов.
Тысячи и тысячи импульсов побежали от процессора, соревнуясь в скорости. Их уже ждало несметное войско ключевых транзисторов, готовых начать свою работу.
И как только сигналы пришли - миллионы кремневых бойцов открылись и дали ток оптическим ячейкам, которые начали излучать яркие цвета...
...Экран смартфона засветился и я нехотя глянул на него - чертов сбербанк опять слал смску с предложением о просто невероятном кредите. Нажав кнопку питания, я вырубил экран.
И снова наступили тишина и покой.... (с)