Что нового

[Мышь, клавиатура] Сворачивание окна если потянуть за заголовок

Anton

Твори! Пусть завистники твои захлебываются пылью!
Сообщения
69
Репутация
3
Не смог придумать лучшего названия для темы...

Хочу сделать что бы когдя тянешь за заголовок активного окна(при условии что оно развернуто во весь экран) - оно сворачивалось(или востанавливалось, незнаю как это назвать) и его можно было дальше таскать. В 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()


Возможно если бы сделать как-то так что бы око моментально трансформировалось, то все заработает.
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,666
Репутация
2,463
Как то так:
Код:
#include "MouseOnEvent.au3"

Global $iMouseDown = 0

_MouseSetOnEvent($MOUSE_PRIMARYDOWN_EVENT, "_MouseDown", "", "", "", 0) ;Действие если зажата левая кнопка мыши
_MouseSetOnEvent($MOUSE_PRIMARYUP_EVENT, "_MouseUp", "", "", "", 0) ;Действие если левая кнопка мыши отпущена

Opt("WinWaitDelay", 100)

While 1
    Sleep(10)
	
	If $iMouseDown Then
		Local $hWin = WinGetHandle("[ACTIVE]")
		If Not $hWin Then ContinueLoop
		
		If BitAND(WinGetState($hWin), 32) Then ;Если окно развернуто на весь экран
			$aMousePos = MouseGetPos()
			
			If $aMousePos[1] < 30 Then ;Если мышка находится в 30 пикселях сверху, то есть на заголовке
				While $iMouseDown ;Ждем пока мыша сдвинется с места либо левая кнопка будет отпущена
					$aMousePos2 = MouseGetPos()
					
					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
					
					Sleep(1)
				WEnd
				
				MouseUp("Main") ;Отпускаем левую кнопку что бы ничего не задеть ею. Так как окно с под нее переместится...
				WinSetState($hWin, "", @SW_RESTORE)
				
				$aWinPos = WinGetPos($hWin) ;Узнаем положение окна что бы потом разместить средино его заголовка под курсором
				
				If @error Then
					ContinueLoop
				EndIf
				
				;Размещаем середину заголовка окна под ИСХОДНЫМ ПОЛОЖЕНИЕМ курсора
				WinMove($hWin, "", $aMousePos[0] - ($aWinPos[2] / 2), 0)
				
				;Перемещаем курсор на исходное положение. (Окно трансформируется слишком медленно и пользователь наверняка успеет передвинуть курсор)
				MouseMove($aMousePos[0], $aMousePos[1], 0)
				
				;Зажимаем левую кнопку(мы её отпустили, но на самом деле юзер то не отпускал кнопку мыши) на заголовке что бы пользователь мог двигать окно
				MouseDown("Main")
			EndIf
		EndIf
	EndIf
WEnd

Func _MouseDown()
    $iMouseDown = 1
EndFunc

Func _MouseUp()
    $iMouseDown = 0
EndFunc


P.S
И не нужно прикреплять «MouseOnEvent.au3», она есть тут.
 
Автор
A

Anton

Твори! Пусть завистники твои захлебываются пылью!
Сообщения
69
Репутация
3
Работает лучше, но все же не идеально...
Спасибо за способ легко получить хендел активного окна!

P.S
И не нужно прикреплять «MouseOnEvent.au3», она есть тут.
:shok: Где-то пол года или год назад я задавал вопрос на этом форуме и в моем коде была не стандартная библиотека, я её не прикреплял. И кто-то из админов сделал мне замечание, что мол нужно прикреплять нестандартные библиотеки, а то новички могут не понять почему не работает скрипт....
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,666
Репутация
2,463
Anton [?]
кто-то из админов сделал мне замечание, что мол нужно прикреплять нестандартные библиотеки, а то новички могут не понять почему не работает скрипт
Это был видимо я, но речь шла о библиотеках которые ранее не обсуждались на форуме, а эта есть на форуме, поэтому нет смысла её дублировать.
 
Верх