1 (изменено: mih, 2010-12-27 00:28:56)

Тема: AHK: Отличить "раб. область" контрола "ListView" от "полос прокрутки".

Есть:
окно с контролом, содержащим
список файлов и полосы прокрутки (верт. и гор.) —
которые могут присутствовать, а могут и не существовать.

Пример такого контрола — в Проводнике — ClassNN "SysListView321".

Моя проблема в том, что полосы прокрутки принадлежат контролу и
отличить их от собственно рабочей зоны
я не могу — а мне надо.

Есть ли простой способ понять, что мышь находится
именно в рабочей области, а не над полосой прокрутки ?

2

Re: AHK: Отличить "раб. область" контрола "ListView" от "полос прокрутки".

Зная размеры и координаты контрола, а также размеры полос прокрутки (если они вообще есть), можно вычислить.
Другой вариант: при наведении курсора на полосу прокрутки он превращается из Arrow в IBeam.

3 (изменено: mih, 2010-12-27 00:28:01)

Re: AHK: Отличить "раб. область" контрола "ListView" от "полос прокрутки".

Второй вариант не годится, т.к.
контрол у меня  — типа "список файлов" (типа "SysListView321"),
и там  курсор НЕ меняется (я привел выше неточный пример и исправил его).

А первый вариант — я надеялся его избежать,
т.к. он зависит от настроек системы (полосы могут быть разной ширины),
а также они могут быть, а могут и не быть — ситуация  всё время меняется.

Если нет красивого способа,
то хоть бы найти способ определить их СУЩЕСТВОВАНИЕ,
хотя странно — мне кажется, должно что-то быть — сам контрол  реагирует же
по-разному на клики в раб область, и на полосу — почему мы не можем различить их не косвенным образом, а прямо?

4 (изменено: teadrinker, 2010-12-27 20:38:35)

Re: AHK: Отличить "раб. область" контрола "ListView" от "полос прокрутки".

Определение координат вертикальной и горизонтальной полос прокрутки, принадлежащей контролам (координаты относительно экрана):

F11:: 
   hControl =   ; указать hwnd контрола
   
   OBJID_VSCROLL = 0xFFFFFFFB
   OBJID_HSCROLL = 0xFFFFFFFA
   STATE_SYSTEM_INVISIBLE = 0x8000
   
   VarSetCapacity(SBI, 60)
   NumPut(60, SBI)

   Loop 2
   {
      if !DllCall("GetScrollBarInfo", UInt, hControl, UInt
         , A_Index = 1 ? OBJID_VSCROLL : OBJID_HSCROLL, UInt, &SBI)
      {
         MsgBox, Невозможно получить данные!`nОшибка %A_LastError%
         Return
      }
      
      if (NumGet(SBI, 36) = STATE_SYSTEM_INVISIBLE)
         MsgBox, % (A_Index = 1 ? "Вертик" : "Горизонт") 
            . "альная полоса прокрутки невидима (не существует)."
      Else
      {
         x1 := NumGet(SBI, 4), y1 := NumGet(SBI, 8)
         x2 := NumGet(SBI, 12), y2 := NumGet(SBI, 16)
         MsgBox, % "Координаты верхней левой и нижней правой точки "
            . (A_Index = 1 ? "вертик" : "горизонт") 
            . "альной полосы прокрутки:`n"
            . "x1 = " x1 "`n"
            . "y1 = " y1 "`n"
            . "x2 = " x2 "`n"
            . "y2 = " y2
      }
   }
   Return
Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

5 (изменено: mih, 2010-12-28 04:20:11)

Re: AHK: Отличить "раб. область" контрола "ListView" от "полос прокрутки".

ложная тревога.

6

Re: AHK: Отличить "раб. область" контрола "ListView" от "полос прокрутки".

mih пишет:

к сожалению, всегда выдаёт только Ошибку 1400 (в любом окне, даже в  Блокноте).

Ошибка 1400 — ERROR_INVALID_WINDOW_HANDLE — неверно указанный хэндл контрола.
Ты указал нужный хэндл во второй строке? Если хэндл указан верно, должно работать, проверено.

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

7 (изменено: mih, 2010-12-28 16:20:25)

Re: AHK: Отличить "раб. область" контрола "ListView" от "полос прокрутки".

Как же я не заметил этого! — очень виноват.
Всё в порядке, большое спасибо.

Скрипт работает правильно.
Точки (координаты которых выводятся) — вершины кнопок полос прокрутки
(квадратик в нижнем правом углу, если полос - две — 
не принадлежит ни одной полосе).