[решено] Как прилепить некое окно GUI к координатам окна другой проги

Ответить
Аватара пользователя
beve

[решено] Как прилепить некое окно GUI к координатам окна другой проги

Сообщение beve »

Имеется код для примера:



Код:

Код: Выделить всё

#include 
#include 
$Form = GUICreate("Какая то программа", 600, 60) 
$Button = GUICtrlCreateButton("просто кнопка для примера", 0, 0, 160, 21) 
$Form1pos = WinGetPos($Form) 
$chForm = GUICreate("Дополнительное окно", 600, 70, $Form1pos[0],$Form1pos[1]+93, _ 
BitOR($WS_POPUP,$WS_BORDER), $WS_EX_TOOLWINDOW, $Form) 
GUISetBkColor (0x09FF00)
GUICtrlCreateLabel ("Дочернее окно",5, 5, 185, 25) 
GUIRegisterMsg($WM_MOVE, "WM_MOVE") 
GUISetState(@SW_SHOW, $Form) 
While 1 
$msg = GUIGetMsg(1) ;using the "advanced" parameter 
Select 
Case $msg[0] = $GUI_EVENT_CLOSE And $msg[1] = $Form
ExitLoop 
;Следующий Case нужен только если на дочернее окно $chForm не будет установлен стиль $WS_POPUP.
;Case $msg[0] = $GUI_EVENT_CLOSE And $msg[1] = $chForm 
;GUISetState(@SW_HIDE, $chForm) 
Case $msg[0] = $Button 
If Not BitAND(WinGetState($chForm), 2) Then 
GUISetState(@SW_SHOW, $chForm) 
Else 
GUISetState(@SW_HIDE, $chForm) 
EndIf 
EndSelect 
WEnd 
Func WM_MOVE($hWndGUI, $MsgID, $WParam, $LParam) 
If $hWndGUI = $Form Then 
$aParent_Pos = WinGetPos($Form) 
WinMove($chForm, "", $aParent_Pos[0], $aParent_Pos[1]+93) 
Else 
EndIf 
EndFunc

Вот в этом примере Дочернее окно Gui прилепляется к Главному окну и при перемещении главного окна, оно перемещается вместе с ним. Вопрос такой, можно ли сделать чтобы Дочернее окно так прилеплялись к окну нужной мне проги (чтобы вместо Главного окна в примере была моя прога, любое окно, ну хоть блокнот, например), ибо у меня выходит так, что при запуске, если сделать похожее по координатам окна, Дочернее окно прилепляется, но при перемещении окна Моей проги, не двигается вслед за ним.
Аватара пользователя
Creat0R

Re: [решено] Как прилепить некое окно GUI к координатам окна другой проги

Сообщение Creat0R »

Цитата beve:



можно ли сделать чтобы Дочернее окно так прилеплялись к окну нужной мне проги
[решено] Как прилепить некое окно GUI к координатам окна другой проги




Можно, примерно так:





Код:

Код: Выделить всё

#include 
#include 
#include 
;
$hParentWnd = GUICreate("Какая то программа", 600, 60)
;$Button = GUICtrlCreateButton("просто кнопка для примера", 0, 0, 160, 21)
;Следуюзая строка может быть раскомментирована, в этом случае активное окно будет родительским окном
;$hParentWnd = WinGetHandle("[ACTIVE]")
$aParent_Pos = WinGetPos($hParentWnd)
$hChildWnd = GUICreate("Дополнительное окно", 600, 70, $aParent_Pos[0], $aParent_Pos[1] + $aParent_Pos[3] + 10, _
    BitOR($WS_POPUP, $WS_BORDER), $WS_EX_TOOLWINDOW, $hParentWnd)
GUISetBkColor(0x09FF00)
GUICtrlCreateLabel("Дочернее окно", 5, 5, 185, 25)
GUISetState(@SW_SHOW, $hParentWnd)
GUISetState(@SW_SHOW, $hChildWnd)
$iTimer_ID = _Timer_SetTimer($hChildWnd, 10, "_WinMove_Proc")
While 1
    $aMsg = GUIGetMsg(1) ;using the "advanced" parameter
    Switch $aMsg[0]
        Case $GUI_EVENT_CLOSE
            If $aMsg[1] = $hParentWnd Then ExitLoop
        ;Case $GUI_EVENT_CLOSE ;Этот Case нужен только если на дочернее окно $chForm не будет установлен стиль $WS_POPUP.
            ;If $aMsg[1] = $hChildWnd Then GUISetState(@SW_HIDE, $hChildWnd)
        ;Case $Button
            ;If Not BitAND(WinGetState($hChildWnd), 2) Then
                ;GUISetState(@SW_SHOW, $hChildWnd)
            ;Else
                ;GUISetState(@SW_HIDE, $hChildWnd)
            ;EndIf
    EndSwitch
WEnd
_Timer_KillTimer($hChildWnd, $iTimer_ID)
Func _WinMove_Proc($hWnd, $nMsg, $iIDTimer, $dwTime)
    Local $aParent_Pos = WinGetPos($hParentWnd)
    Local $aChild_Pos = WinGetPos($hWnd)
    If $aParent_Pos[0]  $aChild_Pos[0] Or $aParent_Pos[1]  ($aChild_Pos[1] - $aParent_Pos[3] - 10) Then _
        WinMove($hWnd, "", $aParent_Pos[0], $aParent_Pos[1] + $aParent_Pos[3] + 10, $aParent_Pos[2])
EndFunc
Аватара пользователя
beve

Re: [решено] Как прилепить некое окно GUI к координатам окна другой проги

Сообщение beve »

---Спасибо,почти то что нужно, классно придумано, насчет, изменения ширины Дочернего окна под ширину окна нужной мне проги. Но возникли некоторые трудности, помоги решить. При запуске скрипта (а в моем случае я переделал, чтобы скрипт, приклеивался не снизу, а чуть ниже от верха и был поверх этого самого окна) - Дочернее окно прилепляется к любому окну которое активно в этот самый час и которое я двигаю мышкой, будь то блокнот - оно с блокнотом двигается, я схватил мышкой SciTe - двигается вместе с SciTe!, а мне нужно что бы Дочернее окно двигалось только вместе с моим окном, например с Блокнотом в нижеописанном скрипте, и при свертывании в трей Блокнота, Дочернее окно тоже свертывалось вместе с ним.



Код:

Код: Выделить всё

#include 
#include 
#include 
$hParentWnd=Wingetpos("Безымянный - Notepad2")
$aParent_Pos = WinGetPos($hParentWnd)
$hChildWnd = GUICreate("Дополнительное окно", 600, 70, $aParent_Pos[0], $aParent_Pos[1] + $aParent_Pos[3] - 380, _
    BitOR($WS_POPUP, $WS_BORDER), $WS_EX_TOPMOST, $hParentWnd)
GUISetBkColor(0x09FF00)
GUICtrlCreateLabel("Дочернее окно", 5, 5, 185, 25)
GUISetState(@SW_SHOW, $hParentWnd)
GUISetState(@SW_SHOW, $hChildWnd)
$iTimer_ID = _Timer_SetTimer($hChildWnd, 10, "_WinMove_Proc")
While 1
    $aMsg = GUIGetMsg(1) ;using the "advanced" parameter
    Switch $aMsg[0]
        Case $GUI_EVENT_CLOSE
            If $aMsg[1] = $hParentWnd Then ExitLoop
           EndSwitch
WEnd
_Timer_KillTimer($hChildWnd, $iTimer_ID)
Func _WinMove_Proc($hWnd, $nMsg, $iIDTimer, $dwTime)
    Local $aParent_Pos = WinGetPos($hParentWnd)
    Local $aChild_Pos = WinGetPos($hWnd)
    If $aParent_Pos[0]  $aChild_Pos[0] Or $aParent_Pos[1]  ($aChild_Pos[1] - $aParent_Pos[3] - 10) Then _
        WinMove($hWnd, "", $aParent_Pos[0], $aParent_Pos[1] + $aParent_Pos[3] - 380, $aParent_Pos[2])
EndFunc

Для работы этого примерочного кода, notepad2 должен быть запущен...ну или другую прогу там можно прописать.
Аватара пользователя
Creat0R

Re: [решено] Как прилепить некое окно GUI к координатам окна другой проги

Сообщение Creat0R »

beve,


Цитата:



Дочернее окно прилепляется к любому окну которое активно в этот самый час и которое я двигаю мышкой



Ну и правильно, ведь первая строчка почему то пытается получить позицию окна, а не хендл Изображение - там возвращается массив, а для Win* функции это тоже самое что и пустая строка (""), т.е текущее (активное) окно. Нужно использовать WinGetHandle...





Код:

Код: Выделить всё

#include 
#include 
#include 
;
Run("Notepad.exe")
WinWait("[REGEXPCLASS:Notepad.*]")
$hParentWnd = WinGetHandle("[REGEXPCLASS:Notepad.*]")
$aParent_Pos = WinGetPos($hParentWnd)
$hChildWnd = GUICreate("Дополнительное окно", 600, 70, $aParent_Pos[0], $aParent_Pos[1] + $aParent_Pos[3] - 380, _
    BitOR($WS_POPUP, $WS_BORDER), $WS_EX_TOPMOST, $hParentWnd)
GUISetBkColor(0x09FF00)
GUICtrlCreateLabel("Дочернее окно", 5, 5, 185, 25)
$iTimer_ID = _Timer_SetTimer($hChildWnd, 10, "_WinMove_Proc")
GUISetState(@SW_SHOW, $hChildWnd)
While 1
    Sleep(100)
WEnd
Func _WinMove_Proc($hWnd, $nMsg, $iIDTimer, $dwTime)
    If Not WinExists($hParentWnd) Then Exit _Timer_KillTimer($hChildWnd, $iTimer_ID)
    Local $aParent_Pos = WinGetPos($hParentWnd)
    If @error Then Return
    Local $aChild_Pos = WinGetPos($hWnd)
    If @error Then Return
    If WinGetHandle("[Active]")  $hParentWnd Then
        WinSetOnTop($hChildWnd, "", 0)
    Else
        WinSetOnTop($hChildWnd, "", 1)
    EndIf
    If $aParent_Pos[0]  $aChild_Pos[0] Or $aParent_Pos[1]  ($aChild_Pos[1] - $aParent_Pos[3] - 10) Then _
        WinMove($hWnd, "", $aParent_Pos[0], $aParent_Pos[1] + $aParent_Pos[3] - 380, $aParent_Pos[2])
EndFunc
Аватара пользователя
beve

Re: [решено] Как прилепить некое окно GUI к координатам окна другой проги

Сообщение beve »

Супер, именно то что нужно! Спасибо за ответ, и за разъяснение. Изображение
Ответить

Вернуться в «AutoIt»