1

Тема: AHK: создание новой папки в Проводнике по горячей клавише

Продолжаю тему AutoHotkey: создание новой папки в Проводнике по горячей клавише в связи с новой возможностью AHK — доступа к COM — и для её демонстрации.
Следующий код создаёт новую папку в окнах CabinetWClass или ExploreWClass по горячей клавише F11:

F11::
   SetBatchLines, -1
   WinGet, ID,, A
   WinGetClass, Class, A
   if !(Class ~= "(Cabinet|Explore)WClass")
      Return

   oShell := ComObjCreate("Shell.Application")
   Loop
   {
      oIE := oShell.Windows.Item(A_Index - 1)
      if (oIE.HWND = ID)   ; получаем объект InternetExplorer для активного окна
         Break
      Sleep, 10
   }

   oShellFolderView := oIE.Document
   oFolder := oShellFolderView.Folder

   Loop   ; определяем имя новой папки в зависимости
   {      ; от существования других объектов с названием "Новая папка (i)"
      Sleep, 10
      FolderName := "Новая папка" . (A_Index = 1 ? "" : " (" . A_Index . ")")
      if !IsObject(oFolder.ParseName(FolderName))
         Break
   }

   Count := oFolder.Items.Count    ; перед созданием новой папки определяем количество видимых объектов
   oFolder.NewFolder(FolderName)
   While (Count = oFolder.Items.Count)    ; ждём, пока новая папка не станет видимой
      Sleep, 50                           ; и общее количество объектов не изменится

   oShellFolderView.SelectItem(oFolder.ParseName(FolderName), 1|3|4|8)
   oShell := oIE := oShellFolderView := oFolder := ""
   Return

Если знатоки WSH меня не поправят, наверное, имеет смысл добавить в Коллекцию.
Справочная информация: Shell Objects for Scripting, Shell Object.

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

2

Re: AHK: создание новой папки в Проводнике по горячей клавише

http://i042.radikal.ru/1108/3a/13056a2c50b5.jpg

AHK 1.0.48.5 (base)

Или я не в теме?

3

Re: AHK: создание новой папки в Проводнике по горячей клавише

Боюсь, не в теме. AHK 1.0.48.5 уже 2 года не обновляется, а я говорю о новых возможностях.

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

4

Re: AHK: создание новой папки в Проводнике по горячей клавише

Так и знал...
Всё никак не оседлаю этот AutoHotkey_L...

5

Re: AHK: создание новой папки в Проводнике по горячей клавише

Будь осторожен! Он ретивый!

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

6

Re: AHK: создание новой папки в Проводнике по горячей клавише

Не поверишь: три раза из седла вышибло!

7

Re: AHK: создание новой папки в Проводнике по горячей клавише

teadrinker, можно сразу же и в Коллекцию, в ту тему.

8

Re: AHK: создание новой папки в Проводнике по горячей клавише

   Count := oFolder.Items.Count    ; перед созданием новой папки определяем количество видимых объектов
   oFolder.NewFolder(FolderName)
   While (Count = oFolder.Items.Count)    ; ждём, пока новая папка не станет видимой
      Sleep, 50                           ; и общее количество объектов не изменится

А есть более надёжный метод?
Надо создать окно проводника, но в цикле проверять что количество окон изменилось как то не правильно.

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

9

Re: AHK: создание новой папки в Проводнике по горячей клавише

Запустил из первого поста.

Error:  0x80070005 - Отказано в доступе.
---> 043: oFolder.NewFolder(FolderName)

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

10

Re: AHK: создание новой папки в Проводнике по горячей клавише

У меня этот код работает на десятке корректно. Если отказано в доступе — значит, отказано в доступе. У меня такое сообщение появляется, если я пытаюсь создать новую папку, например, в Program Files.

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

11

Re: AHK: создание новой папки в Проводнике по горячей клавише

Да, видимо на тесте где-то там пробовал, в других работает. А почему так, скрипт от админа, shell по идее должен делать тоже самое что и из под окна проводника.

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

12

Re: AHK: создание новой папки в Проводнике по горячей клавише

serzh82saratov пишет:

Надо создать окно проводника

Неужели за 12 лет не появилось метода, вроде задача востребованная должна быть.

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

13

Re: AHK: создание новой папки в Проводнике по горячей клавише

Я не понимаю, какая именно задача.

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

14

Re: AHK: создание новой папки в Проводнике по горячей клавише

Создать окно проводника, например для просмотра папки, получив его Windows.Item, а не перебирать окна в ожидании появления нового.

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

15 (изменено: serzh82saratov, 2023-05-17 11:34:33)

Re: AHK: создание новой папки в Проводнике по горячей клавише

Например сейчас это делается так.

Кусок из функции:


	Count := ShellWindows.Count, i := 0
	Run, %A_WinDir%\explorer.exe /select`, "%FilePath%", , UseErrorLevel 
	Loop  { 
		Sleep 300
		If (ShellWindows.Count <= Count) {
			++i  
			If (i > 6)
				Return 0
			Continue
		} 
		break
	}
	tmphwnd := ShellWindows.Item(ShellWindows.Count - 1).hwnd
По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

16

Re: AHK: создание новой папки в Проводнике по горячей клавише

Не очень понял код, что там за 6. Можно отловить событие создания окна:

#Persistent

shellWindows := ComObjCreate("Shell.Application").Windows
ComObjConnect(shellWindows, "Shell_")

Shell_WindowRegistered(cookie, shellWindows) {
   hwnd := shellWindows.Item(shellWindows.count - 1).hwnd
   ToolTip % Format("{:#x}", hwnd)
}
Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

17

Re: AHK: создание новой папки в Проводнике по горячей клавише

6 количество попыток при ожидании.
Событие хорошо, но хотелось бы в синхронном виде, так запись намного проще.
Тоже самое с Navigate, если открыть в существующем окне другую папку, то просто ждать пока окно "прогрузится", а не ставить на это событие и прекращать вызывающий поток, или мотать цикл на проверку не пришло ли сообщение, чтобы поток не прекращать.

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

18

Re: AHK: создание новой папки в Проводнике по горячей клавише

Кстати а где ты взял WindowRegistered? Я его тут не нашёл.
https://learn.microsoft.com/ru-ru/previ … 4(v=vs.85)

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

19

Re: AHK: создание новой папки в Проводнике по горячей клавише

Ну, тут его точно не могло быть, это объект ShellWindows.
Я просто посмотрел, какие приходят:

#Persistent

shellWindows := ComObjCreate("Shell.Application").Windows
ComObjConnect(shellWindows, new Sink)

class Sink {
   __Call(event, params*) {
      static s := ""
      ToolTip % s .= event . "`n"
   }
}

А описаны здесь.

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

20

Re: AHK: создание новой папки в Проводнике по горячей клавише

teadrinker пишет:

Ну, тут его точно не могло быть, это объект ShellWindows.

Я отсюда по ссылке перешёл, не пойму я их справку, зачем туда отправили.

Retrieves an InternetExplorer object that represents the Shell window.

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

21

Re: AHK: создание новой папки в Проводнике по горячей клавише

teadrinker пишет:

Shell_WindowRegistered(cookie, shellWindows) {
   hwnd := shellWindows.Item(shellWindows.count - 1).hwnd
   ToolTip % Format("{:#x}", hwnd)
}

А не было бы правильнее хендл по cookie через FindWindowSW получать?

22

Re: AHK: создание новой папки в Проводнике по горячей клавише

Я этот разговор начал, потому что пока новое окно рисовалось, другое успело закрыться, вот и задумался как правильно должно быть.
Подход с shellWindows.count - 1 неправильный, как минимум надо собирать хэндлы имеющихся и ожидать с новым хэндлом, но мало ли появится другое, тогда смотреть заголовки, ожидая в нём запущенную папку, огород в общем.

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

23

Re: AHK: создание новой папки в Проводнике по горячей клавише

Malcev пишет:

А не было бы правильнее хендл по cookie через FindWindowSW получать?

Было бы, но у меня не вышло. Тут говорят, баг.

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

24

Re: AHK: создание новой папки в Проводнике по горячей клавише

Да, у меня тоже постоянно S_FALSE возвращается.

25

Re: AHK: создание новой папки в Проводнике по горячей клавише

Через RegisterShellHookWindow надежней отлавливать:
https://learn.microsoft.com/en-us/windo … hookwindow
https://learn.microsoft.com/en-us/previ … 1(v=vs.85)