Что нового

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

kaster

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

CreatoR

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

Код:
#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,665
Репутация
2,463
snoitaleR [?]
Приведу в пример программу TRAYIT
Та что на AutoIt написана? Там обрабатывается сворачивание а не закрытие если я не ошибаюсь...
 

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5,379
Репутация
2,716
Kaster сказал(а):
Возможно ли перехватить закрытие сторонней программы и подменить ее минимизацией?

Для этого нужно поставить Hook на WH_GETMESSAGE, но в AutoIt это не прокатит, нужно писать полноценную Dll'ку... Вообщем эта задача не для AutoIt.
 

CreatoR

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

CreatoR

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

Yashied

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

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



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

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

(-1)
 
Автор
kaster

kaster

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