Что нового

[Мышь, клавиатура] Перехват и отмена кликов мыши

x8bit

Новичок
Сообщения
2
Репутация
0
Суть проблемы: мышка начала делать двойные-тройные клики левой кнопкой и средней при однократном нажатии. Вот думаю как бы эти клики отфильтровать и убрать лишние клики. Как это можно решить с помощью autoit ?
 

edyapd

Осваивающий
Сообщения
380
Репутация
30
Re: Перехват и отмена кликов мыши

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

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5 379
Репутация
2 712
Re: Перехват и отмена кликов мыши

Вообще, есть уже готовая утилита, ищите как "Mouse Double Click Fix". Можно написать и на AutoIt, что-то типа этого

Код:
#Include <WinAPI.au3>

#NoTrayIcon

Opt('TrayOnEventMode', 1)
Opt('TrayMenuMode', 3)

Global $Timer = 0

$hDll = DllCallbackRegister('_MouseProc', 'lresult', 'int;wparam;lparam')
$pDll = DllCallbackGetPtr($hDll)
$hMouseProc = _WinAPI_SetWindowsHookEx($WH_MOUSE_LL, $pDll, _WinAPI_GetModuleHandle(0), 0)
If Not $hMouseProc Then
	Exit 1
EndIf

OnAutoItExitRegister('_AutoItExit')

TrayItemSetOnEvent(TrayCreateItem('Exit'), '_Exit')
TraySetClick(8)
If Not @compiled Then
	TraySetIcon(@ScriptDir & '\Mouse.ico')
Else
	TraySetIcon(@ScriptFullPath)
EndIf
TraySetToolTip('LBMouseFix')

While 1
	Sleep(1000)
WEnd

Func _Exit()
	Exit 0
EndFunc   ;==>_Exit

Func _MouseProc($iCode, $wParam, $lParam)

	If $iCode > -1 Then
		Switch $wParam
			Case 0x0201 ; $WM_LBUTTONDOWN
				If ($Timer) And (TimerDiff($Timer) < 20) Then
					$Timer = 0
					Return -1
				EndIf
			Case 0x0202 ; $WM_LBUTTONUP
				$Timer = TimerInit()
			Case Else

		EndSwitch
	EndIf
	Return _WinAPI_CallNextHookEx(0, $iCode, $wParam, $lParam)
EndFunc   ;==>_MouseProc

Func _AutoItExit()
	_WinAPI_UnhookWindowsHookEx($hMouseProc)
EndFunc   ;==>_AutoItExit


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

Но несмотря на все эти грабли, я рекомендую первым делом разобрать мышь и капнуть капельку медицинского спирта на лапку нерабочего микроконтакта (белая выпуклая полоска, расположенная на черном корпусе элемента), а затем многократно пощелкать, чтобы спирт проник внутрь и, возможно, прочистил контакты. Если это не поможет (50%), то можно заменить микроконтакт на аналогичный, взятый из другой мыши, или, например, с боковой или средней кнопки, т.к. они мало используются. Только нужно учесть, что в зависимости от особенностей конструкции мыши, микроконтакты могут иметь разное усилие нажатия. Если руки растут из очень правильного места, то есть вариант разобрать микроконтакт и прочистить медные контакты вручную. Ну а так, покупайте новую мышь.


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

edyapd сказал(а):
А если захотите сделать двойной клик, то чего будете делать?
Двойной клик от повторного нажатия фильтруется временем повтора. Например, за 20 мс вы как бы не старались, но все равно не сможете сделать двойной клик. Если мне память не изменяет, то у меня получалось делать двойной клик примерно за 50 мс (время между нажатиями). При механической неисправности микроконтакта это время как правило составляет 5-10 мс.
 
Автор
X

x8bit

Новичок
Сообщения
2
Репутация
0
Re: Перехват и отмена кликов мыши

Спасибо за содержательный ответ. Механику можно лечить но это на короткий промежуток времени хватает и все равно иногда будут проскакивать двойные клики, у меня даже на новых мышах такая проблема наблюдалась.
Делать программу на autoit наверное не лучшее решение я так понял...
Поискал что можно сделать на C# и нашел интересную библиотеку _http://globalmousekeyhook.codeplex.com/
 

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5 379
Репутация
2 712
Re: Перехват и отмена кликов мыши

Да перепаяйте вы микрики и нет проблем. Кстати, часто двойной клик лечится ограничением глубины нажатия контакта. Другими словами нужно наклеить небольшие кусоки бумаги вокруг белого контакта, чтобы он не утапливался глубоко в корпус. В любом случае, двойной клик - это 99% грязь на контактах. А вот случайно это сделано или преднамеренно, это другой вопрос. Если рассматривать мышки 10-летней давности (времен MX-300), то подобные поломки возникали на порядок реже.
 
Верх