Не смог придумать лучшего названия для темы...
Хочу сделать что бы когдя тянешь за заголовок активного окна(при условии что оно развернуто во весь экран) - оно сворачивалось(или востанавливалось, незнаю как это назвать) и его можно было дальше таскать. В Windows 7 насколько я помню такая функция реализована, а вот в Win XP нет.
Придумал такое решение, но оно работает только если мышь двигать ОЧЕНЬ медленно иначе пока окно трансформируется мышь перемещается хтозна куда.
Возможно если бы сделать как-то так что бы око моментально трансформировалось, то все заработает.
Хочу сделать что бы когдя тянешь за заголовок активного окна(при условии что оно развернуто во весь экран) - оно сворачивалось(или востанавливалось, незнаю как это назвать) и его можно было дальше таскать. В Windows 7 насколько я помню такая функция реализована, а вот в Win XP нет.
Придумал такое решение, но оно работает только если мышь двигать ОЧЕНЬ медленно иначе пока окно трансформируется мышь перемещается хтозна куда.
Код:
#include "MouseOnEvent.au3"
Global $iDrag_Is_Active = False
Global $iMouseDown = 0
_MouseSetOnEvent($MOUSE_PRIMARYDOWN_EVENT, "_MouseDown", "", "", "", -1) ;Действие если зажата левая кнопка мыши
_MouseSetOnEvent($MOUSE_PRIMARYUP_EVENT, "_MouseUp", "", "", "", -1) ;Действие если левая кнопка мыши отпущена
While 1
Sleep(100)
WEnd
Func _MouseDown()
Local $sTitle = _GetTitleActiveWindow()
If $sTitle = -1 Then Return 1
$iMouseDown = 1
If BitAND(WinGetState($sTitle), 32) Then ;Если окно развернуто на весь экран
$aMousePos = MouseGetPos()
If $aMousePos[1] < 30 Then ;Если мышка находится в 30 пикселях сверху, то есть на заголовке
While 1 ;Ждем пока мыша сдвинется с места либо левая кнопка будет отпущена
$aMousePos2 = MouseGetPos()
If $iMouseDown = 0 Then
Return 0
EndIf
If ($aMousePos2[0] > $aMousePos[0] + 4) OR ($aMousePos2[0] < $aMousePos[0] - 4) OR ($aMousePos2[1] > $aMousePos[1] + 4) OR ($aMousePos2[1] < $aMousePos[1] - 4) Then
ExitLoop
EndIf
WEnd
MouseUp("left") ;Отпускаем левую кнопку что бы нечего не задеть ею. Так как окно с под нее переместится...
WinSetState($sTitle, "", @SW_RESTORE)
$aWinPos = WinGetPos($sTitle) ;Узнаем положение окна что бы потом разместить средино его заголовка под курсором
WinMove($sTitle, "", $aMousePos[0] - $aWinPos[2] / 2, 0) ;Размещаем середину заголовка окна под ИСХОДНЫМ ПОЛОЖЕНИЕМ курсора
MouseMove($aMousePos[0], $aMousePos[1], 0) ;Перемещаем курсор на исходное положение.(Окно трансформируется слишком медленно и пользователь наверняка успеет передвинуть курсор)
MouseDown("left") ;Зажимаем левую кнопку(мы её отпустили, но на самом деле юзер то не отпускал кнопку мыши) на заголовке что бы пользователь мог двигать окно
EndIf
EndIf
EndFunc
Func _MouseUp()
$iMouseDown = 0
EndFunc
Func _GetTitleActiveWindow()
Local $aWinList = WinList()
Local $sActiveWindow = 1
For $i = 1 To $aWinList[0][0]
; "Default IME" и "MCI command handling window" - какие-то системные окна, действия над ними приводят к странным последствиям. В общем лучше их не трогать
If ($aWinList[$i][0] <> "") AND ($aWinList[$i][0] <> "Default IME") AND ($aWinList[$i][0] <> "MCI command handling window") Then
If WinActive($aWinList[$i][0]) Then
$sActiveWindow = $aWinList[$i][0]
ExitLoop
EndIf
EndIf
Next
Return $sActiveWindow
EndFunc ;==>_GetTitleActiveWindow()
Возможно если бы сделать как-то так что бы око моментально трансформировалось, то все заработает.