Что нового

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

vcomp71

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

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,323
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,724
madmasles, а причем здесь этот код?

:blink:
 

madmasles

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

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

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5,379
Репутация
2,724
Код:
#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,673
Репутация
2,486
Yashied
Жаль только что этот круг стирается каждый раз при отрисовке окна (например если увести окно за пределы экрана, или активировать другое).
 

Garrett

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

Belfigor

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

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5,379
Репутация
2,724
CreatoR сказал(а):
Жаль только что этот круг стирается каждый раз при отрисовке окна (например если увести окно за пределы экрана, или активировать другое).

Для того, что бы грамотно перерисовывать изображение, нужно ловить WM_PAINT для стороннего приложения, т.е. писать dll для hook'а, что в AutoIt сделать не получится. DllCallbackRegister() здесь работать не будет. Где-то на офф. форуме я вдел попытки решить подобные вопросы...
 
Верх