Что нового

Окно поверх определённого окна

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5,379
Репутация
2,717
Код:
#NoTrayIcon

#Include <Constants.au3>
#Include <GUIConstantsEx.au3>
#Include <WinAPIEx.au3>
#Include <WindowsConstants.au3>

Opt('OnExitFunc', '_AutoItExit')
Opt('WinTitleMatchMode', 3)
Opt('WinWaitDelay', 0)

$Title = 'Untitled - Notepad'

$hParent = GUICreate('', 0, 0, 0, 0, 0, $WS_EX_TOOLWINDOW)
$hForm = GUICreate('MyGUI', 400, 100, -1, -1, BitOR($WS_CAPTION, $WS_POPUP, $WS_SYSMENU), $WS_EX_DLGMODALFRAME, $hParent)

$hIcon = _WinAPI_GetClassLong($hForm, $GCL_HICON)
_WinAPI_FreeIcon($hIcon)
_WinAPI_SetClassLong($hForm, $GCL_HICON, 0)
_WinAPI_SetClassLong($hForm, $GCL_HICONSM, 0)

GUISetState()

GUIRegisterMsg(_WinAPI_RegisterWindowMessage('SHELLHOOK'), '_ShellHookProc')
_WinAPI_RegisterShellHookWindow($hForm)

Run('notepad.exe')
If Not WinWaitActive($Title, '', 5) Then
	Exit
EndIf

Do
	If WinExists($Title) Then
		If BitAND(WinGetState($Title), 16) Then
			If BitAND(WinGetState($hForm), 2) Then
				WinSetState($hForm, '', @SW_HIDE)
			EndIf
		Else
			If Not BitAND(WinGetState($hForm), 2) Then
				WinSetState($hForm, '', @SW_SHOW)
			EndIf
		EndIf
	Else
		ExitLoop
	EndIf
Until GUIGetMsg() = $GUI_EVENT_CLOSE

Func _ShellHookProc($hWnd, $iMsg, $wParam, $lParam)

    Local $ExStyle

    Switch $hWnd
        Case $hForm
            Switch $wParam
                Case $HSHELL_WINDOWACTIVATED
                    If BitAND(WinGetState('Untitled - Notepad'), 8) Then
                        WinSetOnTop($hForm, '', 1)
                    Else
                        WinSetOnTop($hForm, '', 0)
                        $ExStyle = _WinAPI_GetWindowLong($lParam, $GWL_EXSTYLE)
                        WinSetOnTop($lParam, '', 1)
                        If Not BitAND($ExStyle, $WS_EX_TOPMOST) Then
                            WinSetOnTop($lParam, '', 0)
                        EndIf
                    EndIf
            EndSwitch
    EndSwitch
EndFunc   ;==>_ShellHookProc

Func _AutoItExit()
	_WinAPI_DeregisterShellHookWindow($hForm)
EndFunc   ;==>_AutoItExit
 

HukpoFuJl

AццkuЙ HukpoFuJl
Сообщения
98
Репутация
38
Посмотрел... Интересные примеры, но все они основаны на одном: отлов состояния стороннего ГУИ и в зависимости от него установка состояния ГУИ автоит'а.
А можно как-нибудь проще? Может как-то возможно "насильно" указать создаваемому окну, что оно дочернее, от стороннего? Просто у меня та же проблема, нужно поместить окно поверх стороннего окна, но при этом в таком виде:
Код:
$hForm = GUICreate("Form", 451, 354, 0, 0, $WS_POPUP, BitOR($WS_EX_LAYERED, $WS_EX_MDICHILD), $hFormBack)
, где $hFormBack - это хэндл стороннего окна... т.е. в результате окно должно как бы "наклеиваться" на стороннее окно и двигаться вместе с ним, ну в общем быть как бы его частью... Это возможно? Или придется плюс ко всему изложенному в этой теме ещё и извращаться с постоянным отловом координат стороннего окна и т.п.

UPD:
Я понимаю, что можно не страдать фигней и просто создать нужные контролы прямо на стороннем окне, но у меня ситуация такая, что я пытаюсь присвоить стороннему окну не предусмотренный изначально в нем Aero стиль... А именно: присвоить окну Aero еффект через _WinAPI_DwmEnableBlurBehindWindow, скрыть с окна все контролы, и наложить наверх своё прозрачное окно с контролами... Ну и обрабатывать их нажатия с соответствующим вызовом нажатий скрытых оригинальных контролов.
Делаю это только по тому, что при присвоении Aero еффекта стороннему окну все элементы этого окна, а в особенности текст - становятся нечитабельными... Если есть какое-либо другое решение данной задачи, связанное с DWM - то подобный вопрос я задал в теме DWM - Desktop Window Manager (Vista / 7): возможности и методы работы.

UPD:
Опробовал код, выложенный мною парой строк выше - работает однако :smile: т.е. окно понимает, что оно дочернее от стороннего и находится всегда поверх своего мнимого "родителя"... Так что извращения с отловом активности якобы "родительского" окна становиться излишеством :smile: Но, к сожалению окно не понимает свойства $WS_EX_MDICHILD и по этому при перемещении псевдо-родительского окна - созданное мною окно остается на месте создания :(
 
Верх