1

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

По нажатию F7 скрипт ищет в активном окне элемент управления, в имени которого есть "Edit" и проверяет, существует ли такой путь. Если путь существует, в нём создаётся папка. Не понимает специальные папки вроде "Мои документы" и т.п. Работает в Проводнике, ACDSee, Блокноте и т.д.

F7::
WinGet, ActiveControlList, ControlList, A
Loop, Parse, ActiveControlList, `n
{
isedit = % InStr(A_LoopField, "Edit")
    if (isedit <> 0)
    {
    ControlGetText, OutputVar , %A_LoopField%, A
        IfExist, %OutputVar%
        {
            FileCreateDir, %OutputVar%\newdir
        }
    }
}
return

Автор примера - dw.

Предложения в русском языке начинаются с большой буквы и заканчиваются точкой.
В названии ветки всегда должен быть указан язык программирования или среда исполнения скрипта, если это возможно.

2

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

Вариант предыдущего скрипта, добавляет к имени создаваемой папки ("newdir") случайную комбинацию цифр. Это позволяет в текущем каталоге создавать не одну папку, а неограниченное их количество подряд. Если вам нужен значок в трее, уберите первую строчку скрипта.

#NoTrayIcon 
F7::
WinGet, ActiveControlList, ControlList, A
Loop, Parse, ActiveControlList, `n
{
Random, rann, 0, 2147483647 
isedit = % InStr(A_LoopField, "Edit")
    if (isedit <> 0)
    {
    ControlGetText, OutputVar , %A_LoopField%, A
        IfExist, %OutputVar%
        {
            FileCreateDir, %OutputVar%\newdir%rann%
        }
    }
}
return

Автор примера - Resager.

Предложения в русском языке начинаются с большой буквы и заканчиваются точкой.
В названии ветки всегда должен быть указан язык программирования или среда исполнения скрипта, если это возможно.

3

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

Усовершенствованный вариант того же скрипта. Теперь в контекстном меню иконки в трее есть два варианта - генерировать имя автоматически или выдавать диалог для задания имени папки.

;***************************************************
; AutoHotkey Version:    1.0.46.06+
; Авторы:                 Resager,alexii
; Имя скрипта:           FolderCreater 2.5.ahk
;**************************************************

; ========== НАСТРОЙКИ ПОЛЬЗОВАТЕЛЯ ============================================
#SingleInstance force                              ; перезагрузить скрипт, если он уже запущен
Menu, Tray, Icon, Shell32.dll, 4                   ;иконка, используемая в трее
Menu, Tray, Tip , Press F7 to create New folder    ;подсказка, выплывающаа при наведении курсора на значок программы в трее
#NoEnv                                             ; запрещаем имена переменных как у переменных окружения
SendMode Input                                     ; режим высылки без задержки и повышенной надежности
neu=fno                                            ; установка режима по умолчанию (в данном случае по умолчанию автоматически случайное имя папки
;Имена пунктов меню в трее:
pmenu1= Вводить своё имя папки
pmenu2= Генерировать имя по маске
; ========== КОНЕЦ НАСТРОЕК ПОЛЬЗОВАТЕЛЯ =======================================

; ========== СОЗДАНИЕ МЕНЮ В ТРЕЕ ==============================================
Menu, Tray, NoStandard ; не использовать стандартное меню
Menu, Tray, Add,%pmenu1%, Menu_fyes
Menu, Tray, Add,%pmenu2%, Menu_fno
Menu, Tray, Add ; разделитель
Menu, Tray, Add, В&ыход, Exit_Script ; выйти из скрипта
; расставляем галочки
If neu=fyes
    Menu, Tray, Check,%pmenu1%; поставить галочку в меню
If neu=fno
    Menu, Tray, Check,%pmenu2%
    ;поставить галочку в меню
Return ; закончить автовыполняющуюся часть
; ========== КОНЕЦ СОЗДАНИЯ МЕНЮ В ТРЕЕ ========================================

; ========== ПОДПРОГРАММЫ ДЛЯ МЕНЮ В ТРЕЕ ======================================
Menu_fyes: ; подпрограмма реагирования на выбор пункта меню
    Menu, Tray, Check,%pmenu1%
    ; поставить галочку в меню
    Menu, Tray, Uncheck,%pmenu2%
    ; снять галочку в меню
    neu=fyes
Return ; конец подпрограммы

Menu_fno: ; подпрограмма реагирования на выбор пункта меню
    Menu, Tray, Check,%pmenu2%
    ; поставить галочку в меню
    Menu, Tray, Uncheck,%pmenu1%
    ; снять галочку в меню
    neu=fno
    Return ; конец подпрограммы

Exit_Script:
    
    ExitApp ; выйти из скрипта
; ========== КОНЕЦ ПОДПРОГРАММ МЕНЮ В ТРЕЕ =====================================

; ========== ПРОГРАММА СОДАНИЯ ПАПОК С ЗАВИСЯЩИМ ОТ НАСТРОЕК ПОЛЬЗОВАТЕЛЯ ИМЕНЕМ ===================
#IfWinActive, ahk_class CabinetWClass  ;Создает контекстно-зависимые вызывающие клавиши и (hotstrings). Такие вызывающие клавиши выполняют различное действие (или несколько действий) в зависимости от типа окна, которое является активным или существует.
;CabinetWClass - ипользовать обработку нажатияя клавиши только "в папках проводника"
F7::
WinGet, intHWND, ID, A ;Отыскивает уникальный логин указанного окна, логин процесса, название{имя} процесса, или список его управлений. Это может также отыскать список всех окон, соответствующих указанным критериям.
WinGet, strProcessName, ProcessName, ahk_id %intHWND% 

;(здесь, сравнивает две переменные (например var и value), анологично выражению if var = value
IfEqual, strProcessName, explorer.exe 
{
    ControlGetText, strParentFolder, Edit1, ahk_id %intHWND%
    IfExist, %strParentFolder%
    {
        Loop
        {
            If A_Index = 1
                strFolder = NewFolder
            Else 
                strFolder = NewFolder(%A_Index%)
            
            IfNotExist, %strParentFolder%\%strFolder%
                Break
        }
        ;InputBox, strFolder, Создание папки, Создать папку, , , 120, , , , , %strFolder%
        ;IfEqual ErrorLevel, 0
        if neu = fyes 
           {
            Gui, Color, FFFFFF
            ;WinSet, TransColor, EEAA99
            ;Gui, Add, Picture , w33 h29, C:\WORKW\pchealth\helpctr\System\images\Centers\Uabrand.gif
            Gui, Add, Text,ym, Foldrer name:
            Gui, Add, Edit, vstrFolder ym ; Опция ym начинает новую колонку элементов управления.
            ;Gui, Add, Text,yn, 
            Gui, Add, Button, default ym, OK ; Метка ButtonOK (если она существует) будет запущена при нажатии кнопки.
            ;Gui, Add, Button,, Cencel ;
            Gui, Show,, Введите имя папки
            f12::
            if okk=0
         {
          Gui, Submit ; Сохраняем входные данные пользователя в ассоциированной переменной каждого элемента управления.
          Gui, Destroy ;уничтожаем созданное нами окно, чтобы в дальнейшем мы смогли заново его перестроить
          }
return
            return ; Окончание секции авто-выполнения. Скрипт ожидает каких-нибудь действий пользователя.
            Gui, Destroy
           }
        if neu = fno   
            IfNotEqual, strFolder,
                IfNotExist, %strParentFolder%\%strFolder%
                {
                    FileCreateDir, %strParentFolder%\%strFolder%
                    ;MsgBox Была создана папка [%strFolder%] в [%strParentFolder%].
                }
        IfEqual, strFolder,
            {
             Random, strFolder, 0, 2147483647 
             IfNotExist, %strParentFolder%\%strFolder%
                    {
                          FileCreateDir, %strParentFolder%\%strFolder%
                          ;MsgBox Была создана папка [%strFolder%] в [%strParentFolder%].
                    }
            }        
    }
}
return
; ========== КОНЕЦ ПРОГРАММЫ СОДАНИЯ ПАПОК С ЗАВИСЯЩИМ ОТ НАСТРОЕК ПОЛЬЗОВАТЕЛЯ ИМЕНЕМ ===================

;++++++++++++метка выполнения действий выполняемых при нажатии кнопки ОК в окне запроса имени папки++++++++++++++++
ButtonOK:
         Gui, Submit ; Сохраняем входные данные пользователя в ассоциированной переменной каждого элемента управления.
         Gui, Destroy ;уничтожаем созданное нами окно, чтобы в дальнейшем мы смогли заново его перестроить
             IfNotExist, %strParentFolder%\%strFolder%
                {
                      FileCreateDir, %strParentFolder%\%strFolder%
                }    
         okk=1                
;+++++++++++++конец метки .... клавиши ок..++++++++++++++++++
;++++++++++++метка выполнения действий выполняемых при нажатии кнопки Cencel в окне запроса имени папки++++++++++++++++
ButtonCencel:
         if okk<>1
         {
          Gui, Submit ; Сохраняем входные данные пользователя в ассоциированной переменной каждого элемента управления.
          Gui, Destroy ;уничтожаем созданное нами окно, чтобы в дальнейшем мы смогли заново его перестроить
         }
return
;+++++++++++++конец метки .... клавиши Cencel..++++++++++++++++++
GuiClose:
GuiEscape:
          Gui, Submit ; Сохраняем входные данные пользователя в ассоциированной переменной каждого элемента управления.
          Gui, Destroy ;уничтожаем созданное нами окно, чтобы в дальнейшем мы смогли заново его перестроить

Автор скрипта - Resager, использованы идеи alexii.

Предложения в русском языке начинаются с большой буквы и заканчиваются точкой.
В названии ветки всегда должен быть указан язык программирования или среда исполнения скрипта, если это возможно.

4

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

Ещё более усовершенствованный вариант скрипта. В контекстном меню иконки в трее есть возможности:
+ использовать диалог (переключатель);
+ использовать буфер обмена (переключатель);
+ отображать уведомления об успехе/неуспехе (переключатель);
+ поместить скрипт в автозагрузку (переключатель).
Имя папки может редактироваться непосредственно в Проводнике, точно так же, как это происходит при обычном создании папки без скриптов.

#SingleInstance Force
#MaxThreadsPerHotkey 5

SplitPath, A_ScriptName, , , , strIniFileName
strIniFileName = %strIniFileName%.ini

Menu, Tray, Icon, Shell32.dll, 4
Menu, Tray, Tip , Press F7 in Explorer to create New folder

Menu, Tray, NoStandard

Menu, Tray, Add, Use dialog, mhUseDialog
IniRead, boolUseDialog, %A_ScriptDir%\%strIniFileName%, Main, UseDialog, %False%
If (boolUseDialog)
    Menu, Tray, Check, Use dialog
Else
    Menu, Tray, Uncheck, Use dialog

Menu, Tray, Add, Use clipboard, mhUseClipboard
IniRead, boolUseClipboard, %A_ScriptDir%\%strIniFileName%, Main, UseClipboard, %True%
If (boolUseClipboard)
    Menu, Tray, Check, Use clipboard
Else
    Menu, Tray, Uncheck, Use clipboard

Menu, Tray, Add, Show notification, mhShowNotification
IniRead, boolShowNotification, %A_ScriptDir%\%strIniFileName%, Main, ShowNotification, %True%
If (boolShowNotification)
    Menu, Tray, Check, Show notification
Else
    Menu, Tray, Uncheck, Show notification

;Menu, Tray, Add, Change folder, mhChangeFolder
;IniRead, boolChangeFolder, %A_ScriptDir%\%strIniFileName%, Main, ChangeFolder, %True%
;If (boolChangeFolder)
;    Menu, Tray, Check, Change folder
;Else
;    Menu, Tray, Uncheck, Change folder
;Menu, Tray, Disable, Change folder
    
Menu, Tray, Add

Menu, Tray, Add, Start with &Windows, mhAutorun
IniRead, boolAutorun, %A_ScriptDir%\%strIniFileName%, Main, Autorun, %False%
If (boolAutorun)
{
    Menu, Tray, Check, Start with &Windows
    RegWrite, REG_SZ, HKEY_CURRENT_USER, Software\Microsoft\Windows\CurrentVersion\Run, F7, "%A_ScriptFullPath%"
}
Else
{
    Menu, Tray, Uncheck, Start with &Windows
    RegDelete, HKEY_CURRENT_USER, Software\Microsoft\Windows\CurrentVersion\Run, F7
}

Menu, Tray, Add

Menu, Tray, Add, Quit, mhQuit
Menu, Tray, Default , Quit

If boolShowNotification
{
    TrayTip, ,Press F7 in Explorer to create New folder, 3, 1
    Sleep, 3 * 1000
    TrayTip,
}
;=============================================================================

;=============================================================================
#IfWinActive, ahk_class CabinetWClass
F7::
#IfWinActive, ahk_class ExploreWClass
F7::

WinGet, intHWND, ID, A
WinGet, strProcessName, ProcessName, ahk_id %intHWND%

IfEqual, strProcessName, explorer.exe
{
    ControlGetText, strParentFolder, Edit1, ahk_id %intHWND%
    IfExist, %strParentFolder%
    {
        If boolUseClipboard
        {
            StringReplace, strFolder, Clipboard, " , , All
            SplitPath, strFolder , strFolder
        }
        Else
        {
            Loop
            {
                If A_Index = 1
                    strFolder = Новая папка
                Else 
                    strFolder = Новая папка (%A_Index%)
                
                IfNotExist, %strParentFolder%\%strFolder%
                    Break
            }
        }
        
        If boolUseDialog
        {
            InputBox, strFolder, Создание папки, Создать папку, , , 120, , , , , %strFolder%
            IfEqual, ErrorLevel, 0
                IfNotEqual, strFolder,
                    Gosub, subCreateFolder
        }
        Else
        {
            Gosub, subCreateFolder
        }
    }
}

Return
;=============================================================================

;=============================================================================
mhUseDialog:
    boolUseDialog := Not boolUseDialog
    Menu, Tray, ToggleCheck, Use dialog
    IniWrite, %boolUseDialog%, %A_ScriptDir%\%strIniFileName%, Main, UseDialog
Return
;=============================================================================

;=============================================================================
mhUseClipboard:
    boolUseClipboard := Not boolUseClipboard
    Menu, Tray, ToggleCheck, Use clipboard
    IniWrite, %boolUseClipboard%, %A_ScriptDir%\%strIniFileName%, Main, UseClipboard
Return
;=============================================================================

;=============================================================================
mhShowNotification:
    boolShowNotification := Not boolShowNotification
    Menu, Tray, ToggleCheck, Show notification
    IniWrite, %boolShowNotification%, %A_ScriptDir%\%strIniFileName%, Main, ShowNotification
Return
;=============================================================================

;=============================================================================
;mhChangeFolder:
;    boolChangeFolder := Not boolChangeFolder
;    Menu, Tray, ToggleCheck, Change folder
;    IniWrite, %boolChangeFolder%, %A_ScriptDir%\%strIniFileName%, Main, ChangeFolder
;Return
;=============================================================================

;=============================================================================
mhAutorun:
    boolAutorun := Not boolAutorun
    Menu, Tray, ToggleCheck, Start with &Windows
    IniWrite, %boolAutorun%, %A_ScriptDir%\%strIniFileName%, Main, Autorun
    
    If (boolAutorun)
        RegWrite, REG_SZ, HKEY_CURRENT_USER, Software\Microsoft\Windows\CurrentVersion\Run, F7, "%A_ScriptFullPath%"
    Else
        RegDelete, HKEY_CURRENT_USER, Software\Microsoft\Windows\CurrentVersion\Run, F7
Return
;=============================================================================

;=============================================================================
mhQuit:
    ExitApp, 0
Return
;=============================================================================

;=============================================================================
subCreateFolder:
    IfNotExist, %strParentFolder%\%strFolder%
    {
        ControlGet, intOldItemsCount, List, Count, SysListView321, ahk_id %intHWND%
        FileCreateDir, %strParentFolder%\%strFolder%
        
        If (ErrorLevel = 0) And (FileExist(strParentFolder . "\" . strFolder))
        {
            Loop, 1000
            {
                ControlGet, intNewItemsCount, List, Count, SysListView321, ahk_id %intHWND%
                
                If Not (intNewItemsCount == (intOldItemsCount + 1))
                    Sleep, 10
                Else
                    Break
            }
            ControlFocus, SysListView321, ahk_id %intHWND%
            Send, {End}
            
            ControlGet, strSelected, List, Selected Col1, SysListView321, ahk_id %intHWND%
            If (strSelected == strFolder)
                Send, {F2}
            Gosub, subSuccesInfo
            
        }
        Else
            Gosub, subShowError
    }
    Else
        Gosub, subShowError
Return
;=============================================================================

;=============================================================================
subSuccesInfo:
    If boolShowNotification
    {
        TrayTip, Folder [%strFolder%] created successfully, in [%strParentFolder%], 3, 1
        Sleep, 3 * 1000
        TrayTip,
    }
Return
;=============================================================================

;=============================================================================
subShowError:
    TrayTip, Can't create folder [%strFolder%], in [%strParentFolder%], 5, 3
    Sleep, 5 * 1000
    TrayTip,
Return
;=============================================================================

Автор скрипта - alexii.

Предложения в русском языке начинаются с большой буквы и заканчиваются точкой.
В названии ветки всегда должен быть указан язык программирования или среда исполнения скрипта, если это возможно.

5

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

Для демонстрации возможностей AHK_L, создание новой папки в окнах CabinetWClass или ExploreWClass через COM:

F7::
   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)
      Sleep, 10
   } Until oIE.HWND = ID   ; получаем объект InternetExplorer для активного окна
 
   oShellFolderView := oIE.Document
   oFolder := oShellFolderView.Folder
   if !(oFolder.Self.IsFileSystem)   ; если родительская папка не является частью файловой системы
   {
      MsgBox, % "Папка """ oFolder.Self.Name """ не является частью файловой системы`
            ,`nсоздание новой папки в ней невозможно!"
      oShell := oIE := oShellFolderView := oFolder := ""
      Return
   }
 
   Loop   ; определяем имя новой папки в зависимости
   {      ; от существования других объектов с названием "Новая папка (i)"
      Sleep, 10
      FolderName := "Новая папка" . (A_Index = 1 ? "" : " (" . A_Index . ")")
   } Until !IsObject(oFolder.ParseName(FolderName))

   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

Не сработает на Десктопе, сработает в Моих Документах.

Справочная информация: COM Object Reference [AutoHotkey_L]
                                     COM Object: Shell.Application
                                     Shell Objects for Scripting
                                     Shell Object
Тема для обсуждения на форуме.

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