Имя пользователя:
Пароль:  
Помощь | Регистрация | Забыли пароль?  | Правила  

Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » AutoIt » [решено] Как прилепить некое окно GUI к координатам окна другой проги

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

Аватара для beve

Старожил


Сообщения: 307
Благодарности: 137


Конфигурация

Профиль | Отправить PM | Цитировать


Имеется код для примера:
Код: Выделить весь код
#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 прилепляется к Главному окну и при перемещении главного окна, оно перемещается вместе с ним. Вопрос такой, можно ли сделать чтобы Дочернее окно так прилеплялись к окну нужной мне проги (чтобы вместо Главного окна в примере была моя прога, любое окно, ну хоть блокнот, например), ибо у меня выходит так, что при запуске, если сделать похожее по координатам окна, Дочернее окно прилепляется, но при перемещении окна Моей проги, не двигается вслед за ним.

Отправлено: 15:53, 08-02-2009

 

Аватара для Creat0R

Must AutoIt


Сообщения: 3054
Благодарности: 1009

Профиль | Сайт | Отправить PM | Цитировать


Цитата 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

-------
“Сделай так просто, как возможно, но не проще этого.”... “Ты никогда не решишь проблему, если будешь думать так же, как те, кто её создал.”

Альберт Эйнштейн

P.S «Не оказываю техподдержку через ПМ/ICQ, и по email - для этого есть форум. ©»

http://creator-lab.ucoz.ru/Images/Icons/autoit_icon.png Русское сообщество AutoIt | http://creator-lab.ucoz.ru/Images/Ic...eator_icon.png CreatoR's Lab | http://creator-lab.ucoz.ru/Images/Icons/oac_icon.png Opera AC Community


Отправлено: 22:36, 08-02-2009 | #2



Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети.

Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля.


Аватара для beve

Старожил


Сообщения: 307
Благодарности: 137

Профиль | Отправить PM | Цитировать


---Спасибо,почти то что нужно, классно придумано, насчет, изменения ширины Дочернего окна под ширину окна нужной мне проги. Но возникли некоторые трудности, помоги решить. При запуске скрипта (а в моем случае я переделал, чтобы скрипт, приклеивался не снизу, а чуть ниже от верха и был поверх этого самого окна) - Дочернее окно прилепляется к любому окну которое активно в этот самый час и которое я двигаю мышкой, будь то блокнот - оно с блокнотом двигается, я схватил мышкой 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 должен быть запущен...ну или другую прогу там можно прописать.

Отправлено: 01:30, 09-02-2009 | #3


Аватара для Creat0R

Must AutoIt


Сообщения: 3054
Благодарности: 1009

Профиль | Сайт | Отправить PM | Цитировать


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

-------
“Сделай так просто, как возможно, но не проще этого.”... “Ты никогда не решишь проблему, если будешь думать так же, как те, кто её создал.”

Альберт Эйнштейн

P.S «Не оказываю техподдержку через ПМ/ICQ, и по email - для этого есть форум. ©»

http://creator-lab.ucoz.ru/Images/Icons/autoit_icon.png Русское сообщество AutoIt | http://creator-lab.ucoz.ru/Images/Ic...eator_icon.png CreatoR's Lab | http://creator-lab.ucoz.ru/Images/Icons/oac_icon.png Opera AC Community

Это сообщение посчитали полезным следующие участники:

Отправлено: 02:13, 09-02-2009 | #4


Аватара для beve

Старожил


Сообщения: 307
Благодарности: 137

Профиль | Отправить PM | Цитировать


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

Отправлено: 13:41, 09-02-2009 | #5



Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » AutoIt » [решено] Как прилепить некое окно GUI к координатам окна другой проги

Участник сейчас на форуме Участник сейчас на форуме Участник вне форума Участник вне форума Автор темы Автор темы Шапка темы Сообщение прикреплено

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
[решено] Скрытое управление GUI другой проги - без командной строки ? Nik_rus AutoIt 2 12-08-2009 12:21
[решено] Щелкнуть по координатам окна Medic84 AutoIt 4 10-08-2009 04:02
[решено] Создать окно WMP в GUI beve AutoIt 5 09-07-2009 15:52
[решено] Как сделать фон окна GUI ? sashadeg AutoIt 5 11-05-2009 16:31
Запуск из проги другой проги Vampire Программирование и базы данных 2 26-11-2003 12:40




 
Переход