1 (изменено: D.Man, 2014-04-11 18:34:32)

Тема: AHK: Заблокировать клики мышью в определенных координатах окна

Всем, привет!

Такой вопрос. Есть необходимость временно блокировать возможность клика мышью в диапазоне определенных координат окна. Это оптимальный вариант, но совершенно не приходит в голову как его возможно реализовать. Думал о команде Winset TransColor, чтобы клики проходили сквозь окно, но цвет фона неоднородный. Как сделать проницаемым для кликов весь участок в голову не приходит.

(Нужно это для того, чтобы временно блокировались контролы. Window spy их не показывает.)

Ну худой конец, устроило бы даже простое блокирование всего окна по команде Winset Disable,, ... . Беда только в том, что после блокирования окна нужной программы, по команде Winset Enable,, ..., оно не разблокируется. Команда не дает вообще никакого эффекта. (Проверял синтаксис на блокноте, на нем все блокируется и разблокируется).

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

2

Re: AHK: Заблокировать клики мышью в определенных координатах окна

Вроде всё просто. На щелчок ЛКМ ставим проверку: послать щелчок ЛКМ только если курсор не находится в определённом диапазоне координат.

3 (изменено: D.Man, 2014-04-11 20:43:02)

Re: AHK: Заблокировать клики мышью в определенных координатах окна

ypppu пишет:

Вроде всё просто. На щелчок ЛКМ ставим проверку: послать щелчок ЛКМ только если курсор не находится в определённом диапазоне координат.

Тогда другой вопрос, как задать этот диапазон? Сорри, я нуб в этих делах. Пользуюсь тем, что отложилось в голове на уроках информатики

Можно какой-нибудь пример? Или ссылку на соответствующую команду.

4 (изменено: ypppu, 2014-04-12 11:08:54)

Re: AHK: Заблокировать клики мышью в определенных координатах окна

Как-нибудь так.

x1 := 200
y1 := 200
x2 := 300
y2 := 300

LButton::
MouseGetPos, x, y
IF ((x<x1) OR (x>x2)) OR ((y<y1) OR (y>y2))
Send, {LButton down}
Return

LButton Up:: Send, {LButton up}

5

Re: AHK: Заблокировать клики мышью в определенных координатах окна

ypppu пишет:

Как-нибудь так.

Нет, так как раз не надо. Попробуй запустить этот код и перетащить что-нибудь мышью.

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

6 (изменено: Irbis, 2014-04-11 23:36:22)

Re: AHK: Заблокировать клики мышью в определенных координатах окна

Такой вариант:

C := 0
Return
#LButton::
C++
WinGetTitle, %C%t, A
MouseGetPos, %C%X0, %C%Y0
KeyWait, LButton
MouseGetPos, %C%X1, %C%Y1
Return

*LButton::
WinGetActiveTitle, ATitle
Loop % C
{
   MouseGetPos, X, Y
   if (X > %A_Index%X0)&&(X < %A_Index%X1)
    &&(Y > %A_Index%Y0)&&(Y < %A_Index%Y1)
    &&(ATitle = %A_Index%t)
      Return
}
Click D
KeyWait, LButton
Click U
Return

Комбинацией Win+ЛКМ выделяем первую прямоугольную область, потом вторую и т.д. Заголовок окна имеет значение )). Пример рабочий, но отсутствует foolproof чуть менее чем полностью - можно выделить прямоугольник над неактивным окном, или начать выделять над одним окном, а отпустить ЛКМ над другим - результат может быть неожиданным.

7

Re: AHK: Заблокировать клики мышью в определенных координатах окна

Все понял. Спасибо всем за примеры и комментарии.

8

Re: AHK: Заблокировать клики мышью в определенных координатах окна

Дополнил свой пример.

9

Re: AHK: Заблокировать клики мышью в определенных координатах окна


Global x1 := 0, y1 := 0, x2 := 300, y2 := 300

#IF needcoord()
LButton::Return
#IF

needcoord() {
    MouseGetPos, x, y
    if !(x < x1 || x > x2 || y < y1 || y > y2)
        Return 1 
}
По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

10 (изменено: D.Man, 2014-04-15 15:53:21)

Re: AHK: Заблокировать клики мышью в определенных координатах окна

Что такое?

needcoord()

11

Re: AHK: Заблокировать клики мышью в определенных координатах окна

Функция проверки координат.

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

12 (изменено: D.Man, 2014-04-15 16:18:25)

Re: AHK: Заблокировать клики мышью в определенных координатах окна

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

Суть такова. Нужно, по определенным условиям, блокировать на несколько секунд возможность кликов мышью в определенном диапазоне координат.

Условия: в 2-х точка окна цвета пикселов приобретают определенные значения. Код, условно:



Begin:

Loop

PixelGetColor FM, 555, 666 
PixelGetColor BM, 777, 888

if ( FM = ... ) AND (BM = ... )
       goto BlockMouse 

... ; код (горячие клавиши, в основном)

return


BlockMouse :   ; подпрограмма блочащая клики

...

Goto Begin

Насколько адекватен примерный фрагмент кода?

И как можно задать время блокирования кликов?

13

Re: AHK: Заблокировать клики мышью в определенных координатах окна

serzh82saratov пишет:

Функция проверки координат.

понятно, спс

14 (изменено: serzh82saratov, 2014-04-15 16:41:33)

Re: AHK: Заблокировать клики мышью в определенных координатах окна

Теоретически, примерно так:


Global x1 := 0, y1 := 0, x2 := 300, y2 := 300, time := A_TickCount - 3100

#IF block()
LButton::Return
#IF

block() { 
    if (A_TickCount-time < 3000)
        Return 1
    MouseGetPos, x, y
    PixelGetColor FM, 555, 666 
    PixelGetColor BM, 777, 888
    if (!(x < x1 || x > x2 || y < y1 || y > y2) && (BM = 0x3A2521 && FM = 0xFFFFFF) && (time := A_TickCount))
        Return 1 
}

сам не проверял.

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

15

Re: AHK: Заблокировать клики мышью в определенных координатах окна

Global x1 := 0, y1 := 0, x2 := 300, y2 := 300

#IF needcoord()
LButton::Return
#IF

needcoord() {
    MouseGetPos, x, y
    if !(x < x1 || x > x2 || y < y1 || y > y2)
        Return 1 
}

Сюда можно вставить SendInput {F1}{F1} , а затем Return 1 (или блок нажатия ЛКМ)?

16

Re: AHK: Заблокировать клики мышью в определенных координатах окна

Условие в #if должно быть быстрым, оно выполняется во время callback хука, нет ничего хуже чем зависшая callback процедура.

Если SendInput {F1}{F1} нужно посылать при каждом клике - просто измени Lbutton::

17 (изменено: Странникх, 2014-04-16 22:12:31)

Re: AHK: Заблокировать клики мышью в определенных координатах окна

Тогда запускаемая клавиша не будет LButton или я не так уловил вашу мысль?

18

Re: AHK: Заблокировать клики мышью в определенных координатах окна

Спасибо за ответы, как появится время, буду разбираться.

19

Re: AHK: Заблокировать клики мышью в определенных координатах окна

Ругается на needcoord()

20

Re: AHK: Заблокировать клики мышью в определенных координатах окна

Вот так:

; блокировка ЛКМ в определённом участке экрана:
   
LButton::
MouseGetPos, x, y
IF ((x<0) OR (x>300)) OR ((y<0) OR (y>333))
Send, {LButton down}
Return

LButton Up:: Send, {LButton up} ; обязательно, иначе мышь не отжимается

работает.
А как сделать по условию

IfWinActive, [

?
Вот так:

  IfWinActive, [
{
   LButton::
MouseGetPos, x, y
IF ((x<0) OR (x>300)) OR ((y<0) OR (y>333))
Send, {LButton down}
Return

LButton Up:: Send, {LButton up} ; обязательно, иначе мышь не отжимается
}
Return

ругается.

21

Re: AHK: Заблокировать клики мышью в определенных координатах окна

AHK: Отменить нажатие ЛКМ

Возможно ли отменять нажатие левой кнопки мыши в определенной области экрана? Или переназначить на нажатие, например правой кнопки мыши.

22

Re: AHK: Заблокировать клики мышью в определенных координатах окна

vkvolk пишет:

Возможно ли отменять нажатие левой кнопки мыши в определенной области экрана? Или переназначить на нажатие, например правой кнопки мыши.

CoordMode, Mouse, Screen
IfPos(x1,y1,x2,y2){
MouseGetPos xm,ym
return ((xm >= x1) and (xm <= x2)) and ((ym >= y1) and (ym <= y2))
}

#IF IfPos(0,0,200,200)
LButton::return

#IF IfPos(A_ScreenWidth-200,0    ,A_ScreenWidth,200)
LButton::RButton

#if

В левом верхнем углу отменяет левую кнопку мыши, в правом углу заменяет на правую.

23

Re: AHK: Заблокировать клики мышью в определенных координатах окна

yalanne пишет:
return ((xm >= x1) and (xm <= x2)) and ((ym >= y1) and (ym <= y2))

Здесь скобки не нужны.

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

24

Re: AHK: Заблокировать клики мышью в определенных координатах окна

Ну да не нужны просто для себя пометил где x, а где y.

25

Re: AHK: Заблокировать клики мышью в определенных координатах окна

А так не видно разве?

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