Показать полную графическую версию : [решено] Как прилепить некое окно 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 прилепляется к Главному окну и при перемещении главного окна, оно перемещается вместе с ним. Вопрос такой, можно ли сделать чтобы Дочернее окно так прилеплялись к окну нужной мне проги (чтобы вместо Главного окна в примере была моя прога, любое окно, ну хоть блокнот, например), ибо у меня выходит так, что при запуске, если сделать похожее по координатам окна, Дочернее окно прилепляется, но при перемещении окна Моей проги, не двигается вслед за ним.
можно ли сделать чтобы Дочернее окно так прилеплялись к окну нужной мне проги »
Можно, примерно так:
#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
---Спасибо,почти то что нужно, классно придумано, насчет, изменения ширины Дочернего окна под ширину окна нужной мне проги. Но возникли некоторые трудности, помоги решить. При запуске скрипта (а в моем случае я переделал, чтобы скрипт, приклеивался не снизу, а чуть ниже от верха и был поверх этого самого окна) - Дочернее окно прилепляется к любому окну которое активно в этот самый час и которое я двигаю мышкой, будь то блокнот - оно с блокнотом двигается, я схватил мышкой 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 должен быть запущен...ну или другую прогу там можно прописать.
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
Супер, именно то что нужно! Спасибо за ответ, и за разъяснение. :yahoo:
© OSzone.net 2001-2012
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.