1

Тема: AHK: Управление окнами мышкой

Сворачивание в трей любого окна нажиманием правой кнопкой мышки по кнопке "свернуть" это можно реализовать в AutoHotkey ??
Если да то подскажите пожалуйста пример или в общих словах какими операторами это делается..

А нажимая, к примеру, правой кнопкой мыши по кнопке "развернуть" мне бы хотелось делать данное окно поверх всех окон.
У любого окна есть много стандартных мест: кнопки свернуть развернуть и закрыть, границы окна для изменения размеров, заголовок окна...
На nncron-е у меня был скрипт в котором на клик любой кнопкой мышки по любому месту окна можно было назначить какое нибудь действие, но тот скрипт в nncrone у меня периодически глючит... Появилась задумка перенести его на другую платформу-автоматизатор.

2

Re: AHK: Управление окнами мышкой

А что в вашем понимании значит "свернуть в трей"? Для примера возьмём окно блокнота. Нажимаем на кнопку "свернуть", и что должно произойти?

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

3

Re: AHK: Управление окнами мышкой

Насчёт сворачивания в трей, может пригодится:
AHK: Свёртка приложений в трей
AHK. Отключение кнопки закрытия окна [X]

хотелось делать данное окно поверх всех окон

Как мне видится, самое простое - проверять координаты курсора при нажатии ПКМ относительно активного окна.

4

Re: AHK: Управление окнами мышкой

teadrinker пишет:

А что в вашем понимании значит "свернуть в трей"? Для примера возьмём окно блокнота. Нажимаем на кнопку "свернуть", и что должно произойти?

ну есть же понятие "область уведомлений" или "системный трей" (англ. system tray) это когда окно сворачивается не на панель задач а туда, рядом с часами и остальными значками..

5

Re: AHK: Управление окнами мышкой

Хороший пример по первой ссылке ypppu.

это когда окно сворачивается не на панель задач а туда

"Туда" ничего не сворачивается. Просто окно скрывается, а чтобы оно снова появилось, как-то взаимодействуют с его иконкой в трее. У блокнота нет своей иконки в трее, отсюда и мой вопрос.

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

6

Re: AHK: Управление окнами мышкой

teadrinker пишет:

Просто окно скрывается, а чтобы оно снова появилось, как-то взаимодействуют с его иконкой в трее. У блокнота нет своей иконки в трее, отсюда и мой вопрос.

Вопрос не о сворачивании в трей, я не думал что этот пример вызовет дополнительные вопросы.
Мне больше интересовало, существуют ли какие-нибудь механизмы послать активному окну управляющее сообщение (Windows Messages) чтобы получить в ответ некий код соответствующий текущему элементу окна.. и в зависимости от кода назначить какое-нибудь действие..

7

Re: AHK: Управление окнами мышкой

У меня так вышло:

CoordMode, Mouse
SetBatchLines, -1
Return

#If PressedButton := GetPressedButton()
LButton::Return

#If PressedButton
LButton Up::
   for key, var in ["left", "top", "right", "bottom"]
      %var% := PressedButton.Pos[key]
   button := PressedButton.Name, hWin := PressedButton.hWin, PressedButton := ""
   
   MouseGetPos, X, Y
   if (X >= left && X <= right && Y >= top && Y <= bottom)
   {  ; здесь вместо сообщения действия в зависимости от значения button и hWin
      MsgBox, % "Была нажата кнопка " button " в окне " hWin
   }
   Return

#If
Esc:: ExitApp

GetPressedButton()
{
   MouseGetPos, X_Mouse, Y_Mouse, hWin
   VarSetCapacity(TITLEBARINFO, 140, 0)
   NumPut(140, TITLEBARINFO)
   SendMessage, WM_GETTITLEBARINFOEX := 0x33F,, &TITLEBARINFO,, ahk_id %hWin%
   
   for button, offset in {Min: 76, Max: 92, Close: 124}
   {
      pos := []
      loop 4
         pos[A_Index] := NumGet(&TITLEBARINFO + offset + 4*(A_Index - 1), "UInt")
      
      if (X_Mouse >= pos[1] && X_Mouse <= pos[3] && Y_Mouse >= pos[2] && Y_Mouse <= pos[4])
         Return {Name: button, Pos: pos, hWin: hWin}
   }
}
Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

8

Re: AHK: Управление окнами мышкой

DllCall("LoadLibrary","Str","oleacc","Ptr")
Acc_ObjectFromPoint(ByRef _idChild_ = "", x = "", y = "")
{
    
    If    DllCall("oleacc\AccessibleObjectFromPoint", "Int64", x==""||y==""?0*DllCall("GetCursorPos","Int64*",pt)+pt:x&0xFFFFFFFF|y<<32, "Ptr*", pacc, "Ptr", VarSetCapacity(varChild,8+2*A_PtrSize,0)*0+&varChild)=0
    Return    ComObjEnwrap(9,pacc,1), _idChild_:=NumGet(varChild,8,"UInt")
}
settimer accname,10
return
accname:
MouseGetPos x_mouse,y_mouse
Acc := Acc_ObjectFromPoint(Child,x_mouse,y_mouse)
% ((Acc.accName(Child)="Свернуть") or (Acc.accName(Child)="Восстановить") or (Acc.accName(Child)="Закрыть")) ? (custom_mouse_left_click:=1) : (custom_mouse_left_click:=0)
return
#if custom_mouse_left_click
Lbutton::tooltip % "Нажата кнопка " Acc.accName(Child)
#if 

можно и через acc

9

Re: AHK: Управление окнами мышкой

Тоже пробовал, но у меня так не работает, Win7 64, AHK 64.

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

10

Re: AHK: Управление окнами мышкой

А, нет, иногда срабатывает, но не стабильно. Кроме того, ориентироваться на accName не стоит, они могут быть разными в разных системах.

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

11

Re: AHK: Управление окнами мышкой

teadrinker пишет:

А, нет, иногда срабатывает, но не стабильно. Кроме того, ориентироваться на accName не стоит, они могут быть разными в разных системах.

Жаль:(

12

Re: AHK: Управление окнами мышкой

teadrinker пишет:

У меня так вышло:

Спасибо за пример теперь буду его изучать. Пока увидел что работает пример с левой кнопкой мышки, но я не планировал переназначать стандартные функции кнопок "свернуть, развернуть и закрыть"

Мне бы хотелось запрограммировать какие нибудь действия на правую и среднюю кнопку мышки.
Кроме этого я чувствую что должно быть можно отслеживать клики по заголовку окна, его краям и углам..
Ведь может же это делать nncron, вот как пишут в его стравке:

nncronhelp пишет:

...как узнать над каким элементом активного окна сейчас находится указатель мыши?

Для этого можно послать активному окну windows message WM_NCHITTEST и исследовать полученное числовое значение. Вот список возможных значений:

0   курсор вне текущего активного окна: в фоновой области экрана или на границе между
    окнами (HTNOWHERE).
1   курсор в клиентской области окна (HTCLIENT).
2   курсор в области заголовка окна (HTCAPTION).
3   курсор на пиктограмме системного меню (HTSYSMENU).
4   курсор в блоке изменения размеров окна (in a size box) (HTSIZE, HTGROWBOX).
5   курсор в панели меню (HTMENU).
6   курсор на горизонтальной полосе прокрутки (HTHSCROLL).
7   курсор на вертикальной полосе прокрутки (HTVSCROLL).
8   курсор на кнопке сворачивания окна (Minimize) (HTMINBUTTON, HTREDUCE).
9   курсор на кнопке разворачивания окна в полный экран (Maximize) (HTMAXBUTTON, HTZOOM).
......

13

Re: AHK: Управление окнами мышкой

Alexey244 пишет:

А нажимая, к примеру, правой кнопкой мыши по кнопке "развернуть" мне бы хотелось

А, да, прочитал невнимательно. Просто замените в моём примере LButton на RButton оба раза.

Alexey244 пишет:

Кроме этого я чувствую что должно быть можно отслеживать клики по заголовку окна, его краям и углам..

Не совсем понял — это утверждение или вопрос? Если вопрос, то вы сами на него ответили далее.

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

14 (изменено: yalanne, 2015-04-01 21:37:42)

Re: AHK: Управление окнами мышкой

Alexey244, поискав в гугле сообщение WM_NCHITTEST наткнулся на этот скрипт:

#Persistent
SetTimer WatchCursor, 10
WatchCursor:
tooltip % WM_NCHITTEST()
Return

WM_NCHITTEST()
{
   CoordMode, Mouse, Screen
   MouseGetPos, x, y, z
   SendMessage, 0x84, 0, (x&0xFFFF)|(y&0xFFFF)<<16,, ahk_id %z%
   RegExMatch("ERROR TRANSPARENT NOWHERE CLIENT CAPTION SYSMENU SIZE MENU HSCROLL VSCROLL MINBUTTON MAXBUTTON LEFT RIGHT TOP TOPLEFT TOPRIGHT BOTTOM BOTTOMLEFT BOTTOMRIGHT BORDER OBJECT CLOSE HELP", "(?:\w+\s+){" . ErrorLevel+2&0xFFFFFFFF . "}(?<AREA>\w+\b)", HT)
   Return   HTAREA
}

только он не совсем корректно отображает.
Как не странно но у меня корректно показывает только в google chrome и в метро приложениях.

15

Re: AHK: Управление окнами мышкой

WM_NCHITTEST показывает точный результат, если только не используется тема оформления «Аэро».

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

16 (изменено: yalanne, 2015-04-01 22:52:38)

Re: AHK: Управление окнами мышкой

Эх у меня и на класик теме не работает стабильно.

17

Re: AHK: Управление окнами мышкой

Всем спасибо за примеры. Уже есть над чем подумать, правда я еще новичек в синтаксисе AHK, и не все понимаю в примерах.. Но пример с WM_NCHITTEST() у меня на 7ке работает.
Осталось только отслеживать клики мышкой, определять какой кнопкой кликнули и в каком месте был клик (с помощью WM_NCHITTEST) и задавать нужные действия..
Ерунда по сути осталась, но буду признателен если кто нибудь поможет довести до ума.

18

Re: AHK: Управление окнами мышкой

Alexey244 пишет:

Но пример с WM_NCHITTEST() у меня на 7ке работает.

А какую тему используете?

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

19 (изменено: yalanne, 2015-04-02 13:35:41)

Re: AHK: Управление окнами мышкой

Alexey244 пишет:

Осталось только отслеживать клики мышкой

вот

#Persistent ; Делает скрипт постоянно выполняющимся
WM_NCHITTEST(){ ;Функция используется для определения области, над которой находится указатель.
   CoordMode, Mouse, Screen ;Влияет на MouseGetPos.Координаты будут относительно экрана.
   MouseGetPos, x, y, z ; x-y определение позиции курсора. z hwnd окна над которым находится курсор.
   SendMessage, 0x84, 0, (x&0xFFFF)|(y&0xFFFF)<<16,, ahk_id %z% ; Отправляет сообщение WM_NCHITTEST окну который находится по курсором.
  Return Errorlevel ; Ответ функции равен ответу оконного сообщения.
}
#if (WM_NCHITTEST:=WM_NCHITTEST()) and (WM_NCHITTEST=8) or (WM_NCHITTEST=9) or (WM_NCHITTEST=20) ; # - позволяет проверять постоянно, изменяется ли значение функции выше. 
;  [  (WM_NCHITTEST:=WM_NCHITTEST())  ] Функция переводится в переменную. Что бы не вызывать её несколько раз за цикл.
;  [ (WM_NCHITTEST=8) or (WM_NCHITTEST=9) or (WM_NCHITTEST=20)  ] Если содержимое WM_NCHITTEST равно 8 или 9 или 20 условие истина.
; 8 - кнопка свернуть. 9 - кнопка развернуть. 20 - кнопка закрыть.
Lbutton::
Rbutton::
Mbutton::  ;  По нажатию любой из этих кнопок откроется msgbox.
msgbox % "Нажата " ( (WM_NCHITTEST=8) ? "свернуть" : ((WM_NCHITTEST=9) ? "развернуть" : ((WM_NCHITTEST=20) ? "закрыть" : "" ))) " " ((A_ThisHotkey="Lbutton") ? "левой" : ((A_ThisHotkey="Rbutton") ? "правой" : ((A_ThisHotkey="Mbutton") ? "средней" : ""))) " клавишей."
; Если WM_NCHITTEST будет равным 8 то покажет надпись "свернуть",а если нет то проверит следующее условие равно ли 9, если да то надпись будет "развернуть". Или нет то проверит 3й раз равно ли 20. если да то надпись будет "закрыть"
; с нажатиями клавиш мыши аналогично.
#if

20

Re: AHK: Управление окнами мышкой

yalanne, ужасный код.

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

21 (изменено: yalanne, 2015-04-02 00:28:11)

Re: AHK: Управление окнами мышкой

teadrinker пишет:

yalanne, ужасный код.

Почему?) работает же)

22

Re: AHK: Управление окнами мышкой

Не всё, что работает — хорошо.

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

23 (изменено: yalanne, 2015-04-02 09:59:42)

Re: AHK: Управление окнами мышкой

У меня в проводнике,в хроме, в новом калькуляторе работает как надо.

24

Re: AHK: Управление окнами мышкой

Тогда ответьте на ряд вопросов.
1. Зачем вы цитируете предыдущий пост?
2. Чем ваш вариант отличается от этого, кроме того, что не всегда даёт точную информацию?
3. Зачем у вас функция WM_NCHITTEST() в директиве #If вызывается трижды?
4. Зачем эта же функция вызывается ещё трижды по метке горячих клавиш?

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

25

Re: AHK: Управление окнами мышкой

Да, ещё.
5. Зачем у вас в SendMessage используется x&0xFFFF и y&0xFFFF вместо x и y?

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

26

Re: AHK: Управление окнами мышкой

teadrinker пишет:

Тогда ответьте на ряд вопросов.
1. Зачем вы цитируете предыдущий пост?

Например, во избежание ситуации, где, пока ты пишешь ответ, кто-то другой своим постом отделит твой ответ от поста, на который ты отвечаешь. Есть форумы, где выводится об этом уведомление при попытке отправить ответ, но здесь же нет этой фишки, насколько мне известно.

27

Re: AHK: Управление окнами мышкой

YMP пишет:

кто-то другой своим постом отделит твой ответ от поста

Это в девять утра-то, когда на форуме кроме тебя никого нет? Думаю, это избыточная перестраховка в данной ситуации, тем более что есть правила цитирования и возможность обновить страницу.

здесь же нет этой фишки, насколько мне известно

Как и то, что её скорее всего никогда не будет.

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

28 (изменено: yalanne, 2015-04-02 10:35:08)

Re: AHK: Управление окнами мышкой

teadrinker,
1) Исправил.
2) Предлагаю другие варианты, если их доработать будет альтернативой.
3) Исправил на это

#if (WM_NCHITTEST:=WM_NCHITTEST()) and (WM_NCHITTEST=8) or (WM_NCHITTEST=9) or (WM_NCHITTEST=20)

что бы вызывалось 1 раз а не 6.
В этом If'е убирает другие сообщения. оставляет только 8,9,20 - которые соответствуют действиям свернуть, развернуть, закрыть.
4) Чтобы не вызывалось и бралось из переменной.

msgbox % "Нажата " ( (WM_NCHITTEST=8) ? "свернуть" : ((WM_NCHITTEST=9) ? "развернуть" : ((WM_NCHITTEST=20) ? "закрыть" : "" ))) " " ((A_ThisHotkey="Lbutton") ? "левой" : ((A_ThisHotkey="Rbutton") ? "правой" : ((A_ThisHotkey="Mbutton") ? "средней" : ""))) " клавишей."

5) Без понятий. Так уже в примере было.

29

Re: AHK: Управление окнами мышкой

+ Off

Есть кнопка "Предпросмотр" - категорически рекомендовано к использованию министерством образования РФ, в частности спецкомитетом по борьбе с ошибками, а точнее его подразделением по отлову и уничтожению очепяток. )
Новые посты, при их появлении, при этом будут показаны прямо под вашим ответом.

30

Re: AHK: Управление окнами мышкой

yalanne, так уже лучше, но всё это записать можно аккуратней и понятней (особенно предпоследнюю строчку).

yalanne пишет:

5) без понятий. Так уже в примере было.

Такая запись понадобилась бы, если б x и y могли принимать отрицательные значения, в данном случае же это ни к чему.

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

31

Re: AHK: Управление окнами мышкой

teadrinker пишет:

Это в девять утра-то, когда на форуме кроме тебя никого нет?

Да я обычно и не смотрю, есть кто или нет. Зачем эти лишние телодвижения и расход памяти, если можно процитировать?

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

32 (изменено: yalanne, 2015-04-02 13:37:56)

Re: AHK: Управление окнами мышкой

teadrinker пишет:

аккуратней и понятней

добавил комментарии к скрипту

33

Re: AHK: Управление окнами мышкой

YMP пишет:

Зачем эти лишние телодвижения и расход памяти

Так ты тоже заметил, что нарушать правила легче, чем выполнять их? Вопрос лишь в последствиях. Но я уверен, что образованные и культурные люди, которые собираются на нашем форуме, не встанут на этот скользкий путь! А кто некультурный — тому бан.

yalanne пишет:

добавил комментарии к скрипту

Комментировать код — прекрасная привычка, которой напрочь лишены большинство завсегдатаев раздела AHK. Но едва ли необходимы комментарии типа

#Persistent ; Делает скрипт постоянно выполняющимся

Во-первых, что делает данная директива и так написано в справке, ни к чему её копировать. Во-вторых, эта команда не нужна в данном коде вовсе. Комментируют же обычно тонкости алгоритма, которые могут быть не совсем понятны на первый взгляд.
Но я, когда говорил про аккуратность и понятность, имел в виду не совсем это. Сравните:

#If res := NCHITTEST()
RButton::
MButton:: MsgBox, % "Нажата " A_ThisHotkey " над " res
#If
Esc:: ExitApp

NCHITTEST()
{  ; из списка удалена позиция "CLIENT", соответствующая клиентской части окна
   static pos := [ "","CAPTION","SYSMENU","SIZE","MENU","HSCROLL","VSCROLL"
                  ,"MINBUTTON","MAXBUTTON","LEFT","RIGHT","TOP","TOPLEFT","TOPRIGHT"
                  ,"BOTTOM","BOTTOMLEFT","BOTTOMRIGHT","BORDER","OBJECT","CLOSE","HELP" ]
   CoordMode, Mouse
   MouseGetPos, X, Y, hWnd
   SendMessage, WM_NCHITTEST := 0x84,, X | Y<<16,, ahk_id %hWnd%
   Return pos[ErrorLevel]
}
Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

34

Re: AHK: Управление окнами мышкой

Уважаемый teadrinker, а не могли бы вы слегка подкорректировать ваш последний пример таким образом, чтобы в нем было несколько MsgBox, и отображали они сообщения не из переменных значений, а из постоянных. Например
MsgBox "Нажата ср.кнопка мыши над кнопкой свернуть"
Я, к своему стыду, пока не могу вникнуть куда мне вставить код, к примеру, делающий активное окно поверх всех окон при нажатии пр.кн.мыши над «развернуть»..
Читал сегодня мануалы, так и не смог понять есть ли в AHK такой оператор как CASE?? Или выбор действия придется множеством If–ов делать?

35

Re: AHK: Управление окнами мышкой

Для практического использования данного кода принцип такой:

#If res := NCHITTEST()
RButton::
   if (res = "MINBUTTON")  {
      MsgBox, Здесь действие при нажатии RButton над кнопкой «Свернуть»
   }
   else if (res = "CLOSE")  {
      MsgBox, Здесь действие при нажатии RButton над кнопкой «Закрыть»
   }
   Return
   
MButton::
   if (res = "MINBUTTON")  {
      MsgBox, Здесь действие при нажатии MButton над кнопкой «Свернуть»
   }
   else if (res = "CLOSE")  {
      MsgBox, Здесь действие при нажатии MButton над кнопкой «Закрыть»
   }
   Return
   
#If
Esc:: ExitApp

NCHITTEST()
{  ; из списка удалена позиция "CLIENT", соответствующая клиентской части окна
   static pos := [ "","CAPTION","SYSMENU","SIZE","MENU","HSCROLL","VSCROLL"
                  ,"MINBUTTON","MAXBUTTON","LEFT","RIGHT","TOP","TOPLEFT","TOPRIGHT"
                  ,"BOTTOM","BOTTOMLEFT","BOTTOMRIGHT","BORDER","OBJECT","CLOSE","HELP" ]
   CoordMode, Mouse
   MouseGetPos, X, Y, hWnd
   SendMessage, WM_NCHITTEST := 0x84,, X | Y<<16,, ahk_id %hWnd%
   Return pos[ErrorLevel]
}
Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

36

Re: AHK: Управление окнами мышкой

Если срабатывания над какими-то элементами окна не нужны, можно удалить эти элементы из списка, оставив вместо них пустые кавычки.

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

37 (изменено: Irbis, 2015-04-02 23:40:18)

Re: AHK: Управление окнами мышкой

Alexey244 пишет:

<...> Читал сегодня мануалы, так и не смог понять есть ли в AHK такой оператор как CASE?? Или выбор действия придется множеством If–ов делать?

Ну как тут не изобрести свое двухколесное средство передвижения, тем более teadrinker в двух вариантах кода приложил почти все комплектующие к нему.

#NoEnv
#If res := NCHITTEST()
RButton::
MButton::
   try Gosub %A_ThisHotkey%_%res%
#If
Return

RButton_MINBUTTON:
   MsgBox, Здесь действие при нажатии RButton над кнопкой «Свернуть»
Return
RButton_CLOSE:
   MsgBox, Здесь действие при нажатии RButton над кнопкой «Закрыть»
Return
MButton_MINBUTTON:
   MsgBox, Здесь действие при нажатии MButton над кнопкой «Свернуть»
Return
MButton_CLOSE:
   MsgBox, Здесь действие при нажатии MButton над кнопкой «Закрыть»
Return

Esc:: ExitApp

NCHITTEST()
{  ; из списка удалена позиция "CLIENT", соответствующая клиентской части окна
   static pos := [ "","CAPTION","SYSMENU","SIZE","MENU","HSCROLL","VSCROLL"
                  ,"MINBUTTON","MAXBUTTON","LEFT","RIGHT","TOP","TOPLEFT","TOPRIGHT"
                  ,"BOTTOM","BOTTOMLEFT","BOTTOMRIGHT","BORDER","OBJECT","CLOSE","HELP" ]
   CoordMode, Mouse
   MouseGetPos, X, Y, hWnd
   SendMessage, WM_NCHITTEST := 0x84,, X | Y<<16,, ahk_id %hWnd%
   Return pos[ErrorLevel]
}

Upd: Почему-то try Gosub <..> не срабатывает, будучи  записанным на одной строке с хоткеем, хотя формально это однострочная директива. Один Gosub срабатывает, а так - нет.

38

Re: AHK: Управление окнами мышкой

Ну, в идеале-то ещё нужно учитывать hWnd (или заголовок) окна, который функция могла бы возвращать через ByRef-параметр.

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

39 (изменено: Alexey244, 2015-04-03 00:04:36)

Re: AHK: Управление окнами мышкой

Еще раз всем спасибо за участие и отзывчивость. Пойду изобретать свое двухколесное средство. В планах у меня еще отслеживание позиции корсора на таких длинных элементах как заголовок окна  CAPTION и рамка ("LEFT","RIGHT","TOP" и "BOTTOM") и в зависимости от позиции делать разные действия.. Например менять прозрачность окна кликая пр.кн. по нижней границе и чемближе к правому углу окна тем более прозрачнее...
Но это я так, идеей делюсь и не призываю никого писать для меня готовый код.. Я и так чувствую что мое спасибо это слишком мало за эту помощь.. Надеюсь, что не мне одному пригодятся эти примеры.

40

Re: AHK: Управление окнами мышкой

Действительно, далеко не факт, что под курсором активно окно.
Можно и в глобальную переменную записывать HWND, но "это не наши методы" (с)

#NoEnv
#If res := NCHITTEST(id)
RButton::
MButton::
   WinGetTitle, Title, AHK_id %id%
   try Gosub %A_ThisHotkey%_%res%
#If
Return

RButton_MINBUTTON:
   MsgBox, Нажатие RButton над кнопкой «Свернуть»`n%Title%
Return
RButton_CLOSE:
   MsgBox, Нажатие RButton над кнопкой «Закрыть»`n%Title%
Return
MButton_MINBUTTON:
   MsgBox, Нажатие MButton над кнопкой «Свернуть»`n%Title%
Return
MButton_CLOSE:
   MsgBox, Нажатие MButton над кнопкой «Закрыть»`n%Title%
Return

Esc:: ExitApp

NCHITTEST(ByRef hWnd)
{  ; из списка удалена позиция "CLIENT", соответствующая клиентской части окна
   static pos := [ "","CAPTION","SYSMENU","SIZE","MENU","HSCROLL","VSCROLL"
                  ,"MINBUTTON","MAXBUTTON","LEFT","RIGHT","TOP","TOPLEFT","TOPRIGHT"
                  ,"BOTTOM","BOTTOMLEFT","BOTTOMRIGHT","BORDER","OBJECT","CLOSE","HELP" ]
   CoordMode, Mouse
   MouseGetPos, X, Y, hWnd
   SendMessage, WM_NCHITTEST := 0x84,, X | Y<<16,, ahk_id %hWnd%
   Return pos[ErrorLevel]
}

41

Re: AHK: Управление окнами мышкой

На nncron-е работало немного по другому, там в цикле отслеживались нужные клики мышкой, если клик был то этим кликом окно сразу делалось активным, посылался WM_NCHITTEST и уже дальше выбиралось нужное действие.. Но как я уже говорил глючило тоже регулярно.. Посмотрим как на AHK работать будет..

42

Re: AHK: Управление окнами мышкой

Добрый день.
Код работает, но у меня стоит Win10 DPI fix и, соответственно, 125% масштаб интерфейса.
Все клики приведённого выше скрипта смещены относительно кнопок на сколько-то пикселей (разное кол-во, в зависимости от близости к краю, вроде бы).
Может быть, кто-то знает, как скорректировать скрипт под измененный масштаб?
Возможно, есть встроенные функции WM на эту тему.
Поиском не удалось найти ничего похожего..
Заранее благодарю.