1

Тема: AHK: Одна горячая клавиша на два действия

Есть многокнопочная мышь. Скриптом сделано, чтобы кнопка мышки XButton1, открывала проводник, а на кнопку XButton2 - совершала события, которые совершала до этого кнопка XButton1. (ну, так вот надо).
Захотелось сделать так, чтобы при нажатии XButton2 над кнопкой "X" (Close) любого окна, это окно переносилось бы на другой моник.
Дак, вот вопрос друзья, как разделить эти события у кнопки XButton2?   То есть, как сделать, чтобы именно над "X" нажатие XButton2 приводило к одному действию, а в любом другом случае нажатие XButton2 выполняло другое действие.
Вот код (кусок с действием над кнопкой "Х" взят с этого форума уже не помню и где , остальное всё кривенько, ну, я и не мастер)


XButton1::Run ::{20d04fe0-3aea-1069-a2d8-08002b30309d} 

; Переместить активное окно на другой моник - click XButton2 на кнопке "крестик"
XButton2::
  CoordMode, Mouse, Screen
  MouseGetPos, mX, mY, Hwnd
  SendMessage, 0x84,, (mX & 0xFFFF)|(mY & 0xFFFF)<<16,, ahk_id %Hwnd%
  If ErrorLevel=20                               ; HTCLOSE
   move_window()
  else
  XButton2::XButton1  
Return

move_window()
{
WinGetPos, winx, winy,,, A
WinGet, oldWin,ID,A
WinActivate, A
WinGet, mm, MinMax, A
WinRestore, A
If winx+5 >= 0 
{
    mult=1
    Send , +#{Left}
}
else
{
    mult=-1
    Send , +#{Right}
}

if mm=1
    WinMaximize, A
}

Оно вроде все работает, но после того, как окно переместится на другой экран - оно не активно (и похоже активным становится всё что угодно, что ниже этого окна, а это иногда приводит к нажиманию кнопок там, что не есть хорошо), и, чтобы активировать окошко, нужно еще раз кликнуть XButton2, а иначе, как будто мешает что-то...

ЗЫ. Иногда руками показать легче, чем объяснить.
ЗЫ. Сначала я просто сделал второй скрипт и повесил его на сочетание !XButton2. Но при одновременной работе двух скриптов, получалось так, что сочетание !XButton2  отрабатывало, а простое нажатие XButton2 ни к чему не приводило, что для меня тоже не очень понятно. Мне казалось, что это же разные гор. клавиши, почему тогда, одно блочило другое?

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

2

Re: AHK: Одна горячая клавиша на два действия

Нужно чтобы по нажатию XButton2 происходило некое действие, но только при условии, что в этот момент курсор находится над кнопкой "X" (Close) любого окна?

3

Re: AHK: Одна горячая клавиша на два действия

ypppu, да.

4

Re: AHK: Одна горячая клавиша на два действия

Можно при нажатии кнопки мыши определять, какое окно находится под курсором. И по координатам определять, над какой кнопкой висел курсор. http://forum.script-coding.com/viewtopic.php?id=363 И если это был крестик, то ...

5

Re: AHK: Одна горячая клавиша на два действия

XButton2::
	Acc := Acc_ObjectFromPoint(Child)
	try name := Acc.accName(child)
	If (name == "Close")
		MsgBox
Return
Esc::ExitApp

Acc_Init() {
	Static	h
	If Not	h
		h:=DllCall("LoadLibrary","Str","oleacc","Ptr")
}
Acc_ObjectFromPoint(ByRef _idChild_ = "", x = "", y = "") {
	Acc_Init()
	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")
}

6

Re: AHK: Одна горячая клавиша на два действия

Только так смог заставить работать скрипт:

If (name ~= "Close|Закрыть")
Win10x64, AHK v1.1.37.01 (Unicode 64-bit) | AHK-Wiki | Переменные и выражения | RegEx101

7 (изменено: qsedftghk, 2020-09-10 00:18:37)

Re: AHK: Одна горячая клавиша на два действия

stealzy, скопипастил Ваш код, запустил - ничего не происходит. (Должен ведь MsgBox появиться, так?) Esc только работает. Ваш код для меня сложен в понимании, ибо  мой уровень знаний в области API, увы, ничтожен. Тут я - нуб нубом. Это если бы мне каждую строчку объяснили, что, да как, то, понятное дело, я б наверное понял, что происходит, но оно вам надо?

ypppu, вот как раз с той ветки я и брал кусочек кода, под себя только переделал:


XButton2::
  CoordMode, Mouse, Screen
  MouseGetPos, mX, mY, Hwnd
  SendMessage, 0x84,, (mX & 0xFFFF)|(mY & 0xFFFF)<<16,, ahk_id %Hwnd%
  If ErrorLevel=20                               ; HTCLOSE
   move_window()
  else
  XButton2::XButton1  
Return

Крестик таким макаром распознается очень даже хорошо и перемещается окошко на другой экран, но проблема, в том, что сразу же выполняется XButton2::XButton1, как будто оно не в else запихнуто, а просто следует далее по коду. Из-за чего активируется любое нижлежащее окно и в нем выполняется  XButton2::XButton1 (а это команда Back в проводнике).
Окно, которое переместилось на другой моник, становится неактивным. И, чтобы выбрать его (активировать) приходится еще раз щелкнуть XButton2. А иначе, хоть ущелкайся мышкой никакого эффекта, как будто мышка заблоченена над этим окном.
Вот я и не пойму почему это так происходит. Остальное все работает.

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


XButton1::Run ::{20d04fe0-3aea-1069-a2d8-08002b30309d} ; открывает проводник

XButton2::  ;показывает текст при нажатии на крестик
  CoordMode, Mouse, Screen
  MouseGetPos, mX, mY, Hwnd
  SendMessage, 0x84,, (mX & 0xFFFF)|(mY & 0xFFFF)<<16,, ahk_id %Hwnd%
  If ErrorLevel=20                               ; HTCLOSE
   MsgBox, Text ; показывает текст
  else
  XButton2::XButton1  ; выполняет команду BACK в проводнике или в браузере
Return

Откройте проводник с любой папкой, а еще лучше, зайти внутрь папки и попробуйте щелкните XButton2 над крестиком.

ЗЫ. Ах, да, я туплю... У мышки должны быть конечно не три кнопки, а чуть больше. (у меня их 6, две из них, как раз эти злополучные XButton1 и XButton2)
ЗЫЫ. В любом случае, спасибо ребзя, за участие в моей нелепой проблеме
ЗЫЫ. Увидел текст __Михаил_, уже после того, как накатал эту простыню завтра попробую, сегодня уже сил нет втыкать в экран

8

Re: AHK: Одна горячая клавиша на два действия

Не знаю зачем вам написали всё выше, по моему бесполезные советы, метод что вы нашли с HTCLOSE лучше.
И не знаю зачем у вас заморочки в move_window, у меня только Shift+Win+Left на двух мониторах отлично работают.


#If MouseUnderHTCLOSE()
XButton2:: 
	WinActivate
	Send, +#{Left} 
	Return 
#If

XButton2::
	MsgBox not HTCLOSE 
	Return

MouseUnderHTCLOSE() {
	CoordMode, Mouse, Screen
	MouseGetPos, mX, mY, Hwnd 
	WinExist("ahk_id" Hwnd)
	SendMessage, 0x84,, (mX & 0xFFFF)|(mY & 0xFFFF)<<16,, ahk_id %Hwnd% 
	Return ErrorLevel = 20  ; HTCLOSE
}

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

9 (изменено: qsedftghk, 2020-09-10 11:01:42)

Re: AHK: Одна горячая клавиша на два действия

serzh82saratov, вот оно, нашлось!
Вот эта конструкция


#If (условие)
...
#If

Избавила меня от всех глюков и теперь всё работает как надо. Спасибо. Я до этого не мог додуматься, ибо редко пользуюсь AutoHotkey
Вообщем код теперь выглядит так (ну, примерно так, немного там еще добавил всякой всячины, но это к делу не относится):


#If MouseUnderHTCLOSE()
XButton2:: 
	WinActivate
	Send, +#{Left} 
	Return 
#If

XButton2::XButton1
	
MouseUnderHTCLOSE() {
	CoordMode, Mouse, Screen
	MouseGetPos, mX, mY, Hwnd 
	WinExist("ahk_id" Hwnd)
	SendMessage, 0x84,, (mX & 0xFFFF)|(mY & 0xFFFF)<<16,, ahk_id %Hwnd% 
	Return ErrorLevel = 20  ; HTCLOSE
}

И сколько же мусора было первоначально...
Спасибо, ребзя, что не бросили. Всем хорошего дня.

10

Re: AHK: Одна горячая клавиша на два действия

Как сделать чтобы на кнопку 1(мне для игры) открыть и сесть в авто а потом тоже на 1 вылезти?

11

Re: AHK: Одна горячая клавиша на два действия

Andrei, сообщение не соответствует теме: нарушение п. 2.1 Правил. Создайте отдельную тему в соответствующем разделе.