Автор Тема: Запрет переименования файлов по клику в проводнике  (Прочитано 2672 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн CreatoR [?]

  • Администратор
  • *
  • Сообщений: 7830
  • Репутация: 2288
  • Пол: Мужской
  • AutoIt is simple, subtle, elegant
    • CreatoR's Lab
    • Награды
  • Версия AutoIt: 3.3.10.2
Нужен надёжный метод запрета переименования файлов по клику в проводнике.
Речь идёт о появлений поля Input при клике на выделенном файле в Explorer'е.

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


Правила, Поиск, Супер тема


AutoIt is simple, subtle, elegant.


«Не оказываю тех. поддержку через ПМ/ICQ, и по электронной почте - для этого есть форум. (C)»
«Законы Мэрфи неоспоримы!»


Мои работы

Русское сообщество AutoIt


Оффлайн firex [?]

  • AutoIt Гуру
  • *****
  • Сообщений: 943
  • Репутация: 203
  • Пол: Мужской
    • Награды
  • Версия AutoIt: 3.3.x.x
CreatoR
Только написание DLL, и никак иначе. Этот аспект создан и контролируется исключительно Explorer'ом, что само по себе логично.

Оффлайн InnI [?]

  • AutoIt Гуру
  • *****
  • Сообщений: 3975
  • Репутация: 1056
    • Награды
  • Версия AutoIt: 3.3.14.0
Код: AutoIt [Выделить]
#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 [?]

  • Администратор
  • *
  • Сообщений: 7830

  • Автор темы
  • Репутация: 2288
  • Пол: Мужской
  • AutoIt is simple, subtle, elegant
    • CreatoR's Lab
    • Награды
  • Версия AutoIt: 3.3.10.2
InnI
Вот так наверно будет правильнее (для рабочего стола тоже):

Код: AutoIt [Выделить]
#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


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

Русское сообщество AutoIt

Re: Запрет переименования файлов по клику в проводнике
« Ответ #3 Отправлен: Август 24, 2015, 18:21:30 »

Оффлайн InnI [?]

  • AutoIt Гуру
  • *****
  • Сообщений: 3975
  • Репутация: 1056
    • Награды
  • Версия AutoIt: 3.3.14.0
CreatoR
Цитировать
так наверно будет правильнее
В данном случае невозможно ввести путь в строке адреса, т.к. при клике там тоже появляется Edit.

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

Оффлайн CreatoR [?]

  • Администратор
  • *
  • Сообщений: 7830

  • Автор темы
  • Репутация: 2288
  • Пол: Мужской
  • AutoIt is simple, subtle, elegant
    • CreatoR's Lab
    • Награды
  • Версия AutoIt: 3.3.10.2
InnI  [?]
Цитировать
Я ещё не встречал пользователя, способного вручную переименовать файл в проводнике за 10 мс
Я про отлов элементов и окон.
И к тому же, меня не волнует возможность юзера переименовать файл, мне нужно на время отключить данное действие, т.к мой скрипт выполняет некие действия при длительном нажатий на файле, и если нажать на выделенном файле, то после отжатия кнопки мышки начинается редактирование имени файла.

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

Код: AutoIt [Выделить]
#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


Оффлайн joiner [?]

  • Расмус-бродяга
  • AutoIt Гуру
  • *****
  • Сообщений: 2808
  • Репутация: 473
  • Пол: Мужской
    • Награды
  • Версия AutoIt: 3.3.12.0
CreatoR  [?]
Цитировать
Вот так тогда уж:
этот код не дает открыть ни одну папку на рабочем столе. только через правый клик
Были времена, когда солнце было ярче, трава зеленее, а водка сорокоградуснее

Оффлайн CreatoR [?]

  • Администратор
  • *
  • Сообщений: 7830

  • Автор темы
  • Репутация: 2288
  • Пол: Мужской
  • AutoIt is simple, subtle, elegant
    • CreatoR's Lab
    • Награды
  • Версия AutoIt: 3.3.10.2
joiner  [?]
Цитировать
этот код не дает открыть ни одну папку на рабочем столе
Всему виной ControlGetFocus в цикле:

Код: AutoIt [Выделить]
HotKeySet('{ESC}', '_Exit')

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

Func _Exit()
    Exit
EndFunc


баг? :think:

Русское сообщество AutoIt

Re: Запрет переименования файлов по клику в проводнике
« Ответ #7 Отправлен: Август 25, 2015, 09:33:44 »

Оффлайн madmasles [?]

  • Глобальный модератор
  • *
  • Сообщений: 7790
  • Репутация: 2317
  • Пол: Мужской
  • Награды За модерирование форума
    • Награды
  • Версия AutoIt: 3.3.x.x
CreatoR  [?]
Цитировать
баг?
Похоже, что да.

Оффлайн InnI [?]

  • AutoIt Гуру
  • *****
  • Сообщений: 3975
  • Репутация: 1056
    • Награды
  • Версия AutoIt: 3.3.14.0
CreatoR
Цитировать
после отжатия кнопки мышки начинается редактирование имени файла
Это зависит от настройки. При включении "Открывать одним щелчком, выделять указателем" файлы запускаются.

Оффлайн CreatoR [?]

  • Администратор
  • *
  • Сообщений: 7830

  • Автор темы
  • Репутация: 2288
  • Пол: Мужской
  • AutoIt is simple, subtle, elegant
    • CreatoR's Lab
    • Награды
  • Версия AutoIt: 3.3.10.2
InnI  [?]
Цитировать
Это зависит от настройки. При включении "Открывать одним щелчком, выделять указателем" файлы запускаются
Мне оно нужно когда эта опция не включена :laugh:.
Интересно где эта опция в реестре проверяется...

Оффлайн InnI [?]

  • AutoIt Гуру
  • *****
  • Сообщений: 3975
  • Репутация: 1056
    • Награды
  • Версия AutoIt: 3.3.14.0
CreatoR
Цитировать
в реестре проверяется
На Win7 изменения происходят здесь: HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer, ShellState (REG_BINARY)

Оффлайн CreatoR [?]

  • Администратор
  • *
  • Сообщений: 7830

  • Автор темы
  • Репутация: 2288
  • Пол: Мужской
  • AutoIt is simple, subtle, elegant
    • CreatoR's Lab
    • Награды
  • Версия AutoIt: 3.3.10.2
joiner  [?]
Цитировать
этот код не дает открыть ни одну папку на рабочем столе
Обход проблемы:

Код: AutoIt [Выделить]
#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 Гуру
  • *****
  • Сообщений: 3975
  • Репутация: 1056
    • Награды
  • Версия AutoIt: 3.3.14.0
Ещё вариант для Win7 и выше
Код: AutoIt [Выделить]
#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


Русское сообщество AutoIt

Re: Запрет переименования файлов по клику в проводнике
« Ответ #13 Отправлен: Август 26, 2015, 13:19:16 »

 

Похожие темы

  Тема / Автор Ответов Последний ответ
0 Ответов
4531 Просмотров
Последний ответ Ноябрь 23, 2009, 05:27:37
от kolyan-xerox
9 Ответов
7852 Просмотров
Последний ответ Май 29, 2010, 00:48:55
от CreatoR
8 Ответов
6131 Просмотров
Последний ответ Март 22, 2012, 18:18:46
от Dimmak
5 Ответов
2584 Просмотров
Последний ответ Март 25, 2012, 15:30:11
от Dimmak
8 Ответов
4148 Просмотров
Последний ответ Март 30, 2012, 12:23:01
от AZJIO
2 Ответов
1790 Просмотров
Последний ответ Май 11, 2012, 16:17:20
от madmasles
8 Ответов
5368 Просмотров
Последний ответ Октябрь 13, 2013, 20:31:40
от eugenillin
1 Ответов
1061 Просмотров
Последний ответ Июль 21, 2015, 18:51:01
от madmasles
4 Ответов
800 Просмотров
Последний ответ Сентябрь 28, 2017, 15:59:33
от InnI
3 Ответов
560 Просмотров
Последний ответ Сентябрь 27, 2018, 14:52:15
от InnI