Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   AutoIt (http://forum.oszone.net/forumdisplay.php?f=103)
-   -   [решено] Как прилепить некое окно GUI к координатам окна другой проги (http://forum.oszone.net/showthread.php?t=131362)

beve 08-02-2009 15:53 1032824

Как прилепить некое окно GUI к координатам окна другой проги
 
Имеется код для примера:
Код:

#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
$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 08-02-2009 22:36 1033134

Цитата:

Цитата beve
можно ли сделать чтобы Дочернее окно так прилеплялись к окну нужной мне проги »

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

Код:

#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
#include <Timers.au3>
;

$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 09-02-2009 01:30 1033229

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

#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
#include <Timers.au3>

$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 09-02-2009 02:13 1033247

beve,
Цитата:

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

Код:

#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
#include <Timers.au3>
;

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 09-02-2009 13:41 1033508

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


Время: 18:38.

Время: 18:38.
© OSzone.net 2001-