Что нового

Проведение линии между центрами двух окон

yl3d

Новичок
Сообщения
70
Репутация
0
Добрый день.
Помогите разобраться.

На экране открыты - два окна Калькулятор и Блокнот.
Как скриптом - нарисовать на экране линию - от геометрического центра окна Блокнота - к центру окна Калькулятора ?

Пытался использовать скрипт, но он что-то не очень хорошо работает.
Код:
#include <WindowsConstants.au3>
#include <WinAPI.au3>

ShowCross(@desktopwidth / 2, @desktopheight / 2, 20, 2, 0xFF, 3000)

Func ShowCross($start_x, $start_y, $length, $width, $color, $time)
    Local $hDC, $hPen, $obj_orig

    $hDC = _WinAPI_GetWindowDC(0) ; DC всего экрана (рабочего стола)
    $hPen = _WinAPI_CreatePen($PS_SOLID, $width, $color)
    $obj_orig = _WinAPI_SelectObject($hDC, $hPen)

    _WinAPI_DrawLine($hDC, $start_x - $length, $start_y, $start_x - 5, $start_y) ; горизонтальная слева
    _WinAPI_DrawLine($hDC, $start_x + $length, $start_y, $start_x + 5, $start_y) ; горизонтальная справа
    _WinAPI_DrawLine($hDC, $start_x, $start_y - $length, $start_x, $start_y - 5) ; Вертикальная сверху
    ;   _WinAPI_DrawLine($hDC, $start_x, $start_y + $length, $start_x, $start_y + 5) ; Вертикальная снизу


    _WinAPI_MoveTo($hDC, $start_x, $start_y + $length)
    _WinAPI_LineTo($hDC, $start_x, $start_y + 5)

	  _WinAPI_DrawLine($hDC, 2, 40, 600, 780) ; горизонтальная слева

    Sleep($time) ; Показать крестообразный прицел поверх экрана за счёт указанной задержки времени

    ; Обновить рабочий стол (очистить / удалить крестообразный прицел)
    _WinAPI_RedrawWindow(_WinAPI_GetDesktopWindow(), 0, 0, $RDW_INVALIDATE + $RDW_ALLCHILDREN)

    ; Очистить ресурсы
    _WinAPI_SelectObject($hDC, $obj_orig)
    _WinAPI_DeleteObject($hPen)
    _WinAPI_ReleaseDC(0, $hDC)
EndFunc   ;==>ShowCross
 

InnI

AutoIT Гуру
Сообщения
4,912
Репутация
1,429
yl3d [?]
Пытался использовать скрипт, но он что-то не очень хорошо работает.
Это скрипт из справки с добавленной вами линией. Выполняет именно то, что в нём прописано. Объясните, что значит "не очень хорошо работает".
 
Автор
Y

yl3d

Новичок
Сообщения
70
Репутация
0
InnI , нет, ну в справке-то он хорошо работает - рисует что-то навроде перекрестья прицела.
Я просто этот скрипт пытался заставить проводить линию между двумя окнами - Блокнота и Калькулятора.
И не получалось - выдавало одни ошибки.

Вот поэтому и спрашиваю.
А скрипт привел для примера, чтобы было примерно понятно о какой линии вообще идет речь.
 

InnI

AutoIT Гуру
Сообщения
4,912
Репутация
1,429
yl3d [?]
И не получалось - выдавало одни ошибки.
И что конкретно не получалось? Рассчитать координаты центров окон? Или нарисовать линию из одной точки в другую? Вы же понимаете, что это две разные темы? А, сложив их вместе, опять получился "стол заказов"
Код:
#include <WinAPI.au3>

$sNote = "[class:Notepad]"
$sCalc = "[class:CalcFrame]"

If Not WinActivate($sNote) Then Run("notepad.exe")
WinWaitActive($sNote)
If Not WinActivate($sCalc) Then Run("calc.exe")
WinWaitActive($sCalc)

$aNote = WinGetPos($sNote)
If Not IsArray($aNote) Then Exit MsgBox(0, "", "Ошибка определения координат Блокнота")
$aCalc = WinGetPos($sCalc)
If Not IsArray($aCalc) Then Exit MsgBox(0, "", "Ошибка определения координат Калькулятора")

$X1 = $aNote[0] + $aNote[2] / 2
$Y1 = $aNote[1] + $aNote[3] / 2
$X2 = $aCalc[0] + $aCalc[2] / 2
$Y2 = $aCalc[1] + $aCalc[3] / 2

$hDC = _WinAPI_GetWindowDC(0)
$hPen = _WinAPI_CreatePen(0, 5, 0xFF)
$oldPen = _WinAPI_SelectObject($hDC, $hPen)
_WinAPI_DrawLine($hDC, $X1, $Y1, $X2, $Y2)

Sleep(3333)

_WinAPI_SelectObject($hDC, $oldPen)
_WinAPI_DeleteObject($hPen)
_WinAPI_ReleaseDC(0, $hDC)
ControlSend("Program Manager", "", "", "{F5}")
 
Автор
Y

yl3d

Новичок
Сообщения
70
Репутация
0
InnI , теперь все идеально рисует. Спасибо вам большое.
 
Верх