Что нового

Запрет переименования файлов по клику в проводнике

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,671
Репутация
2,481
Нужен надёжный метод запрета переименования файлов по клику в проводнике.
Речь идёт о появлений поля Input при клике на выделенном файле в Explorer'е.

Всякие MouseClick/Move/Up/ESC прошу не предлагать.
 

firex

AutoIT Гуру
Сообщения
943
Репутация
208
CreatoR
Только написание DLL, и никак иначе. Этот аспект создан и контролируется исключительно Explorer'ом, что само по себе логично.
 

InnI

AutoIT Гуру
Сообщения
4,912
Репутация
1,429
Код:
#include <WinAPI.au3>

Opt("WinWaitDelay", 0)

While Sleep(10)
  $sCtrl = ControlGetFocus("")
  If StringInStr($sCtrl, "Edit") Then
    $hWnd = ControlGetHandle("", "", $sCtrl)
    If _WinAPI_GetClassName(_WinAPI_GetParent($hWnd)) = "CtrlNotifySink" Then WinClose($hWnd)
  EndIf
WEnd
 
Автор
CreatoR

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,671
Репутация
2,481
InnI
Вот так наверно будет правильнее (для рабочего стола тоже):

Код:
#include <WinAPI.au3>
#include <APIConstants.au3>

Opt("WinWaitDelay", 0)

While Sleep(10)
	$sCtrl = ControlGetFocus("")
	
	If StringInStr($sCtrl, "Edit") Then
		$hWnd = ControlGetHandle("", "", $sCtrl)
		$sClass = _WinAPI_GetClassName(_WinAPI_GetAncestor($hWnd, $GA_ROOT))
		
		If StringRegExp($sClass, "^(CabinetWClass|Progman|WorkerW)$") Then
			WinClose($hWnd)
		EndIf
	EndIf
WEnd


Но это не совсем то, нужно более надёжно это делать.
 

InnI

AutoIT Гуру
Сообщения
4,912
Репутация
1,429
CreatoR
так наверно будет правильнее
В данном случае невозможно ввести путь в строке адреса, т.к. при клике там тоже появляется Edit.

нужно более надёжно
Я ещё не встречал пользователя, способного вручную переименовать файл в проводнике за 10 мс :smile:
 
Автор
CreatoR

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,671
Репутация
2,481
InnI [?]
Я ещё не встречал пользователя, способного вручную переименовать файл в проводнике за 10 мс
Я про отлов элементов и окон.
И к тому же, меня не волнует возможность юзера переименовать файл, мне нужно на время отключить данное действие, т.к мой скрипт выполняет некие действия при длительном нажатий на файле, и если нажать на выделенном файле, то после отжатия кнопки мышки начинается редактирование имени файла.

Вот так тогда уж:

Код:
#NoTrayIcon
#include <WinAPI.au3>
#include <APIConstants.au3>

Global Const $sEditParentClass = "^(SysListView32|CtrlNotifySink)$"
Global Const $sEditAncestorClass = "^((Cabinet|Explore)WClass|Progman|WorkerW)$"

Opt("WinWaitDelay", 0)
HotKeySet('{ESC}', '_Exit')

While Sleep(10)
	$sCtrl = ControlGetFocus("[ACTIVE]")
	
	If StringLeft($sCtrl, 4) = "Edit" Then
		$hWnd = ControlGetHandle("[ACTIVE]", "", $sCtrl)
		$sAncestorClass = _WinAPI_GetClassName(_WinAPI_GetAncestor($hWnd, $GA_ROOTOWNER))
		$sParentClass = _WinAPI_GetClassName(_WinAPI_GetParent($hWnd))
		
		If StringRegExp($sAncestorClass, $sEditAncestorClass) And StringRegExp($sParentClass, $sEditParentClass) Then
			;ControlSend($hWnd, '', '', '{ESC}')
			WinClose($hWnd)
		EndIf
	EndIf
WEnd

Func _Exit()
	Exit
EndFunc
 
Автор
CreatoR

CreatoR

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

Код:
HotKeySet('{ESC}', '_Exit')

While Sleep(10)
	ControlGetFocus("[ACTIVE]")
WEnd

Func _Exit()
	Exit
EndFunc


баг? :scratch:
 

InnI

AutoIT Гуру
Сообщения
4,912
Репутация
1,429
CreatoR
после отжатия кнопки мышки начинается редактирование имени файла
Это зависит от настройки. При включении "Открывать одним щелчком, выделять указателем" файлы запускаются.
 
Автор
CreatoR

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,671
Репутация
2,481
InnI [?]
Это зависит от настройки. При включении "Открывать одним щелчком, выделять указателем" файлы запускаются
Мне оно нужно когда эта опция не включена :laugh:.
Интересно где эта опция в реестре проверяется...
 
Автор
CreatoR

CreatoR

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

Код:
#NoTrayIcon
#include <APIConstants.au3>
#include <WinAPI.au3>

Global Const $sEditParentClass = '^(SysListView32|CtrlNotifySink)$'
Global Const $sEditAncestorClass = '^((Cabinet|Explore)WClass|Progman|WorkerW)$'

Opt('WinWaitDelay', 0)
HotKeySet('{ESC}', '_Exit')

While Sleep(10)
	$sCtrl = _ControlGetFocusEx('[ACTIVE]')
	
	If StringLeft($sCtrl, 4) = 'Edit' Then
		$hWnd = ControlGetHandle('[ACTIVE]', '', $sCtrl)
		$sAncestorClass = _WinAPI_GetClassName(_WinAPI_GetAncestor($hWnd, $GA_ROOTOWNER))
		$sParentClass = _WinAPI_GetClassName(_WinAPI_GetParent($hWnd))
		
		If StringRegExp($sAncestorClass, $sEditAncestorClass) And StringRegExp($sParentClass, $sEditParentClass) Then
			WinClose($hWnd)
		EndIf
	EndIf
WEnd

Func _ControlGetFocusEx($sTitle)
	Local $aRet
	
	While 1
		$aRet = DllCall('user32.dll', 'short', 'GetAsyncKeyState', 'int', '0x01')
		
		If Not @error And BitAND($aRet[0], 0x8000) <> 0 Then
			Sleep(RegRead('HKCU\Control Panel\Mouse', 'DoubleClickSpeed') + 50)
		Else
			Return ControlGetFocus($sTitle)
		EndIf
	Wend
EndFunc

Func _Exit()
	Exit
EndFunc


По мотивам тикета...

madmasles [?]
Хотел создать тикет, но оказывается (см. выше) такой уже создан, причём 7 лет назад.
Не стали исправлять т.к баг системный (при получении фокуса сбрасывается состояние поля ввода).
 

InnI

AutoIT Гуру
Сообщения
4,912
Репутация
1,429
Ещё вариант для Win7 и выше
Код:
#include <WinAPI.au3>
#include "UIAutomate.au3"

$UIA_ConsoleWriteError = 0

While Sleep(10)
  $oCtrl = _UIA_GetFocusedElement()
  $hWnd = HWnd(_UIA_ElementGetPropertyValue($oCtrl, "NativeWindowHandle"))
  $sClass = _UIA_ElementGetPropertyValue($oCtrl, "ClassName")
  $sRootClass = _WinAPI_GetClassName(_WinAPI_GetAncestor($hWnd, 2))
  If $sClass = "UIRenameTextElement" Or ($sClass = "Edit" And ($sRootClass = "Progman" Or $sRootClass = "WorkerW")) Then ControlSend("", "", $hWnd, "{ESC}")
WEnd
 
Верх