Что нового

[Окна, Диалоги] [Интеракция] Перехват сообщения "закрытия" для приложения

kaster

Мой Аватар, он лучший самый
Команда форума
Глобальный модератор
Сообщения
4 020
Репутация
622
Возможно ли перехватить закрытие сторонней программы и подменить ее минимизацией?
Приложение - MS Outlook 2010
Цель - Сворачивать в трей при нажатии на системную кнопку закрытия.
Всем заранее спасибо за ответы
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8 471
Репутация
2 401
Единственное что приходит в голову (рабочее более-менее), это создание отдельной кнопки закрытия, которая будет прикреплена к нужному окну:

Код:
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>

$hTarget_Win = WinGetHandle("[CLASS:rctrl_renwnd32]")
$aOld_WinPos = WinGetPos($hTarget_Win)
$iOld_WinState = WinGetState($hTarget_Win)

If Not IsHWnd($hTarget_Win) Then Exit

$hGUI = GUICreate("", 17, 0, $aOld_WinPos[0] + $aOld_WinPos[2] - 27, $aOld_WinPos[1] + 3, -1, BitOR($WS_EX_TOPMOST, $WS_EX_TOOLWINDOW), $hTarget_Win)
If BitAND($iOld_WinState, 8) = 8 Then GUISetState(@SW_SHOW, $hGUI)

While 1
	$aWinPos = WinGetPos($hTarget_Win)
	$iWinState = WinGetState($hTarget_Win)
	
	If @error Then
		Exit
	EndIf
	
	If $iOld_WinState <> $iWinState Then
		$iOld_WinState = $iWinState
		
		If BitAND($iWinState, 8) = 8 Then
			GUISetState(@SW_SHOW)
			WinActivate($hTarget_Win)
		Else
			GUISetState(@SW_HIDE)
		EndIf
	EndIf
	
	If $aOld_WinPos[0] <> $aWinPos[0] Or $aOld_WinPos[1] <> $aWinPos[1] Then
		$aOld_WinPos = $aWinPos
		WinMove($hGUI, "", $aWinPos[0] + $aWinPos[2] - 27, $aWinPos[1] + 3)
	EndIf
	
	Switch GUIGetMsg()
		Case $GUI_EVENT_CLOSE
			WinSetState($hTarget_Win, "", @SW_MINIMIZE)
	EndSwitch
WEnd
 

snoitaleR

AutoIT Гуру
Сообщения
854
Репутация
223
Kaster
То, что это в принципе возможно, это точно...
Приведу в пример программу TRAYIT...

А по сути, нужно поставить системный обработчик на событие OnCloseQuery (так оно называется в DELPHI), и вместо передачи управления стандартному обработчику выполнить другое действие - минимизацию...

Но это всего лишь теория... На практике я это проделать пока не смогу...
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8 471
Репутация
2 401
snoitaleR [?]
Приведу в пример программу TRAYIT
Та что на AutoIt написана? Там обрабатывается сворачивание а не закрытие если я не ошибаюсь...
 

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5 379
Репутация
2 711
Kaster сказал(а):
Возможно ли перехватить закрытие сторонней программы и подменить ее минимизацией?
Для этого нужно поставить Hook на WH_GETMESSAGE, но в AutoIt это не прокатит, нужно писать полноценную Dll'ку... Вообщем эта задача не для AutoIt.
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8 471
Репутация
2 401
Yashied [?]
в AutoIt это не прокатит, нужно писать полноценную Dll'ку
Буду рад такой DLL'ке, самому как то нужно было для одного проекта.
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8 471
Репутация
2 401
Yashied [?]
Да, действительно есть, но насколько я понял там нельзя заблокировать событие, т.е к примеру по выходу из блокнота $uiMsg ровняется $WM_CLOSE, но блокнот всё равно закрывается, я даже пробовал ставить Return 1.
 

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5 379
Репутация
2 711
Re: [Окна, Диалоги] [Интеракция] Перехват сообщения \"закрытия\" для приложения

Я честно говоря не игрался с этим, но судя по этому Hook может изменять или удалять сообщения из очереди, но это естественно нужно делать в самой процедуре обработки.



Добавлено:
Сообщение автоматически объединено:

CreatoR [?]
...я даже пробовал ставить Return 1.
(-1)
 
Автор
kaster

kaster

Мой Аватар, он лучший самый
Команда форума
Глобальный модератор
Сообщения
4 020
Репутация
622
всем привет. сори что забросил тему, щас нахожусь в коммандировке ;D
всем спасибо за ответы. я тоже в процессе длительного гуглинга пришел к разного рода ответам, которые сводятся к хуку для WH_GETMESSAGE. к AutoIt прикрутить конечно же не удалось. но за ответы и за ссылки спасибо! тему пока не отмечаю, т.к. пока собственно и не решана, да и вдруг у кого-то появится готовое решение. ну сам тоже конечно поищу
 
Верх