Что нового

Блокировка контекстного меню, по нажатию правой кнопки мыши

reset86

Новичок
Сообщения
47
Репутация
0
При постоянной блокировки функций мыши, используя BlockInputEx.au3 (у меня нормально с мышкой вообще не работает) или MouseOnEvent.au3, курсор при перемещении ведет себя как в желе, я решил блокировать правую кнопку мыши только по нажатию, но у меня ничего не вышло. $GUI_EVENT_SECONDARYUP, $GUI_EVENT_SECONDARYDOWN не годится, так как надо блокировать не в GUI.

Код:
#include <MouseOnEvent.au3>
#include <Misc.au3>
Global $hWnd, $VAR1 = False, $VAR2 = True, $VAR3
; $hWnd - для окна

While 1

$VAR3 = _IsPressed("02")

If $VAR3 And Not $VAR1 Then
$VAR1 = True
$VAR2 = False
_MouseSetOnEvent($MOUSE_SECONDARYUP_EVENT, "_MouseSecondaryUp_Event", $hWnd, 1) ; С $MOUSE_SECONDARYDOWN _EVENT - только глючит курсор, но блокировки нет

ElseIf Not $VAR3 And Not $VAR2 Then ; Я так понял, это не работает, так как блокируется отжатие кнопки.
$VAR1 = False
$VAR2 = True
_MouseSetOnEvent($MOUSE_SECONDARYUP_EVENT)
EndIf

Sleep(10)
WEnd


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

Код:
#include <Misc.au3>

While 1

$VAR3 = _IsPressed("02")

If $VAR3 Then
Sleep(50)
Send("{ESC}")
Sleep(50)
Send("{ESC}")
EndIf

WEnd


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

Я уже задавал похожий вопрос но тут это не подходит. Первый код и есть аналог.
 
Автор
reset86

reset86

Новичок
Сообщения
47
Репутация
0
Re: Блокировка правой кнопки мыши (контекстного меню), по нажатию правой кнопки мыши

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

Код:
#NoTrayIcon
#include <WindowsConstants.au3>
#include <Misc.au3>
Global $bDown1 = False, $bUp1 = True, $IsPressed2, $Blokxz

While 1
$IsPressed2 = _IsPressed("02")
If $IsPressed2 And Not $bDown1 Then
$bDown1 = True
$bUp1 = False
_BlockkX()

ElseIf Not $IsPressed2 And Not $bUp1 Then
$bDown1 = False
$bUp1 = True
GUIDelete($Blokxz)
$aPos = MouseGetPos()
MouseMove(@DesktopWidth+1, -2, 0)
MouseClick("left")
MouseMove($aPos[0] ,$aPos[1], 0)
EndIf

If _IsPressed("10") Then ; Выход Shift
Exit
EndIf
Sleep(10)
WEnd

Func _BlockkX()
$aPos = MouseGetPos()
$Blokxz = GUICreate("", 100, 100, $aPos[0]-50 ,$aPos[1]-50 , $WS_POPUP, BitOR($WS_EX_TOPMOST, $WS_EX_LAYERED, $WS_EX_TOOLWINDOW))
GUISetState()
Sleep(10)
EndFunc


Побывал использовать WinAPI (_WinAPI_SetWindowsHookEx), глючит курсор. Наткнулся на hook.dll, но как блокировать с ее помощью, так и не понял.
 

InnI

AutoIT Гуру
Сообщения
4,912
Репутация
1,429
reset86
блокировать появление контекстного меню
"Блокирует" всплывающее меню по нажатию ПКМ в блокноте
Код:
#include <Misc.au3>

Opt("WinWaitDelay", 0)

Do
  If _IsPressed("02") And WinActive("[class:Notepad]") Then WinClose(WinWait("[class:#32768]"))
Until GUIGetMsg() Or _IsPressed("10")
 
Автор
reset86

reset86

Новичок
Сообщения
47
Репутация
0
InnI, работает только в explorer и приложениях windows, например в chrome не работает.
 
Автор
reset86

reset86

Новичок
Сообщения
47
Репутация
0
Да, судя по всему, это единственный нормальный способ. Прописать все классы, которые надо блокировать.
Просто с Au3Info нереально отловить контекстное меню, а я пользовался только им.
Сегодня наткнулся на вашу UDF UIAutomate, в ней лежит Inspect_W10.exe и он как раз хорошо отлавливает класс контекстного меню.
Спасибо за помощь.

OffTopic:
Я не селен в нормальном программирование, всю жизнь сайты делал, да ПЛК программировал на языке LD. Так что прошу прощение, за свои глупые вопросы и не понятные и дикие "находки-задумки".
 

InnI

AutoIT Гуру
Сообщения
4,912
Репутация
1,429
reset86
с Au3Info нереально отловить контекстное меню
Народное корейское выражение: "Вы не любите собак? Просто вы не умеете их готовить." ;)
В настройках Au3Info есть опция в меню "Options - Freeze". Если её отключить, то сможете получать информацию и по всплывающим меню. Только эту информацию сложно "зафиксировать", но непосредственно при наведении курсора прочитать можно.

в ней лежит Inspect_W10.exe
Поясняю ещё раз, теперь лично для вас. Inspect - это утилита от Microsoft. Она работает по другому принципу по отношению к Au3Info. Но, если вам нужно отлавливать всплывающие окна, попробуйте wInformer. Я её специально сделал для подобных случаев.

программировал на языке LD
Вот видите, вы на нём программировали, а я даже не слышал о таком. Так что, это ещё вопрос, кто из нас "программист" :beer:
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,671
Репутация
2,481
Код:
#include <MouseOnEvent.au3>

HotKeySet('{ESC}', '_Quit')

Global $hWnd = WinGetHandle('')

_MouseSetOnEvent($MOUSE_SECONDARYDOWN_EVENT, '_MouseSecondary_Event', $hWnd)
_MouseSetOnEvent($MOUSE_SECONDARYUP_EVENT, '_MouseSecondary_Event', $hWnd)

While 1
	Sleep(10)
WEnd

Func _Quit()
	Exit
EndFunc

Func _MouseSecondary_Event($iEvent)
	Return $MOE_BLOCKDEFPROC
EndFunc
 
A

Alofa

Гость
OffTopic:
CreatoR
CreatoR сказал(а):
... При указании события $MOUSE_PRIMARYDOWN_EVENT и $MOUSE_SECONDARYDOWN_EVENT,
событие $MOUSE_PRIMARYDBLCLK_EVENT и соответственно $MOUSE_SECONDARYDBLCLK_EVENT также устанавливается принудительно...

Не подскажите, зачем в коде именно так:
Код:
Return $MOE_BLOCKDEFPROC

(сам сейчас с телефона)


Добавлено:
Сообщение автоматически объединено:

Добрался до компа - все понял.
ChangLog:
v2.3 [04.11.2015]
* Added user public constants $MOE_RUNDEFPROC and $MOE_BLOCKDEFPROC, to use in Event function to define current event blocking.
Global Const $MOE_BLOCKDEFPROC = 1


 
Верх