1 (изменено: samardac, 2015-07-10 21:56:27)

Тема: AHK: AlwaysOnTop внутри Родителя

Как сделать так что бы Child2 всегда было поверх Notepad?
Другими словами как сделать так что бы Child2 был AlwaysOnTop внутри своего родителя?

run Notepad

Gui, Main: +HwndmainGuiId  
Gui, Main: +LastFound 

Gui, Main: Show, w600 h150

Gui, Child2: New, +ParentMain +HwndchildGuiId2, Child GUI 2
Gui, Child2: Add, Text,,this is child gui
Gui, Child2: Show, x100 y0 w300 h100

External:=WinExist("Untitled")
DllCall("SetParent", "uint", External, "uint", mainGuiId  )

WinMove, ahk_id %External%,, 0,0
WinSet, Top, , ahk_id %childGuiID2%

return

Пробовал ловить Активацию Notepad для того что бы Child2 ставить наверх этим:
OnMessage(0x0022, "ChildActivate") ; WM_CHILDACTIVATE
и этим
ShelHook c параметром HSHELL_WINDOWACTIVATED
неловится ни тем не другим.

Вроде все точки в предложениях поставил правельно ) Жду ответа.

2

Re: AHK: AlwaysOnTop внутри Родителя

Сама идея использовать окно чужого процесса в качестве дочернего не имеет смысла. Для чего это нужно?

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

3 (изменено: serzh82saratov, 2015-07-11 12:41:37)

Re: AHK: AlwaysOnTop внутри Родителя


DetectHiddenWindows, On
Gui, Main: +HwndmainGuiId  
Gui, Main: +LastFound  
Gui, Main: Show, w600 h150 
Gui, Child2: +ParentMain +HwndchildGuiId2 +AlwaysOnTop
Gui, Child2: Add, Text,,this is child gui
Gui, Child2: Show, x100 y0 w300 h100, Child GUI 2
Run, Notepad,, Hide
WinWait, ahk_class Notepad
Global External := WinExist("ahk_class Notepad"), childGuiID2
DllCall("SetParent", "uint", External, "uint", mainGuiId) 
WinMove, ahk_id %External%, , 0,0 
WinShow, ahk_id %External%
WinSet, Top, , ahk_id %childGuiID2%
Gui, Main: Show
SetWinEventHook(0x8005, 0x8005, 0, RegisterCallback("MyFunc", "F"),0,0,0) 
; 0x8005 = EVENT_OBJECT_FOCUS  
return

MyFunc(hWinEventHook, event, hwnd) { 
    If (hwnd = External) 
        WinSet, Top, , ahk_id %childGuiID2%   
}

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

4

Re: AHK: AlwaysOnTop внутри Родителя

teadrinker,
в двух словах, есть приложение поверх которого делается новый интерфэйс. Этот новый интерфэйс должен всегда лежать поверх приложения. Для облегчения манипуляции с этими двумя окнами они помещаются в родительское окно.

serzh82saratov,
нотепад всерано активируется и выходит на первый план.

5 (изменено: serzh82saratov, 2015-07-11 16:07:45)

Re: AHK: AlwaysOnTop внутри Родителя

нотепад всерано активируется

Ну он и должен активироватся, можно ещё попробовать добавить к нему стиль WS_EX_NOACTIVATE, но тогда скорее всего уже нельзя будет с ним взаимодействовать, и не всегда оно применяется.
Так ещё попробуйте:

+ открыть спойлер

#SingleInstance Force      
#Persistent 
#NoEnv
ListLines Off  
DetectHiddenWindows, On
SetWinEventHook(0x8005, 0x8005, 0, RegisterCallback("MyFunc", "F"),0,0,0) ; EVENT_OBJECT_FOCUS 
SetWinEventHook(0x800B, 0x800B, 0, RegisterCallback("MyFunc", "F"),0,0,0) ; EVENT_OBJECT_LOCATIONCHANGE
Gui, Main: +HwndmainGuiId  
Gui, Main: +LastFound  
Gui, Child2: +ParentMain +HwndchildGuiId2 +AlwaysOnTop
Gui, Child2: Add, Text,,this is child gui 
Run, Notepad,, Hide
WinWait, ahk_class Notepad
Global External := WinExist("ahk_class Notepad"), childGuiID2 
DllCall("SetParent", "uint", External, "uint", mainGuiId) 
WinMove, ahk_id %External%, , 0,0 
WinShow, ahk_id %External%
Gui, Child2: Show, x100 y0 w300 h100, Child GUI 2
Gui, Main: Show, w600 h150 
WinSet, Top, , ahk_id %childGuiID2% 
 ; WinSet, ExStyle, +0x08000000, ahk_id %External%   ;  WS_EX_NOACTIVATE
return

MyFunc(hWinEventHook, event, hwnd) { 
    If (hwnd = External) 
        WinSet, Top, , ahk_id %childGuiID2%   
}

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

6 (изменено: serzh82saratov, 2015-07-11 16:14:04)

Re: AHK: AlwaysOnTop внутри Родителя

Если в некоторых ситуациях всё таки будет уходить на задний план, то ещё по добавлять сообщений WinEventHook.

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

7 (изменено: samardac, 2015-07-11 16:33:41)

Re: AHK: AlwaysOnTop внутри Родителя

serzh82saratov, второй вариант вроде как дает похожий результат как и первый. Но я заметил что нотепад активируется только при клике по шапке, во всех других случаях он снизу. В моей задаче вместа нотепада будет другое приложение, и шапка этого приложения будет скрыта, так что активировать окно не получится я уже протестил с первым скриптом и все вроде как работает, приложение всегда снизу, спасибо!
Спасибо за идею с EventHook.

8 (изменено: samardac, 2015-07-11 16:53:40)

Re: AHK: AlwaysOnTop внутри Родителя

serzh82saratov, появилась еще одна проблема она состоит в том что окно Child2 имеет прозрачные части сквозь которые можно взаимодействовать с неокоторыми частями приложения, но при этом методе скрипт номер1, если делаеш Child2 прозрачным припомощи WinSet, TransColor так он пробивает родительское окно на сквозь, в итоги ты видиш не приложение что подним, а то что под родительским окном.  Есть ли како то вариант исправить это?
И еще, прозрачность окна Child2 работает только если она совпадает с прозрачность цвета Родительского окна.


DetectHiddenWindows, On
Gui, Main: Color, EEAA99
Gui, Main: +HwndmainGuiId  
Gui, Main: +LastFound  +resize
WinSet, TransColor, EEAA99
Gui, Main: Show, w600 h600


Gui, Child2: +ParentMain +HwndchildGuiId2 +AlwaysOnTop
Gui, Child2: Color, EEAA99
Gui, Child2: +LastFound 
WinSet, TransColor, EEAA99
Gui, Child2: Show, x100 y0 w300 h100, Child GUI 2

Run, Notepad,, Hide
WinWait, ahk_class Notepad
Global External := WinExist("Untitled"), childGuiID2
DllCall("SetParent", "uint", External, "uint", mainGuiId) 
WinMove, ahk_id %External%, , 0,0 
WinShow, ahk_id %External%
WinSet, Top, , ahk_id %childGuiID2%
Gui, Main: Show
SetWinEventHook(0x8005, 0x8005, 0, RegisterCallback("MyFunc", "F"),0,0,0) 
; 0x8005 = EVENT_OBJECT_FOCUS  
return

MyFunc(hWinEventHook, event, hwnd) { 
    If (hwnd = External) 
        WinSet, Top, , ahk_id %childGuiID2%   
}

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)
}

9 (изменено: serzh82saratov, 2015-07-11 17:01:28)

Re: AHK: AlwaysOnTop внутри Родителя

Не уверен что точно понял, может просто в нём сделать "форточку" с помощью WinSet, Region?

Никогда не пишите "Untitled" для блокнота.

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

10 (изменено: samardac, 2015-07-11 17:03:34)

Re: AHK: AlwaysOnTop внутри Родителя

serzh82saratov, суть такая, есть:
1. Окно Child2, это окно которое всегда на верху.
2. Приложение(блокнот), которое находится под Child2
3. Родительсоке окно оно содержит в себе два предыдущих окна.

Child2, в некоторых местах должен быть прозрачным, что бы можно было  взаимодействовать мышкой с приложение которое под ним.

WinSet, Region, позволит сделать много "форточек"? Так как там нужна не одна дырка.

11 (изменено: samardac, 2015-07-11 17:13:50)

Re: AHK: AlwaysOnTop внутри Родителя

Вообще не думаю что WinSet, Region, подойдет, так как это окно Child2 будет полностью графическим и края его будут "кучерявые" а не просто окно - прямоугольник. И придется резать очень много и не просто регионом а полигонами. Проще сделать его как то прозрачным где надо.

12

Re: AHK: AlwaysOnTop внутри Родителя

Проще сделать его как то прозрачным где надо.

Не знаю как ещё.

+ открыть спойлер

#SingleInstance Force      
#Persistent 
#NoEnv
ListLines Off  
DetectHiddenWindows, On
SetWinEventHook(0x8005, 0x8005, 0, RegisterCallback("MyFunc", "F"),0,0,0) ; EVENT_OBJECT_FOCUS 
SetWinEventHook(0x800B, 0x800B, 0, RegisterCallback("MyFunc", "F"),0,0,0) ; EVENT_OBJECT_LOCATIONCHANGE
Gui, Main: Color, EEAA99
Gui, Main: +HwndmainGuiId +LastFound  
Gui, Child2: Color, 198A05
Gui, Child2: +ParentMain +HwndchildGuiId2 +AlwaysOnTop 
Run, Notepad,, Hide
WinWait, ahk_class Notepad
Global External := WinExist("ahk_class Notepad"), childGuiID2 
DllCall("SetParent", "uint", External, "uint", mainGuiId) 
WinMove, ahk_id %External%, , 110,110, 444, 444
WinShow, ahk_id %External%
Gui, Child2: Show, x222 y222 w200 h200, Child GUI 2
Gui, Main: Show, w600 h600 
WinSet, Top, , ahk_id %childGuiID2% 
 ; WinSet, ExStyle, +0x08000000, ahk_id %External%   ;  WS_EX_NOACTIVATE
WinSet, Region, 
(
0-0 200-0 200-200 0-200 0-0 
 50-50 80-50 80-80 50-80 50-50  
 100-100 100-180 180-180 150-180 150-150 
), ahk_id %childGuiID2%
WinSet, Redraw, , ahk_id %mainGuiId% 
WinSet, Redraw, , ahk_id %External% 
WinSet, Redraw, , ahk_id %childGuiID2%  
return

MyFunc(hWinEventHook, event, hwnd) { 
    If (hwnd = External) 
        WinSet, Top, , ahk_id %childGuiID2%   
}

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)
}

Но с помощью WinSet, Region можно хоть картину пикассо обрисовать, при большом желании.

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

13

Re: AHK: AlwaysOnTop внутри Родителя

serzh82saratov, спасибо, уже буду думать как быть.

14

Re: AHK: AlwaysOnTop внутри Родителя

В этой теме не созвучный вопрос поднимался?

15 (изменено: serzh82saratov, 2015-08-02 03:51:33)

Re: AHK: AlwaysOnTop внутри Родителя

В данном примере, активируя свой Edit, родительское окно не деактивируется:


If !WinExist("ahk_class Notepad")  
{
    Run, Notepad,,, PID
    WinWait, ahk_pid %PID%
}
hNotepad := WinExist("ahk_class Notepad")
ControlGet, hEdit1, Hwnd, , Edit1, ahk_id %hNotepad% 
Gui, Add, Edit, w111 h111 x111 y111 HWNDh_Edit, Edit
DllCall("SetParent", "uint", h_Edit, "uint", hEdit1)   
WinActivate
Return

Возможно ли разместить в родителе своё окно, чтобы можно было им полноценно пользоватся, активировать, перемещать, изменять размер, вводить текст, но чтобы при этом не деактивировалось родительское?


If !WinExist("ahk_class Notepad")  
{
    Run, Notepad,,, PID
    WinWait, ahk_pid %PID%
}
hNotepad := WinExist("ahk_class Notepad")
ControlGet, hEdit1, Hwnd, , Edit1, ahk_id %hNotepad%  
Gui, +AlwaysOnTop -DPIScale +HWNDhWin +ReSize
Gui, Add, Edit, w222 h222 x1 y1  
DllCall("SetParent", "uint", hWin, "uint", hEdit1)   
Gui, Show, na w222 h222 x111 y111, % " "
WinActivate 
Return
По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

16

Re: AHK: AlwaysOnTop внутри Родителя

В первом примере контрол AutoHotkey принадлежит процессу родителя, видимо должен быть способ тоже самое сделать с окном...

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

17

Re: AHK: AlwaysOnTop внутри Родителя

Gui, +0x40000000 -0x80000000  ; Add WS_CHILD, remove WS_POPUP

18

Re: AHK: AlwaysOnTop внутри Родителя

Во, спасибо! Но кликом Edit не активируется. Если только через костыль ControlFocus - ControlClick, как вариант.

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