Что нового

Как нарисовать графический элемент на стороннем приложении?

Vlasssov

Осваивающий
Сообщения
428
Репутация
25
Ест окно приложения. Можно ли как-нибудь на нем нарисовать к примеру круг?
Есть библиотека _GDIPlus, но она рисует только на элементах Gui самого AutiIt, а вот на на окне приложения, по его hwd нарисовать может?
 

madmasles

Модератор
Глобальный модератор
Сообщения
7 790
Репутация
2 319
Vlasssov
Кнопку так можно сделать в чужом окне:
Код:
#Include <WindowsConstants.au3>

Global $X, $Y

Run('Calc.exe')
If Not WinWait('Калькулятор Плюс', '', 3) Then
    MsgBox(0, '', 'Калькулятор Плюс not found!')
    Exit
EndIf

$hWnd = WinGetHandle('Калькулятор Плюс')
$hForm = GUICreate('', 50, 19, -1, -1, $WS_POPUP, -1, $hWnd)
$Button = GUICtrlCreateButton('OK', 0, 0, 50, 19)
GUISetState(@SW_SHOWNOACTIVATE)

While 1
    $Pos = WinGetPos($hWnd)
    If @error Then
        Exit
    EndIf
    If ($X <> $Pos[0]) Or ($Y <> $Pos[1]) Then
        $X = $Pos[0]
        $Y = $Pos[1]
        WinMove($hForm, '', $X + 201, $Y + 29)
    EndIf
    $Msg = GUIGetMsg()
    Switch $Msg
        Case $Button
            MsgBox(0, '', 'OK')
    EndSwitch
WEnd
 

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5 379
Репутация
2 712
madmasles, а причем здесь этот код?

:blink:
 

madmasles

Модератор
Глобальный модератор
Сообщения
7 790
Репутация
2 319
Yashied
Если поменять GUICtrlCreateButton() на GUICtrlCreatePic(), то можно картинку внедрять на чужое окно.
Как я понял, конечная цель - получить картинку на чужом окне?

Или на окне $hForm использовать функции _GDIPlus.
 

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5 379
Репутация
2 712
Код:
#Include <GDIPlus.au3>

Run('calc.exe')
If Not WinWaitActive('Calculator', '', 3) Then
	Exit
EndIf

$hWnd = WinGetHandle('Calculator')
_GDIPlus_Startup()
$hGraphic = _GDIPlus_GraphicsCreateFromHWND($hWnd)
$hPen = _GDIPlus_PenCreate(0xFFFF0000, 3)
_GDIPlus_GraphicsDrawEllipse($hGraphic, 10, 10, 100, 100, $hPen)
_GDIPlus_GraphicsDispose($hGraphic)
_GDIPlus_PenDispose($hPen)
_GDIPlus_Shutdown()
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8 472
Репутация
2 402
Yashied
Жаль только что этот круг стирается каждый раз при отрисовке окна (например если увести окно за пределы экрана, или активировать другое).
 

Garrett

Модератор
Локальный модератор
Сообщения
3 999
Репутация
964
CreatoR сказал(а):
Yashied
Жадь только что этот круг стирается каждый раз при отрисовке окна (например если увести окно за пределы экрана, или активировать другое).
У меня сразу пришла мысль в голову, что пример Yashied`а хорошее подспорье ботоводам! ;D
Например, таким образом можно в окне игры выставлять маркеры!
Но после эксперимента, тоже заметил, если окно постоянно обновляется (что постоянно происходит в окне клиента игры), то маркер стирается. Попробовал всё это дело заключить в цикл, последствия не из приятных :(, обновляться стал и рабочий стол (по сути, тоже окно).
 

Belfigor

Модератор
Локальный модератор
Сообщения
3 595
Репутация
938
А я спокойно сую это при необходимости в цикл, работает на ура :smile:, но зачастую хватает простенького гуя внутри игры :smile:
 

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5 379
Репутация
2 712
CreatoR сказал(а):
Жаль только что этот круг стирается каждый раз при отрисовке окна (например если увести окно за пределы экрана, или активировать другое).
Для того, что бы грамотно перерисовывать изображение, нужно ловить WM_PAINT для стороннего приложения, т.е. писать dll для hook'а, что в AutoIt сделать не получится. DllCallbackRegister() здесь работать не будет. Где-то на офф. форуме я вдел попытки решить подобные вопросы...
 
Верх