Что нового

Если зажата клавиша мыши, то ... или отключить drug and drop в windows

Сообщения
30
Репутация
-1
Нужно отследить зажатие (нажали на кнопку мыши и не отпускаете её) ЛКМ по времени, например если она зажата больше 250 ms, то отпустить ее принудительно. И желательно, чтобы скрипт работал только в проводнике windows.

Или что типа if MouseClickDrag then stop this shit action
 

CreatoR

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

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

Global $iWait_MS = 250
Global $sTitle = '[CLASS:CabinetWClass]'

_MouseSetOnEvent($MOUSE_PRIMARYDOWN_EVENT, '_PD_Event')

While Sleep(100)
WEnd

Func _Exit()
	Exit
EndFunc

Func _PD_Event($iEvent)
	If WinActive($sTitle) Then
		AdlibRegister('_MouseRelease', $iWait_MS)
	EndIf
EndFunc

Func _MouseRelease()
	AdlibUnRegister('_MouseRelease')
	MouseUp('Main')
EndFunc


MouseOnEvent
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,671
Репутация
2,481
Или так, с использованием _IsPressed:

Код:
#include <Misc.au3>

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

Global $iTimer
Global $iWait_MS = 250

While 1
	If WinActive('[CLASS:CabinetWClass]') Then
		If $iTimer = 0 And _IsPressed('01') Then
			$iTimer = TimerInit()
		ElseIf $iTimer <> 0 And TimerDiff($iTimer) >= $iWait_MS Then
			MouseUp('Main')
			$iTimer = 0
		EndIf
	EndIf
	
	Sleep(10)
WEnd

Func _Exit()
	Exit
EndFunc
 
Автор
B
Сообщения
30
Репутация
-1
Большое спасибо!
Есть еще вопрос, наверно совсем глупый, но никак не пойму, как можно дописать еще некоторые классы, например [CLASS:blum:rogman]? И видимо перемещение окон тоже останется недоступным? :smile:
 

alex33

Скриптер
Сообщения
1,457
Репутация
186
bradu [?]
Есть еще вопрос, наверно совсем глупый, но никак не пойму, как можно дописать еще некоторые классы, например [CLASS:blum:rogman]?
Код:
If WinActive('[REGEXPCLASS:(CabinetWClass|Progman)]') Then
 
Автор
B
Сообщения
30
Репутация
-1
Всем спасибо, но все равно пришлось отказаться от winactive, т.к. если активировать мышью рабочий стол например, то в окне папки скрипт не работает. Ну и в таком случае так же придется прописывать все возможные окна, что не гуд.
 

CreatoR

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

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

Global $iWait_MS = 250
Global $aTitle = StringSplit('CabinetWClass|Progman|WorkerW', '|')

_MouseSetOnEvent($MOUSE_PRIMARYDOWN_EVENT, '_PD_Event')

While Sleep(100)
WEnd

Func _Exit()
    Exit
EndFunc

Func _PD_Event($iEvent)
	Local $tPoint = _WinAPI_GetMousePos()
	Local $hWFP = _WinAPI_WindowFromPoint($tPoint)
	Local $hAncestor = _WinAPI_GetAncestor($hWFP, $GA_ROOTOWNER)
	
    If _ArraySearch($aTitle, _WinAPI_GetClassName($hAncestor)) <> -1 Then
        AdlibRegister('_MouseRelease', $iWait_MS)
    EndIf
EndFunc

Func _MouseRelease()
    AdlibUnRegister('_MouseRelease')
    MouseUp('Main')
EndFunc
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
bradu,
Можно сделать примерно так.
Код:
#include <GuiMenu.au3>
#include <WindowsConstants.au3>
#include <Timers.au3>

Opt('MustDeclareVars', 1)
Opt('TrayAutoPause', 0)

Global $hLowLevelMouseProc, $hMod, $hHookEx, $fRButtonDown, $iIDTimer, $iCount, $tPoint, $fLButtonDown

$hLowLevelMouseProc = DllCallbackRegister('_LowLevelMouseProc', 'int', 'int;wparam;lparam')
If Not $hLowLevelMouseProc Then Exit 1
$hMod = _WinAPI_GetModuleHandle('')
If Not $hMod Then Exit 2
$tPoint = DllStructCreate($tagPOINT)
$hHookEx = _WinAPI_SetWindowsHookEx($WH_MOUSE_LL, DllCallbackGetPtr($hLowLevelMouseProc), $hMod)
If Not $hHookEx Then Exit 3
$hMod = 0
OnAutoItExitRegister('_OnExit')

HotKeySet('{ESC}', '_Exit')
While 1
	Sleep(1000)
WEnd

Func _LowLevelMouseProc($iCode, $wParam, $lParam)
	If $iCode < 0 Then
		Return _WinAPI_CallNextHookEx($hHookEx, $iCode, $wParam, $lParam)
	EndIf
	Switch $wParam
		Case $WM_MOUSEMOVE
			If $fLButtonDown Then
				If _DisableStart() Then
;~ 					здесь, по идее, надо еще проверять, есть ли выделенные документы(папки)
					MouseUp('Main')
				EndIf
				$fLButtonDown = False
			EndIf
		Case $WM_LBUTTONDOWN
			$fLButtonDown = True
		Case $WM_LBUTTONUP
			$fLButtonDown = False
		Case $WM_RBUTTONDOWN
			$fRButtonDown = _DisableStart()
		Case $WM_RBUTTONUP
			If $fRButtonDown Then
				$iIDTimer = _Timer_SetTimer(0, 50, '_Disable')
				$fRButtonDown = False
			EndIf
	EndSwitch
	Return _WinAPI_CallNextHookEx($hHookEx, $iCode, $wParam, $lParam)
EndFunc   ;==>_LowLevelMouseProc

Func _Disable($hWnd, $Msg, $iIDTimer, $dwTime)
	Local $h_Wnd, $h_Menu, $s_Txt

	$iCount += 1
	If $iCount = 3 Then
		_Timer_KillTimer(0, $iIDTimer)
		$iIDTimer = 0
		$iCount = 0
		Return
	EndIf
	$h_Wnd = WinGetHandle('[CLASS:#32768]')
	If Not $h_Wnd Then Return
	$h_Menu = _SendMessage($h_Wnd, $MN_GETHMENU)
	If Not $h_Menu Then Return
	For $i = 0 To _GUICtrlMenu_GetItemCount($h_Menu) - 1
		$s_Txt = StringReplace(_GUICtrlMenu_GetItemText($h_Menu, $i), '&', '')
;~ 		ConsoleWrite('$s_Txt: ' & $s_Txt & @LF)
		If StringRegExp($s_Txt, '^(Отправить|Вырезать|Копировать|Удалить|Переименовать)$') Then
			_GUICtrlMenu_SetItemEnabled($h_Menu, $i, False)
;~ 			ConsoleWrite('Disable -> ' & $s_Txt & @LF)
		EndIf
	Next
	_Timer_KillTimer(0, $iIDTimer)
	$iIDTimer = 0
	$iCount = 0
EndFunc   ;==>_Disable

Func _DisableStart()
	Local $h_Hwd, $h_Win, $s_Class

	If Not _WinAPI_GetCursorPos($tPoint) Then Return 0
	$h_Hwd = _WinAPI_WindowFromPoint($tPoint)
	If Not $h_Hwd Then Return 0
	$h_Win = _WinAPI_GetAncestor($h_Hwd, $GA_ROOT)
	If Not $h_Win Then Return 0
	IF $h_Win = $h_Hwd Then Return 0
	$s_Class = _WinAPI_GetClassName($h_Win)
;~ 	ConsoleWrite('$s_Class: ' & $s_Class & @LF)
	Return StringRegExp($s_Class, '^(Progman|CabinetWClass|ExploreWClass)$');ExploreWClass - WinXP
EndFunc   ;==>_DisableStart

Func _WinAPI_GetCursorPos(ByRef $t_Point)
	Local $a_Res = DllCall('user32.dll', 'int', 'GetCursorPos', 'struct*', $t_Point)
	If (@error) Or (Not $a_Res[0]) Then Return 0
	Return 1
EndFunc   ;==>_WinAPI_GetCursorPos

Func _OnExit()
	If $iIDTimer Then _Timer_KillTimer(0, $iIDTimer)
	_WinAPI_UnhookWindowsHookEx($hHookEx)
	DllCallbackFree($hLowLevelMouseProc)
EndFunc   ;==>_OnExit

Func _Exit()
	Exit
EndFunc   ;==>_Exit
Скрипт дезактивирует пункты меню Отправить, Вырезать, Копировать, Удалить, Переименовать и поднимает левую кнопку мыши, если перетаскивать файлы.
 
Автор
B
Сообщения
30
Репутация
-1
CreatoR, у меня на этом скрипте мышь подтормаживает, для себя я выбрал вариант без WinActive с _IsPressed.

madmasles, тут ничего из описанного не сработало, только мышь тормозила. Мне теперь осталось только деактивировать переименование, но файлы наверно все равно можно будет переименовывать двумя нажатиями ЛКМ.

И такой вопрос, как соединить несколько скриптов в один?
Код:
#include <Clipboard.au3>
	  
	$sProcessString = IniRead(@ScriptDir & '\Settings.ini', 'Process', 'ProcessString', 'mspaint.exe')
	  
	While 1
	    Sleep(100)
	    $Memo = _ClipBoard_GetData()
	    If $Memo = 0 And @extended = 0 Then
	        $pid = WinGetProcess('[ACTIVE]', '')
	        $sName = _ProcessName($pid)
	        If Not StringInStr($sProcessString, $sName) Then ClipPut('')
	    EndIf
	WEnd
	  
	Func _ProcessName($pid)
	    If IsString($pid) Then $pid = ProcessExists($pid)
	    If Not IsNumber($pid) Then Return -1
	    $proc = ProcessList()
	    For $p = 1 To $proc[0][0]
	        If $proc[$p][1] = $pid Then Return $proc[$p][0]
	    Next
	    Return -1
	EndFunc   ;==>_ProcessName

Код:
#include <Misc.au3>

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

Global $iTimer
Global $iWait_MS = 27

While 1
  ;  If WinActive('[CLASS:CabinetWClass]') Then
        If $iTimer = 0 And _IsPressed('01') Then
            $iTimer = TimerInit()
        ElseIf $iTimer <> 0 And TimerDiff($iTimer) >= $iWait_MS Then
            MouseUp('Main')
            $iTimer = 0
    ;    EndIf
    EndIf
    
    Sleep(10)
WEnd

Func _Exit()
    Exit
EndFunc

Код:
While 1
	WinClose("[TITLE:Подтверждение удаления;CLASS:#32770]", "")
	ControlClick("Предупреждение диспетчера задач", "", "[CLASS:Button; INSTANCE:2]")
	Sleep(2)
WEnd
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
bradu [?]
тут ничего из описанного не сработало, только мышь тормозила.
У меня на Win7x32 с русским языком все прекрасно работает.
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
bradu [?]
Проверил на русской WinХРх32 - тоже все работает, только, чтобы увидеть, что пункты меню дезактивированы, у меня надо навести на эти пункты мышку.
 
Автор
B
Сообщения
30
Репутация
-1
madmasles сказал(а):
bradu [?]
Проверил на русской WinХРх32 - тоже все работает, только, чтобы увидеть, что пункты меню дезактивированы, у меня надо навести на эти пункты мышку.
Все копируется и создается, мышь не отпускается, но все равно спасибо за старания.
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,671
Репутация
2,481
bradu [?]
на этом скрипте мышь подтормаживает
А если так:

Код:
#include 'MouseOnEvent.au3'
#include <WinAPI.au3>
#include <Array.au3>

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

Global $bPD_Event = False
Global $iWait_MS = 250
Global $aTitle = StringSplit('CabinetWClass|Progman|WorkerW', '|')

_MouseSetOnEvent($MOUSE_PRIMARYDOWN_EVENT, '_PD_Event')

While Sleep(10)
	If $bPD_Event Then
		$bPD_Event = False
		
		Local $tPoint = _WinAPI_GetMousePos()
		Local $hWFP = _WinAPI_WindowFromPoint($tPoint)
		Local $hAncestor = _WinAPI_GetAncestor($hWFP, $GA_ROOTOWNER)
		
		If _ArraySearch($aTitle, _WinAPI_GetClassName($hAncestor)) <> -1 Then
			AdlibRegister('_MouseRelease', $iWait_MS)
		EndIf
	EndIf
WEnd

Func _Exit()
    Exit
EndFunc

Func _PD_Event($iEvent)
	$bPD_Event = True
EndFunc

Func _MouseRelease()
    AdlibUnRegister('_MouseRelease')
    MouseUp('Main')
EndFunc


:scratch:
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,671
Репутация
2,481
Ну или так:

Код:
#include <Array.au3>
#include <Misc.au3>
#include <WinAPI.au3>
#include <WindowsConstants.au3>

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

Global $iWait_MS = 250
Global $aTitle = StringSplit('CabinetWClass|Progman|WorkerW', '|')

While Sleep(10)
	If _IsPressed(1) Then
		Sleep($iWait_MS)
		
		If _IsPressed(1) Then
			Local $tPoint = _WinAPI_GetMousePos()
			Local $hWFP = _WinAPI_WindowFromPoint($tPoint)
			Local $hAncestor = _WinAPI_GetAncestor($hWFP, $GA_ROOTOWNER)
			
			If _ArraySearch($aTitle, _WinAPI_GetClassName($hAncestor)) <> -1 Then
				MouseUp('Main')
			EndIf
		EndIf
	EndIf
WEnd

Func _Exit()
    Exit
EndFunc
 
Автор
B
Сообщения
30
Репутация
-1
CreatoR сказал(а):
Ну или так:

Код:
#include <Array.au3>
#include <Misc.au3>
#include <WinAPI.au3>
#include <WindowsConstants.au3>

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

Global $iWait_MS = 250
Global $aTitle = StringSplit('CabinetWClass|Progman|WorkerW', '|')

While Sleep(10)
	If _IsPressed(1) Then
		Sleep($iWait_MS)
		
		If _IsPressed(1) Then
			Local $tPoint = _WinAPI_GetMousePos()
			Local $hWFP = _WinAPI_WindowFromPoint($tPoint)
			Local $hAncestor = _WinAPI_GetAncestor($hWFP, $GA_ROOTOWNER)
			
			If _ArraySearch($aTitle, _WinAPI_GetClassName($hAncestor)) <> -1 Then
				MouseUp('Main')
			EndIf
		EndIf
	EndIf
WEnd

Func _Exit()
    Exit
EndFunc

Вот этот работает, а предыдущий так же как и раньше.


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

madmasles сказал(а):
bradu [?]
Проверил на русской WinХРх32 - тоже все работает, только, чтобы увидеть, что пункты меню дезактивированы, у меня надо навести на эти пункты мышку.
на другой версии autoit заработал :smile:
 
Верх