1

Тема: AHK: Изменить атрибуты выделенной папки

Как изменить атрибуты папки (скрытый) команда FileSetAttrib.
Везде в примерах, написано что нужно указать имя файла или папки. А как это сделать без имени.
То есть нажал мышкой на папку, она выделилась, нажал горячую клавишу и атрибут у нее поменялся! Спасибо!.

2

Re: AHK: Изменить атрибуты выделенной папки

Если выделенная папка не не рабочем столе, то путь так можно получить:

F11:: MsgBox, % GetSelected()

GetSelected(hwnd="")
{
	if (hwnd = "")
		WinGet, hwnd,, A
	
	for window in ComObjCreate("Shell.Application").Windows
		if (window.hwnd = hwnd && found := 1)
			break

	if !found
		return

	for item in window.document.SelectedItems
		paths .= item.path "`n"
	
	Return Trim(paths, "`n")
}
Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

3

Re: AHK: Изменить атрибуты выделенной папки

teadrinker

А если на рабочем столе?)

4

Re: AHK: Изменить атрибуты выделенной папки

Для общего случая так:

F11:: MsgBox, % Explorer_GetSelected()

Explorer_GetSelected(hwnd="")
{
   return Explorer_Get(hwnd,true)
}

Explorer_GetWindow(hwnd="")
{
   ; thanks to jethrow for some pointers here
    WinGet, process, processName, % "ahk_id" hwnd := hwnd? hwnd:WinExist("A")
    WinGetClass class, ahk_id %hwnd%

   if (process!="explorer.exe")
      return
   if (class ~= "(Cabinet|Explore)WClass")
   {
      for window in ComObjCreate("Shell.Application").Windows
         if (window.hwnd==hwnd)
            return window
   }
   else if (class ~= "Progman|WorkerW")
      return "desktop" ; desktop found
}
Explorer_Get(hwnd="",selection=false)
{
   if !(window := Explorer_GetWindow(hwnd))
      return ErrorLevel := "ERROR"
   
   if (window="desktop")
      for item in GetDesktopIShellFolderViewDual().SelectedItems
         ret .= item.path . "`r`n"
   
   else
   {
      if selection
         collection := window.document.SelectedItems
      else
         collection := window.document.Folder.Items
      for item in collection
         ret .= item.path "`r`n"
   }
   return Trim(ret,"`r`n")
}

GetDesktopIShellFolderViewDual()
{
    IShellWindows := ComObjCreate("{9BA05972-F6A8-11CF-A442-00A0C90A8F39}")
    desktop := IShellWindows.Item(ComObj(19, 8)) ; VT_UI4, SCW_DESKTOP                
   
    ; Retrieve top-level browser object.
    if ptlb := ComObjQuery(desktop
        , "{4C96BE40-915C-11CF-99D3-00AA004AE837}"  ; SID_STopLevelBrowser
        , "{000214E2-0000-0000-C000-000000000046}") ; IID_IShellBrowser
    {
        ; IShellBrowser.QueryActiveShellView -> IShellView
        if DllCall(NumGet(NumGet(ptlb+0)+15*A_PtrSize), "ptr", ptlb, "ptr*", psv) = 0
        {
            ; Define IID_IDispatch.
            VarSetCapacity(IID_IDispatch, 16)
            NumPut(0x46000000000000C0, NumPut(0x20400, IID_IDispatch, "int64"), "int64")
           
            ; IShellView.GetItemObject -> IDispatch (object which implements IShellFolderViewDual)
            DllCall(NumGet(NumGet(psv+0)+15*A_PtrSize), "ptr", psv
                , "uint", 0, "ptr", &IID_IDispatch, "ptr*", pdisp)
           
            IShellFolderViewDual := ComObjEnwrap(pdisp)
            ObjRelease(psv)
        }
        ObjRelease(ptlb)
    }
    return IShellFolderViewDual
}
Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

5

Re: AHK: Изменить атрибуты выделенной папки

teadrinker

Большое Спасибо!!! Буду пробовать! Если что обращусь! )

6

Re: AHK: Изменить атрибуты выделенной папки

teadrinker

Глубочайше извиняюсь! Что то у меня ничего не получается
Несколько дней только как стал этот прекрасный язык изучать! И изучать команду FileSetAttrib. Сейчас уже каша в голове)
Если я вас попрошу дописать мне этот скрипт. Чтобы я мог его запускать, и при выделенном файле или папки, и нажатии горячей клавиши у нее(го) менялся атрибут (скрытый)
Буду примногом благодарен! И обещаю что в дальнейшем полностью разберу это код на запчасти и пойму что к чему! : )

7

Re: AHK: Изменить атрибуты выделенной папки

А приведенный код работает? Сообщение с путём к выделенному объекту появляется?

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

8 (изменено: tregalka, 2016-01-13 15:00:08)

Re: AHK: Изменить атрибуты выделенной папки

teadrinker

Появляется только пустое окно ( Я еще столкнулся с тем, когда перед тем как вам написать, что у меня команда FileSetAttrib отказывалась работать с названием папок и файлов на Русском. И если название пути тоже на Русском.

9

Re: AHK: Изменить атрибуты выделенной папки

Появляется только пустое окно

И в первом, и во втором варианте кода? Где находится выделенный объект, в обычной папке, или на рабочем столе? Какая версия AHK и Windows?

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

10

Re: AHK: Изменить атрибуты выделенной папки

teadrinker

1 вариант не пробовал, только второй! Папку пробовал на рабочем столе и в других директориях. AutoHotkey Version:  1.1.22.09
Windows 7 64bit

11

Re: AHK: Изменить атрибуты выделенной папки

Попробуйте первый с папкой не на рабочем столе.

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

12

Re: AHK: Изменить атрибуты выделенной папки

teadrinker

Попробовал! Пустое.

13

Re: AHK: Изменить атрибуты выделенной папки

Нет идей, должно работать. Можно вместо всего этого послать Ctrl + C и проверить Clipboard.

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

14

Re: AHK: Изменить атрибуты выделенной папки

teadrinker

Ок! Потом попробую разобраться! Спасибо!

15

Re: AHK: Изменить атрибуты выделенной папки

teadrinker

Здаровки! Потестил еще раз! 1й вариант так же пустое окно , а  2й вариант рабочий! Но только показывает путь когда папка или файл на рабочем столе. Если в другом месте то выходит окно с (ERROR)

16

Re: AHK: Изменить атрибуты выделенной папки

Окно с выделенной папкой должно быть активным в момент нажатия горячей клавиши. Кроме того, скрипт рассчитан только на стандартный виндосовский проводник.

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

17

Re: AHK: Изменить атрибуты выделенной папки

teadrinker

Да окно в этом моменты выделено! Только вот проводник у меня не стандартный (clover) может из за этого ошибка? Сейчас попробую стандартным!
Как мне дальше сделать, чтобы атрибут менялся!
Я просто снизу дописал строку FileSetAttrib, ^H, % Explorer_GetSelected() Как и стоило ожидать, ничего не происходит

18

Re: AHK: Изменить атрибуты выделенной папки

teadrinker

В обычном проводнике все работает на ура!!!
Извини что пришлось тебе помучиться, чтобы понять что у меня там за фигня, почему не работает.
Я ведь сам не знал, что такое бывает
А теперь вопрос, как сделать чтобы это дело в Clovere хотело работать? Без него как без рук

19

Re: AHK: Изменить атрибуты выделенной папки

Так попробуйте:

F11::
	SaveClipboard := ClipboardAll
	clip := Clipboard := ""
	Send ^{vk43}
	ClipWait, 0
	if !ErrorLevel
		clip := Clipboard
	Clipboard := SaveClipboard
	if (clip = "")  {
		MsgBox, Данные не получены
		Return
	}
	FileGetAttrib, attr, % clip
	if !InStr(attr, "D")  {
		MsgBox, В переменной не путь к папке
		Return
	}
	FileSetAttrib, ^H, % clip, 2
	Return

P.S. Предложения лучше точкой заканчивать, а не смайликом.

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

20

Re: AHK: Изменить атрибуты выделенной папки

teadrinker

ВЫ ГЕНИЙ!!! Все работает!!! И Везде!!! СПАСИБО!!!

Спасибо тебе господи, что есть такие люди! И тратят свое драгоценное время на таких лузеров как я .

21

Re: AHK: Изменить атрибуты выделенной папки

teadrinker

Только что обнаружил что при скрытии файла (в любом месте), появляется окно с кракозябрами .
Что то я от радости)) папки потестил, а про файлы забыл..

22

Re: AHK: Изменить атрибуты выделенной папки

появляется окно с кракозябрами

Установите unicode-версию, кракозябров не будет. Изначально речь шла только о папках. Посмотрите на код внимательно, думаю, разберётесь, в чём проблема.

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

23

Re: AHK: Изменить атрибуты выделенной папки

Да речь шла о папках, но команда вроде распространяется и на файлы тоже. И до этого код, который вы мне писали, я проверял и на файлах!
Вроде юникод версию устанавливал, качал ее с нового сайта ahk перейдя на него по ссылке с вашего сайта!
Хорошо сегодня попробую решить проблему! Спасибо!

24

Re: AHK: Изменить атрибуты выделенной папки

teadrinker

Переустановил ahk, но кракозябры все равно.. Со временем думаю разберусь в чем дело!
В коде убрал команду FileGetAttrib с условием (она как бы и не нужна) Все работает!!!
Спасибо!!!.

25

Re: AHK: Изменить атрибуты выделенной папки

tregalka пишет:

кракозябры все равно

Попробуйте сохранять скрипт в UTF-8.

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

26

Re: AHK: Изменить атрибуты выделенной папки

teadrinker

А как быть с множественным выбором?) Меняет атрибут только по одному.

27

Re: AHK: Изменить атрибуты выделенной папки

F11::
	SaveClipboard := ClipboardAll
	clip := Clipboard := ""
	Send ^{vk43}
	ClipWait, 0
	if !ErrorLevel
		clip := Clipboard
	Clipboard := SaveClipboard
	if (clip = "")  {
		MsgBox, Данные не получены
		Return
	}
	Loop, parse, % clip, `n, `r
		FileSetAttrib, ^H, % A_LoopField, 2
	Return
Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

28

Re: AHK: Изменить атрибуты выделенной папки

teadrinker

ОТ ДУШИ!!!