1 (изменено: serzh82saratov, 2016-03-10 17:46:36)

Тема: AHK: Определить что в данный момент окно растягивается

Как определить что в данный момент пользователь тянет окно стороннего приложения за рамку, чтобы изменить его размер?

Вариант с GetKeyState("LButton", "P") или A_Cursor не рассматриваю.

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

2 (изменено: ypppu, 2016-03-10 18:40:46)

Re: AHK: Определить что в данный момент окно растягивается

Мне кажется, пользователь не может тянуть за рамку "в данный момент". Я себе представляю этот процесс как периодическую перерисовку окна, которая происходит при изменении координат курсора, находящегося в режиме "size".
Вероятно при этом посылаются сообщения.
WinGetPos - есть такая команда, определяющая размеры окна.

3

Re: AHK: Определить что в данный момент окно растягивается

Сообщения посылаются, только известные мне не отличают растягивание от передвижения окна. Есть WM_SIZE или что то подобное, но требуется для стороннего приложения.

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

4

Re: AHK: Определить что в данный момент окно растягивается

Кстати попутный вопрос раз уже окно растягивается, момент максимизации окна тоже интересен.

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

5

Re: AHK: Определить что в данный момент окно растягивается

Возможно в момент прихода сообщения вызвать что то из API, в WINDOWINFO такого не нашёл...

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

6

Re: AHK: Определить что в данный момент окно растягивается

serzh82saratov, вот такие сообщения показывает Wispector, когда окно браузера растягиваю. Можно ли этим воспользоваться - не знаю, в оконные сообщения как-то не вникал.

Post's attachments

scr.GIF
scr.GIF 17.33 kb, 2 downloads since 2016-03-10 

You don't have the permssions to download the attachments of this post.

7

Re: AHK: Определить что в данный момент окно растягивается

Насколько знаю, АНК не может получать оконные сообщения других процессов.

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

8

Re: AHK: Определить что в данный момент окно растягивается

Можно отслеживать EVENT_SYSTEM_MOVESIZESTART, далее по таймеру определять размер окна вплоть до EVENT_SYSTEM_MOVESIZEEND.
Максимизация — отслеживать EVENT_OBJECT_LOCATIONCHANGE и по таймеру проверять, не максимизировано ли.

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

9

Re: AHK: Определить что в данный момент окно растягивается

teadrinker пишет:

Можно отслеживать EVENT_SYSTEM_MOVESIZESTART, далее по таймеру определять размер окна вплоть до EVENT_SYSTEM_MOVESIZEEND.
Максимизация — отслеживать EVENT_OBJECT_LOCATIONCHANGE и по таймеру проверять, не максимизировано ли.

Не подходит, надо определять одномоментно.

teadrinker пишет:

Максимизация — отслеживать EVENT_OBJECT_LOCATIONCHANGE и по таймеру проверять, не максимизировано ли.

EVENT_OBJECT_LOCATIONCHANGE сильно грузит процесс и часто вешает его если есть какие то действия в обработчике. Приходит очень много сообщений, и даже если при каждом выставлять короткий таймер, то из за частоты сообщений он может не скоро запустится.

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

10

Re: AHK: Определить что в данный момент окно растягивается

Может какое сообщение ответ пришлёт...

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

11

Re: AHK: Определить что в данный момент окно растягивается

Пришлёт, только не тебе.

serzh82saratov пишет:

EVENT_OBJECT_LOCATIONCHANGE сильно грузит процесс

Ну, можно в его HookProc Sleep вставить. На самом деле, совместив EVENT_SYSTEM_MOVESIZESTART и EVENT_OBJECT_LOCATIONCHANGE, скорее всего, можно достоверно получать начало изменения размера окна. Ну, и для отслеживания максимизации что-то придумать можно. Сейчас пока занят, попозже могу написать.

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

12

Re: AHK: Определить что в данный момент окно растягивается

teadrinker пишет:

Ну, можно в его HookProc Sleep вставить.

А что это даст?

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

13

Re: AHK: Определить что в данный момент окно растягивается

По моим представлениям, не будет часто выполняться, соответственно грузить, нет? Я пока не проверял.

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

14

Re: AHK: Определить что в данный момент окно растягивается

У меня на практике тормозит весь скрипт.

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

15 (изменено: teadrinker, 2016-03-11 21:29:33)

Re: AHK: Определить что в данный момент окно растягивается

#Persistent
WS := new WatchSizing()

class WatchSizing
{
	__New()  {
		static EVENT_SYSTEM_MOVESIZESTART := 0xA, EVENT_SYSTEM_MOVESIZEEND := 0xB
			, EVENT_OBJECT_LOCATIONCHANGE := 0x800B, array := {}
		array.i := 0
		this.ptr := Object(array)
		this.hHookSizing := this.SetWinEventHook(EVENT_SYSTEM_MOVESIZESTART, EVENT_SYSTEM_MOVESIZEEND, 0
															, RegisterCallback("HookProcSizing", "F", 4, this.ptr), 0, 0, 0)
		this.hHookMoving := this.SetWinEventHook(EVENT_OBJECT_LOCATIONCHANGE, EVENT_OBJECT_LOCATIONCHANGE, 0
															, RegisterCallback("HookProcMoving", "F", 4, this.ptr), 0, 0, 0)
		this.hHookMaximising := this.SetWinEventHook(EVENT_OBJECT_LOCATIONCHANGE, EVENT_OBJECT_LOCATIONCHANGE, 0
															, RegisterCallback("HookProcMaximising", "F", 4), 0, 0, 0)
	}
	
	__Delete()  {
		DllCall("UnhookWinEvent", Ptr, this.hHookSizing)
		DllCall("UnhookWinEvent", Ptr, this.hHookMoving)
		DllCall("UnhookWinEvent", Ptr, this.hHookMaximising)
		ObjRelease(this.ptr)
	}
	
	SetWinEventHook(eventMin, eventMax, hmodWinEventProc, lpfnWinEventProc, idProcess, idThread, dwFlags)  {
		return DllCall("SetWinEventHook", UInt, eventMin , UInt, eventMax , Ptr, hmodWinEventProc
					, Ptr, lpfnWinEventProc , UInt, idProcess , UInt, idThread, UInt, dwFlags, Ptr)
	}
}

HookProcSizing(hWinEventHook, event, hwnd, idObject)
{
	static EVENT_SYSTEM_MOVESIZESTART := 0xA, EVENT_SYSTEM_MOVESIZEEND := 0xB, OBJID_WINDOW := 0, obj
	if (idObject != OBJID_WINDOW)
		Return
	
	(!obj && obj := Object(A_EventInfo))
	(event = EVENT_SYSTEM_MOVESIZESTART && (obj.watching := 1, obj.hwnd := hwnd))
	(event = EVENT_SYSTEM_MOVESIZEEND && (obj.watching := "", obj.i := 0))
}

HookProcMoving(hWinEventHook, event, hwnd, idObject)
{
	static OBJID_WINDOW := 0, W_Prev, H_Prev, obj
	(!obj && obj := Object(A_EventInfo))
	if !(idObject = OBJID_WINDOW && obj.watching && hwnd = obj.hwnd)
		Return
	
	if (obj.i++ = 0)
		WinGetPos,,, W_Prev, H_Prev, ahk_id %hwnd%
	if (obj.i = 2)  {
		WinGetPos,,, W, H, ahk_id %hwnd%
		if !(W = W_Prev && H = H_Prev)
			SetTimer, AlertSizing, -10
	}
}

HookProcMaximising(hWinEventHook, event, hwnd, idObject)
{
	static OBJID_WINDOW := 0, arr := [], FuncObj := Func("AlertMaximizing").Bind(arr)
	if (idObject != OBJID_WINDOW)
		Return
	arr[1] := hwnd
	SetTimer, % FuncObj, -100
}

AlertSizing()
{
	ToolTip Sizing!
	SoundBeep, 500
}

AlertMaximizing(obj)
{
	static arr := []
	hwnd := obj[1]
	WinGet, MinMax, MinMax, ahk_id %hwnd%
	if (MinMax = 1 && !arr.HasKey(hwnd))  {
		arr[hwnd] := 1
		ToolTip Maximized
		SoundBeep, 1000
	}
	if (MinMax != 1 && arr.HasKey(hwnd))
		arr.Delete(hwnd)
}

Это так, сходу, наверное, можно ещё оптимизировать.

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder