Автор Тема: Как узнать координаты и размер пустой области панели задач?  (Прочитано 503 раз)

0 Пользователей и 2 Гостей просматривают эту тему.

Оффлайн Hiki [?]

  • Новичок
  • *
  • Сообщений: 25
  • Репутация: 1
  • Пол: Мужской
    • Награды
  • Версия AutoIt: 3.3.14.0
Сделал себе панель поиска в гугле. Поместил ее на панель задач слева от трея по фиксированным координатам, что меня не устраивает, потому что количество значков в трее величина переменная.
(нажмите для показа/скрытия)
Нужно координату $x сделать зависимой от ширины трея, плюс еще слева от трея значок языковой панели.
Пробовал ControlGetPos, но выдает только размер панели задач целиком.
Подскажите кто в курсе.

Русское сообщество AutoIt


Оффлайн Tyr [?]

  • Новичок
  • *
  • Сообщений: 39
  • Репутация: 4
  • Пол: Мужской
    • Награды
  • Версия AutoIt: 3.3.6.1
Я не профи в этом языке, но подобные задачи, если не решаются влоб, решаются методами на подобие PixelSearch (да пусть и не супер производительно и не универсально, зато кода мало и просто:
Код: AutoIt [Выделить]
; Найти чисто красный пиксель в прямоугольнике 0,0-20,300
$coord = PixelSearch(0, 0, 20, 300, 0xFF0000)
If Not @error Then
    MsgBox(0, "X и Y равны:", $coord[0] & "," & $coord[1])
EndIf

; Найти чисто красный пиксель или пиксель с отклонением 10 градаций от чисто красного
$coord = PixelSearch(0, 0, 20, 300, 0xFF0000, 10)
If Not @error Then
    MsgBox(0, "X и Y равны:", $coord[0] & "," & $coord[1])
EndIf
 


Оффлайн Hiki [?]

  • Новичок
  • *
  • Сообщений: 25

  • Автор темы
  • Репутация: 1
  • Пол: Мужской
    • Награды
  • Версия AutoIt: 3.3.14.0
Tyr
Каким образом ваше решение может определить координаты и размеры трея на произвольном мониторе? :think:

Оффлайн Tyr [?]

  • Новичок
  • *
  • Сообщений: 39
  • Репутация: 4
  • Пол: Мужской
    • Награды
  • Версия AutoIt: 3.3.6.1
"...плюс еще слева от трея значок языковой панели." Значок можно по двум(трем) пикселям в заданной области идентифицировать и получив его координаты найти Х... также у меня там надпись Desktop >> ...В Бот темах этого форума примеров много, как кликнуть сбоку от нарисованного текста.... а тебе не кликнуть надо, а только координату получить

Русское сообщество AutoIt

Re: Как узнать координаты и размер пустой области панели задач?
« Ответ #3 Отправлен: Декабрь 21, 2017, 11:49:34 »

Онлайн Tempo [?]

  • Продвинутый
  • ***
  • Сообщений: 398
  • Репутация: 92
  • Пол: Мужской
    • Награды
  • Версия AutoIt: 3.3.14.0
Пример
Код: AutoIt [Выделить]
#NoTrayIcon
#include <WinAPI.au3>
#include <WindowsConstants.au3>
#include <GuiConstants.au3>
#include <MsgBoxConstants.au3>
Global $hTaskBar = WinGetHandle("[CLASS:Shell_TrayWnd]"), $hCicero = ControlGetHandle($hTaskBar, Null, "[CLASS:CiceroUIWndFrame; INSTANCE:1]")
Global $sSite = "http://google.ru/search?q=", $sBanner = "Введите запрос"
Global $tPOINT = DllStructCreate($tagPOINT), $iW = 150, $iH = 20, $iX, $iY
Global $hGUI, $iInput, $iEnter, $hInput, $sText

If Not $hTaskBar Or Not $hCicero Then Exit MsgBox($MB_ICONERROR + $MB_TOPMOST, "Ошибка", "Не удалось получить дескриптор Shell_TrayWnd/CiceroUIWndFrame")

_WinAPI_ClientToScreen($hCicero, $tPOINT)
$iX = DllStructGetData($tPOINT, 1) - $iW - 10
$iY = @DesktopHeight - (WinGetPos($hTaskBar)[3] + $iH) / 2

$hGUI = GUICreate(Null, $iW, $iH, $iX, $iY, $WS_POPUP, $WS_EX_TOOLWINDOW)
$iInput = GUICtrlCreateInput(Null, 0, 0, $iW, $iH, $WS_BORDER, 0)
GUICtrlSendMsg(-1, $EM_SETCUEBANNER, True, $sBanner)
$hInput = GUICtrlGetHandle(-1)
$iEnter = GUICtrlCreateDummy()
Global $aKeys[1][2] = [["{ENTER}", $iEnter]]
GUISetAccelerators($aKeys)
GUISetState(@SW_SHOWNOACTIVATE)
AdlibRegister("_UpdatePos", 1000)

While 1
    Switch GUIGetMsg()
        Case $iEnter
            $sText = GUICtrlRead($iInput)
            If _WinAPI_GetFocus() = $hInput And $sText Then
                ShellExecute($sSite & $sText)
                GUICtrlSetData($iInput, Null)
            EndIf
        Case $GUI_EVENT_CLOSE
            ExitLoop
    EndSwitch
    If WinActive($hTaskBar) Then
        WinSetOnTop($hGUI, Null, 1)
    ElseIf Not WinActive($hGUI) Then
        WinSetOnTop($hGUI, Null, 0)
    EndIf
WEnd
GUIDelete($hGUI)

Func _UpdatePos()
    Local $iTmpX, $iTmpY
    DllStructSetData($tPOINT, 1, 0)
    _WinAPI_ClientToScreen($hCicero, $tPOINT)
    $iTmpX = DllStructGetData($tPOINT, 1) - $iW - 10
    $iTmpY = @DesktopHeight - (WinGetPos($hTaskBar)[3] + $iH) / 2
    If $iTmpX <> $iX Or $iTmpY <> $iY Then
        $iX = $iTmpX
        $iY = $iTmpY
        WinMove($hGUI, Null, $iX, $iY)
    EndIf
EndFunc   ;==>_UpdatePos

« Последнее редактирование: Декабрь 21, 2017, 15:24:40 от Tempo »

Оффлайн InnI [?]

  • AutoIt Гуру
  • *****
  • Сообщений: 3835
  • Репутация: 1014
    • Награды
  • Версия AutoIt: 3.3.14.0
Hiki  [?]
Цитировать
Нужно координату $x сделать зависимой от ширины трея, плюс еще слева от трея значок языковой панели.
Код: AutoIt [Выделить]
$aPos = ControlGetPos("[class:Shell_TrayWnd]", "", "MSTaskListWClass1")
If Not IsArray($aPos) Then Exit

$X = $aPos[0] + $aPos[2]
ConsoleWrite($X & @CRLF)


Оффлайн Hiki [?]

  • Новичок
  • *
  • Сообщений: 25

  • Автор темы
  • Репутация: 1
  • Пол: Мужской
    • Награды
  • Версия AutoIt: 3.3.14.0
Всем спасибо за помощь, сделал так:
(нажмите для показа/скрытия)
Теперь работает как надо :ok:

Русское сообщество AutoIt

Re: Как узнать координаты и размер пустой области панели задач?
« Ответ #6 Отправлен: Декабрь 22, 2017, 06:04:45 »

 

Похожие темы

  Тема / Автор Ответов Последний ответ
4 Ответов
4603 Просмотров
Последний ответ Декабрь 02, 2011, 22:15:01
от agikon
22 Ответов
9344 Просмотров
Последний ответ Апрель 20, 2012, 13:02:11
от agikon
6 Ответов
3247 Просмотров
Последний ответ Апрель 26, 2012, 12:11:31
от agikon
4 Ответов
2619 Просмотров
Последний ответ Октябрь 23, 2012, 10:40:26
от joiner
8 Ответов
3412 Просмотров
Последний ответ Ноябрь 29, 2012, 22:28:47
от vitaliy4us
0 Ответов
2517 Просмотров
Последний ответ Январь 08, 2013, 20:03:30
от ArgoNaft
0 Ответов
6027 Просмотров
Последний ответ Ноябрь 15, 2013, 01:51:56
от Favorite6233
7 Ответов
3853 Просмотров
Последний ответ Декабрь 13, 2013, 11:42:34
от joiner
8 Ответов
2328 Просмотров
Последний ответ Июнь 10, 2014, 12:47:27
от C2H5OH
13 Ответов
2418 Просмотров
Последний ответ Март 18, 2015, 16:51:05
от mitas