1

Тема: AHK: Определить процесс выделенного файла и закрыть его

Доброго времени суток . Помогите определить процесс выделенного файла и закрыть его . Приведённый ниже скрипт работает, на активное окно.



~lbutton::
{
    KeyWait, lbutton
}

{
 
WinGet, ahk_pid, PID, A
WinGet, active_pid, PID, A
WinGetTitle, active_title, A
}

Process, Close, %active_pid%
ExitApp
OS: Win11x64, AutoHotkey v1.1.25.01 (Unicode 64-bit).

2

Re: AHK: Определить процесс выделенного файла и закрыть его

А какой конкретно файл — exe, скрипт, или другой какой?

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

3 (изменено: Ядрён, 2014-03-08 15:42:04)

Re: AHK: Определить процесс выделенного файла и закрыть его

Здравствуйте, а можно два варианта и exe и ahk. Но если очень трудно, то только exe.

OS: Win11x64, AutoHotkey v1.1.25.01 (Unicode 64-bit).

4

Re: AHK: Определить процесс выделенного файла и закрыть его

Сегодня не получится уже, завтра.

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

5

Re: AHK: Определить процесс выделенного файла и закрыть его

teadrinker пишет:

Сегодня не получится уже, завтра.

Завтра , значит завтра.

OS: Win11x64, AutoHotkey v1.1.25.01 (Unicode 64-bit).

6

Re: AHK: Определить процесс выделенного файла и закрыть его

Так примерно, но особо не тестировал:

F11::
   SelectedItems := GetSelectedFiles()
   Processes := ComObjGet("winmgmts:").InstancesOf("Win32_Process")
   Loop, parse, SelectedItems, `n
   {
      if SubStr(A_LoopField, -3) = ".exe"
      {
         for Process in Processes
            if (Process.ExecutablePath = A_LoopField)
               Process.Terminate
      }
      else ;if SubStr(A_LoopField, -3) = ".ahk   ; если нужно проверять только ahk-файлы, убрать точку с запятой
         for Process in Processes
            if InStr(Process.CommandLine, A_LoopField)
               Process.Terminate
   }
   return

GetSelectedFiles(hwnd="")
{
   if (hwnd = "")
      WinGet, hwnd,, A
   
   objShell := ComObjCreate("Shell.Application")
   
   for window in objShell.Windows
      if (window.hwnd = hwnd && ShellWindow := 1)
         Break

   if !ShellWindow
      return
   
   for item in window.document.SelectedItems
      if !item.IsFolder
         ret .= item.path . "`n"
   
   Return SubStr(ret, 1, -1)
}

Работает со множественным выделением.

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

7

Re: AHK: Определить процесс выделенного файла и закрыть его

Здравствуйте  teadrinker ваш скрипт не работает.

OS: Win11x64, AutoHotkey v1.1.25.01 (Unicode 64-bit).

8

Re: AHK: Определить процесс выделенного файла и закрыть его

А как вы пробовали?

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

9 (изменено: Ядрён, 2014-03-09 23:32:34)

Re: AHK: Определить процесс выделенного файла и закрыть его

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

OS: Win11x64, AutoHotkey v1.1.25.01 (Unicode 64-bit).

10

Re: AHK: Определить процесс выделенного файла и закрыть его

Ядрён пишет:

Не работает с ярлыками программ и на рабочем столе не работает

А, да, забыл предупредить. Посмотрю, как на рабочем столе можно путь получить.

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

11

Re: AHK: Определить процесс выделенного файла и закрыть его

teadrinker пишет:
Ядрён пишет:

Не работает с ярлыками программ и на рабочем столе не работает

А, да, забыл предупредить. Посмотрю, как на рабочем столе можно путь получить.

Было бы неплохо если бы работало на рабочем столе.

OS: Win11x64, AutoHotkey v1.1.25.01 (Unicode 64-bit).

12

Re: AHK: Определить процесс выделенного файла и закрыть его

Вот так должно работать на рабочем столе и с ярлыками:

F11::
   if !SelectedItems := GetSelectedFiles()
   {
      MsgBox, Не найдено выделенных файлов в активном окне
      return
   }
   
   Processes := ComObjGet("winmgmts:").InstancesOf("Win32_Process")
   Loop, parse, SelectedItems, `n
   {
      if SubStr(A_LoopField, -3) = ".lnk"
         FileGetShortcut, % A_LoopField, FilePath
      else
         FilePath := A_LoopField
      
      if !FileExist(FilePath)
      {
         MsgBox, Ошибка
         return
      }
      
      if SubStr(FilePath, -3) = ".exe"
      {
         for Process in Processes
            if (Process.ExecutablePath = FilePath)
               Process.Terminate
      }
      else ;if SubStr(FilePath, -3) = ".ahk   ; если нужно проверять только ahk-файлы, убрать точку с запятой
         for Process in Processes
            if InStr(Process.CommandLine, FilePath)
               Process.Terminate
   }
   return

GetSelectedFiles(hwnd="")
{
   if (hwnd = "")
      WinGet, hwnd,, A
   
   WinGetClass, Class, ahk_id %hwnd%
   if (Class = "Progman")
   {
      ClipSaved := ClipboardAll
      Clipboard := ""
      SendInput, ^{vk43}
      ClipWait, 1
      if ErrorLevel
      {
         Clipboard := TempClipboard
         return
      }
      var := Clipboard, Clipboard := ClipSaved
      Return var
   }
   else
   {
      objShell := ComObjCreate("Shell.Application")
      
      for window in objShell.Windows
         if (window.hwnd = hwnd && ShellWindow := 1)
            Break

      if !ShellWindow
         return
      
      for item in window.document.SelectedItems
         if !item.IsFolder
            ret .= item.path . "`n"
      
      Return SubStr(ret, 1, -1)
   }
}
Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

13

Re: AHK: Определить процесс выделенного файла и закрыть его

Огромное вам спасибо teadrinker.Скрипт надо бы в коллекцию закинуть.

OS: Win11x64, AutoHotkey v1.1.25.01 (Unicode 64-bit).

14

Re: AHK: Определить процесс выделенного файла и закрыть его

Ядрён пишет:

Скрипт надо бы в коллекцию закинуть.

Не знаю, способ получения выделенных файлов с рабочего стола — посыл Ctrl + C — считается "кривым", но лучшего не обнаружил, может, подскажет кто.

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

15 (изменено: Ядрён, 2014-03-10 23:55:48)

Re: AHK: Определить процесс выделенного файла и закрыть его

teadrinker пишет:
Ядрён пишет:

Скрипт надо бы в коллекцию закинуть.

Не знаю, способ получения выделенных файлов с рабочего стола — посыл Ctrl + C — считается "кривым", но лучшего не обнаружил, может, подскажет кто.

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

OS: Win11x64, AutoHotkey v1.1.25.01 (Unicode 64-bit).

16

Re: AHK: Определить процесс выделенного файла и закрыть его

teadrinker пишет:
Ядрён пишет:

Скрипт надо бы в коллекцию закинуть.

Не знаю, способ получения выделенных файлов с рабочего стола — посыл Ctrl + C — считается "кривым", но лучшего не обнаружил, может, подскажет кто.

Скорее всего напишу глупость, но самому немного интересно.
При выделении файла на рабочем столе в c:\Documents and Settings\Username\Рабочий стол\ что-нибудь меняется? И если нет, то чем исчерпывается соответствие - только наличием объектов?

17

Re: AHK: Определить процесс выделенного файла и закрыть его

Выделение объекта в окне имеет отношение только к отображению этого объекта в данном окне, на сам объект и на отображение его в других окнах никак не влияет.

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

18

Re: AHK: Определить процесс выделенного файла и закрыть его

teadrinker пишет:
Ядрён пишет:

Скрипт надо бы в коллекцию закинуть.

Не знаю, способ получения выделенных файлов с рабочего стола — посыл Ctrl + C — считается "кривым", но лучшего не обнаружил, может, подскажет кто.

Мне такая библиотека помогает:


/*
    Library for getting info from a specific explorer window (if window handle not specified, the currently active
    window will be used).  Requires AHK_L or similar.  Works with the desktop.  Does not currently work with save
    dialogs and such.
    
    
    Explorer_GetSelected(hwnd="")   - paths of target window's selected items
    Explorer_GetAll(hwnd="")        - paths of all items in the target window's folder
    Explorer_GetPath(hwnd="")       - path of target window's folder
    
    example:
        F1::
            path := Explorer_GetPath()
            all := Explorer_GetAll()
            sel := Explorer_GetSelected()
            MsgBox % path
            MsgBox % all
            MsgBox % sel
        return
    
    Joshua A. Kinnison
    2011-04-27, 16:12
    http://www.autohotkey.com/board/topic/60985-get-paths-of-selected-items-in-an-explorer-window/
*/

Explorer_GetPath(hwnd="")
{
    if !(window := Explorer_GetWindow(hwnd))
        return ErrorLevel := "ERROR"
    if (window="desktop")
        return A_Desktop
    path := window.LocationURL
    path := RegExReplace(path, "ftp://.*@","ftp://")
    StringReplace, path, path, file:///
    StringReplace, path, path, /, \, All 
    
    ; thanks to polyethene
    Loop
        If RegExMatch(path, "i)(?<=%)[\da-f]{1,2}", hex)
            StringReplace, path, path, `%%hex%, % Chr("0x" . hex), All
        Else Break
    return path
}
Explorer_GetAll(hwnd="")
{
    return Explorer_Get(hwnd)
}
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")
    {
        ControlGet, hwWindow, HWND,, SysListView321, ahk_class Progman
        if !hwWindow ; #D mode
            ControlGet, hwWindow, HWND,, SysListView321, A
        ControlGet, files, List, % ( selection ? "Selected":"") "Col1",,ahk_id %hwWindow%
        base := SubStr(A_Desktop,0,1)=="\" ? SubStr(A_Desktop,1,-1) : A_Desktop
        Loop, Parse, files, `n, `r
        {
            path := base "\" A_LoopField
            IfExist %path% ; ignore special icons like Computer (at least for now)
                ret .= path "`n"
        }
    }
    else
    {
        if selection
            collection := window.document.SelectedItems
        else
            collection := window.document.Folder.Items
        for item in collection
            ret .= item.path "`n"
    }
    return Trim(ret,"`n")
}


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

19

Re: AHK: Определить процесс выделенного файла и закрыть его

serzh82saratov пишет:

Мне такая библиотека помогает

Не отличает ярлык на рабочем столе от обычного файла.

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

20 (изменено: stealzy, 2014-03-25 18:38:12)

Re: AHK: Определить процесс выделенного файла и закрыть его

определить процесс выделенного файла и закрыть его

Для ручного использования советую Unlocker 1.8.7 или IObitUnloker
(может не знает человек)

21

Re: AHK: Определить процесс выделенного файла и закрыть его

stealzy, а как здесь Unlocker поможет?

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

22

Re: AHK: Определить процесс выделенного файла и закрыть его

stealzy пишет:

http://i.imgur.com/h9EuvrE.png


У меня с Unlocker`ом так выглядит:

http://i.imgur.com/tiU7zLV.jpg

Файл скрипта при запуске не блокируется, да и из предложенных операций делать с ним ничего не нужно.

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

23

Re: AHK: Определить процесс выделенного файла и закрыть его

teadrinker пишет:
Ядрён пишет:

Скрипт надо бы в коллекцию закинуть.

Не знаю, способ получения выделенных файлов с рабочего стола — посыл Ctrl + C — считается "кривым", но лучшего не обнаружил, может, подскажет кто.

Возможно придумал способ, но банально не могу проверить наличие %info% в %Selected%, у строк почему то разная длинна, и так и эдак перекодировал строки, не понятно.


GetSelectedDesktop()  
Return

GetSelectedDesktop()   {
    Static objShellApp := ComObjCreate("Shell.Application")
    ControlGet, Selected, List, Selected, SysListView321, Program Manager ahk_class Progman ahk_exe explorer.exe
    objFolder := objShellApp.NameSpace(A_Desktop)
    
    arrSelected := StrSplit(Selected, "`n", "`r")   ;  потом извлекается первый выделенный для наглядности сравнения
    CoordMode, ToolTip, Screen   
    ToolTip % Selected, 5, 5  

    Loop, %A_Desktop%\*.*, 1
    {
        objItem := objFolder.ParseName(A_LoopFileName), info := ""
        
        Loop 4 
            info .= objFolder.GetDetailsOf(objItem, A_Index-1) . A_Tab
            
        info := Clipboard := RTrim(info, A_Tab) 
        
        MsgBox % StrLen(info) "`n" info 
            . "`n`n" StrLen(arrSelected[1]) "`n" arrSelected[1] 
            . "`n`n" A_LoopFileName
        
        IfInString, Selected, %info%
            MsgBox % "Выделено:`n" A_LoopFileName
    }
}
По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

24 (изменено: serzh82saratov, 2014-05-25 00:43:48)

Re: AHK: Определить процесс выделенного файла и закрыть его

Без сравнения дат работает, по идее оно и не обязательно, повтора быть не должно. Определяет и папки и ярлыки. Активность или видимость окна Program Manager не требуется.


1:: ToolTip % GetSelectedDesktop() 
 
GetSelectedDesktop()   { 
    ControlGet, hwnd, HWND,, SysListView321, Program Manager ahk_class Progman ahk_exe explorer.exe
    
    If !hwnd   ;  Win+D mode
        ControlGet, hwnd, HWND,, SysListView321, ahk_class WorkerW ahk_exe explorer.exe

    ControlGet, SelectedCount, List, Count Selected, , ahk_id %hwnd% 
 
    If !SelectedCount
        Return "Ничего не выделено"
        
    ControlGet, ListSelected, List, Selected, , ahk_id %hwnd%   
    objShellApp := ComObjCreate("Shell.Application")
    objFolder := objShellApp.NameSpace(A_Desktop)  
    
    Loop, %A_Desktop%\*.*, 1
    {
        objItem := objFolder.ParseName(A_LoopFileName), info := ""
        
        Loop 3
            info .= objFolder.GetDetailsOf(objItem, A_Index - 1) . A_Tab
    
        IfInString, ListSelected, %info%
            SelectedItems .= A_LoopFileLongPath . (objItem.IsFolder ? "  ::  Это папка" : "") . "`n"
    } 
    Return RTrim(SelectedItems, "`n")
}

Но конечно очень любопытно, почему в контексте этого кода, тут ложь:


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

25

Re: AHK: Определить процесс выделенного файла и закрыть его

serzh82saratov, интересно, посмотрю подробнее и добавлю попозже.

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

26

Re: AHK: Определить процесс выделенного файла и закрыть его

serzh82saratov пишет:

не могу проверить наличие %info% в %Selected%, у строк почему то разная длинна

Там в ListSelected ещё какие-то непечатные символы добавлены перед датой и между её цифрами:

GetSelectedDesktop()  
Return

GetSelectedDesktop()   {
    Static objShellApp := ComObjCreate("Shell.Application")
    ControlGet, Selected, List, Selected, SysListView321, Program Manager ahk_class Progman ahk_exe explorer.exe
    objFolder := objShellApp.NameSpace(A_Desktop)
    
    arrSelected := StrSplit(Selected, "`n", "`r")   ;  потом извлекается первый выделенный для наглядности сравнения
    CoordMode, ToolTip, Screen   
    ToolTip % Selected, 5, 5  

    Loop, %A_Desktop%\*.*, 1
    {
        objItem := objFolder.ParseName(A_LoopFileName), info := ""
        
        Loop 4 
            info .= objFolder.GetDetailsOf(objItem, A_Index-1) . A_Tab
            
        info := Clipboard := RTrim(info, A_Tab) 
        
        MsgBox % StrLen(info) "`n" info 
            . "`n`n" StrLen(arrSelected[1]) "`n" arrSelected[1] 
            . "`n`n" A_LoopFileName
         str := arrSelected[1]
         Loop, parse, str
            MsgBox, % A_Index "`n" A_LoopField "`n" Asc(A_LoopField)
        
        IfInString, Selected, %info%
            MsgBox % "Выделено:`n" A_LoopFileName
    }
}
Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

27

Re: AHK: Определить процесс выделенного файла и закрыть его

Видимо в SysListView так забито.

Немного сократил:


1:: ToolTip % GetSelectedDesktop()
 
GetSelectedDesktop()   {
    ControlGet, hwnd, HWND, , SysListView321, % "ahk_id" DllCall("GetShellWindow")
    If !hwnd   ;  Win+D mode
        ControlGet, hwnd, HWND, , SysListView321, ahk_class WorkerW ahk_exe explorer.exe 
    ControlGet, ListSelected, List, Selected, , ahk_id %hwnd% 
    objFolder := ComObjCreate("Shell.Application").NameSpace(A_Desktop) 
    Loop, %A_Desktop%\*.*, 1
    {
        objItem := objFolder.ParseName(A_LoopFileName), info := "" 
        Loop 3
            info .= objFolder.GetDetailsOf(objItem, A_Index - 1) A_Tab 
        IfInString, ListSelected, %info%
            SelectedItems .= A_LoopFileLongPath "`n"
    } 
    Return RTrim(SelectedItems, "`n")
}
По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

28

Re: AHK: Определить процесс выделенного файла и закрыть его

serzh82saratov пишет:

Немного сократил:

В смысле, пробелы между строчками убрал?

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

29

Re: AHK: Определить процесс выделенного файла и закрыть его

Убрал определение папки, лишнее получение объекта.
Заменил  Program Manager ahk_class Progman ahk_exe explorer.exe на более простое % "ahk_id" DllCall("GetShellWindow").
Кстати может лучше так:


    ControlGet, hwnd, HWND,, SysListView321
        , % DllCall("GetTopWindow", "Int", id:=DllCall("GetShellWindow")) 
        ? "ahk_id" id : "ahk_class WorkerW ahk_exe explorer.exe"
По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

30

Re: AHK: Определить процесс выделенного файла и закрыть его

Не принципиально, лишь бы работало. А что за "Win+D mode"? Там класс окна меняется?

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

31

Re: AHK: Определить процесс выделенного файла и закрыть его

А что за "Win+D mode"? Там класс окна меняется?

Сначала сделал просто Program Manager ahk_class Progman ahk_exe explorer.exe.
Потом заметил что если свернуть все окна кнопкой TrayShowDesktopButtonWClass1 справа внизу оно же Win+D, то не работает. Потом подсмотрел в библиотеке Explorer.
Почему класс меняется - одну Биллу известно, сначала думал что задача определить хэндл ListView более тривиальна.

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

32

Re: AHK: Определить процесс выделенного файла и закрыть его

Только что заметил, что objFolder.ParseName(A_LoopFileName) не все ярлыки видит. У меня есть один ярлык, созданный самой программой при установке (IE HTML Element Spy), его в упор не замечает.

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

33 (изменено: serzh82saratov, 2014-05-25 14:48:40)

Re: AHK: Определить процесс выделенного файла и закрыть его

В смысле его нет как файла в Loop, %A_Desktop%\*.*, 1, или GetDetailsOf пустое.
И как он выглядит в ListSelected.

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

34

Re: AHK: Определить процесс выделенного файла и закрыть его

Ага, точно, его нет в папке рабочего стола:

+ открыть спойлер

http://i.imgur.com/ofPrtZW.jpg

Зато он есть в папке C:\Users\Public\Desktop (общий рабочий стол):

+ открыть спойлер

http://i.imgur.com/DaXuixJ.jpg

Наверное, и её проверять нужно.

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

35

Re: AHK: Определить процесс выделенного файла и закрыть его

Так?


1:: ToolTip % GetSelectedDesktop()

GetSelectedDesktop()   {
    ControlGet, hwnd, HWND,, SysListView321
        , % DllCall("GetTopWindow", "Int", id:=DllCall("GetShellWindow")) 
        ? "ahk_id" id : "ahk_class WorkerW ahk_exe explorer.exe"
    ControlGet, ListSelected, List, Selected, , ahk_id %hwnd% 
    For k, Folder in [A_Desktop, A_DesktopCommon]
    { 
        objFolder := ComObjCreate("Shell.Application").NameSpace(Folder) 
        Loop, %Folder%\*.*, 1
        {
            objItem := objFolder.ParseName(A_LoopFileName), info := "" 
            Loop 3
                info .= objFolder.GetDetailsOf(objItem, A_Index - 1) A_Tab 
            IfInString, ListSelected, %info%
                SelectedItems .= A_LoopFileLongPath "`n"
        } 
    }  
    Return RTrim(SelectedItems, "`n")
}
По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

36

Re: AHK: Определить процесс выделенного файла и закрыть его

Ага, так работает.

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

37

Re: AHK: Определить процесс выделенного файла и закрыть его

Не совсем, если 2 файла одинаковых в этих папках
Сейчас подумаю.

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

38

Re: AHK: Определить процесс выделенного файла и закрыть его

Если оба файла скрыты, то видимо ничего не поделаешь.

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

39

Re: AHK: Определить процесс выделенного файла и закрыть его

Не совсем понял. Если они скрыты, то как их можно выделить?

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

40

Re: AHK: Определить процесс выделенного файла и закрыть его

Я про атрибут "скрытый". Вообщем не важно. Можно всё таки добавить сравнение дат, останется только вероятность что одинаковые файлы изменены в одну секунду.

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

41

Re: AHK: Определить процесс выделенного файла и закрыть его

Можно, придётся сравнивать дату по частям.

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

42 (изменено: serzh82saratov, 2014-05-25 23:29:42)

Re: AHK: Определить процесс выделенного файла и закрыть его

Зачем по частям, можно привести ListSelected в "порядок", правда не очень симпатяшно:


    Loop, parse, SelectedList, `n
    ListSelected .= SubStr(A_LoopField, 1, p:=InStr(A_LoopField, A_Tab, , 0, 1)) 
                    . RegExReplace(SubStr(A_LoopField, p+1), "[^\d \:\.]") . "`n"

1:: ToolTip % GetSelectedDesktop()
 
GetSelectedDesktop()   {
    ControlGet, hwnd, HWND,, SysListView321
        , % DllCall("GetTopWindow", "Int", id:=DllCall("GetShellWindow")) 
        ? "ahk_id" id : "ahk_class WorkerW ahk_exe explorer.exe"
    ControlGet, GetList, List, Selected, , ahk_id %hwnd% 
    Loop, parse, GetList, `n
        ListSelected .= SubStr(A_LoopField, 1, p:=InStr(A_LoopField, A_Tab, , 0, 1)) 
                    . RegExReplace(SubStr(A_LoopField, p+1), "[^\d \:\.]") . "`n"
    For k, Folder in [A_Desktop, A_DesktopCommon]
    { 
        objFolder := ComObjCreate("Shell.Application").NameSpace(Folder)  
        Loop, %Folder%\*.*, 1
        {
            objItem := objFolder.ParseName(A_LoopFileName), info := "" 
            Loop 4
                info .= objFolder.GetDetailsOf(objItem, A_Index - 1) . (A_Index = 4 ? "" : A_Tab)
            IfInString, ListSelected, %info%
                SelectedItems .= A_LoopFileLongPath "`n"
        } 
    }  
    Return RTrim(SelectedItems, "`n")
}
По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

43

Re: AHK: Определить процесс выделенного файла и закрыть его

Возможно и так "сойдёт".


ListSelected := RegExReplace(ListSelected, "i)[^а-яё\w\s\:\.]") 
По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

44 (изменено: serzh82saratov, 2014-05-26 00:45:40)

Re: AHK: Определить процесс выделенного файла и закрыть его

Нашёл на форуме:

Check the command list exposed to SAPI by Windows Explorer. This may be a good candidate to solve with a file association if explorer exposes verbs from file associations.

Anyway, if you want to launch a program to find currently selected desktop items, you can use IFolderView2::GetSelectedItem on the desktop shell view to get the selected indices, then call IShellItem::GetDisplayName with SIGDN_FILESYSPATH on each item from IFolderView2::GetItem. On XP you can try send the undocumented WM_GETISHELLBROWSER message to the desktop window, then call IShellFolders::GetDisplayName on the items returned from IShellFolderView::GetSelectedObject.

Но примера создания объекта IFolderView2, нигде не видел.

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

45

Re: AHK: Определить процесс выделенного файла и закрыть его

Разберёшься?

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

46

Re: AHK: Определить процесс выделенного файла и закрыть его

Смеёшься, нет конечно, на тебя вся надежда.

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

47

Re: AHK: Определить процесс выделенного файла и закрыть его

Ладно, попробую.

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

48

Re: AHK: Определить процесс выделенного файла и закрыть его

Может это как то поможет - http://msdn.microsoft.com/en-us/library … s.85).aspx.

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

49

Re: AHK: Определить процесс выделенного файла и закрыть его

Да нет, не поможет. То, о чём шла речь в той подсказке, не является "Scriptable Shell Objects". Это так называемые Raw Com-интерфейсы, использовать в скриптах которые можно только после некоторых танцев с бубнами. И я не уверен, что подсказка верная, никакой информации, как получить IFolderView2-интерфейс для рабочего стола не нашёл. Всё же, речь идёт о Shell-интерфейсах, а окно рабочего стола Shell-объектом не является, вроде.

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

50

Re: AHK: Определить процесс выделенного файла и закрыть его

Странно что упоминаний про IFolderView2 нет на офф форуме. Здесь может по теме -
http://www.autohotkey.com/board/topic/5 … ntry434509

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

51 (изменено: serzh82saratov, 2014-05-26 13:52:55)

Re: AHK: Определить процесс выделенного файла и закрыть его

Вот ещё нечто, отсюда - http://www.autohotkey.com/board/topic/8 … ntry533711


Path := "c:\"
File := "Stuff.txt"
pidl := 0
 
; Get IShellFolder interface for the desktop folder - I think this works
HResult := DllCall("Shell32\SHGetDesktopFolder", "Ptr*", DesktopFolder)
MsgBox % HResult

; Try to call ParseDisplayName method - This fails
HResult := DllCall(vtable(DesktopFolder, 3), "Ptr", DesktopFolder, "ptr",0, "ptr", 0, "Str", path, "ptr", 0, "ptr*", pidl, "ptr", 0)
MsgBox % HResult
return

vtable(ptr, n) {
    ; NumGet(ptr+0) returns the address of the object's virtual function
    ; table (vtable for short). The remainder of the expression retrieves
    ; the address of the nth function's address from the vtable.
    return NumGet(NumGet(ptr+0), n*A_PtrSize)
}
По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

52

Re: AHK: Определить процесс выделенного файла и закрыть его

Тут вроде тоже мучаются с IFolderView2.

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

53

Re: AHK: Определить процесс выделенного файла и закрыть его

А зачем мучиться, если можно почитать описание интерфейса?

54

Re: AHK: Определить процесс выделенного файла и закрыть его

YMP Можете привести пример получения объекта IFolderView2, и работы с ним?

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

55

Re: AHK: Определить процесс выделенного файла и закрыть его

serzh82saratov пишет:

Вот ещё нечто, отсюда

Так там речь, я так понимаю, не об окне "Рабочий стол", а о папке "Рабочий стол". Может, я ошибаюсь, конечно.

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

56

Re: AHK: Определить процесс выделенного файла и закрыть его

Тебе виднее, а по ссылке из #50 ничего?

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

57

Re: AHK: Определить процесс выделенного файла и закрыть его

Ещё подробно не смотрел, но не похоже.

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

58

Re: AHK: Определить процесс выделенного файла и закрыть его

А это какое то отношение может иметь http://msdn.microsoft.com/en-us/library … s.85).aspx? Может где то в памяти процесса искать.

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

59

Re: AHK: Определить процесс выделенного файла и закрыть его

Посмотрю вечером.

YMP пишет:

А зачем мучиться, если можно почитать описание интерфейса?

К сожалению, в описаниях интерфейса ничего не сказано, как его получать.

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

60

Re: AHK: Определить процесс выделенного файла и закрыть его

Любой COM-объект имеет интерфейс IUnknown, а у него первый метод — QueryInterface, как раз для получения других интерфейсов.

61

Re: AHK: Определить процесс выделенного файла и закрыть его

Так вопрос даже не столько в том, как его просто получить, а как привязать к конкретному объекту, в данном случае к окну рабочего стола (если это возможно, конечно).

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

62

Re: AHK: Определить процесс выделенного файла и закрыть его

Что значит привязать?

63

Re: AHK: Определить процесс выделенного файла и закрыть его

Нас сейчас интересует интерфейс IFolderView2. У него есть методы GetSelectedItem и GetSelection. Нужно, чтобы они отражали состояние объектов окна Рабочий стол.

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

64

Re: AHK: Определить процесс выделенного файла и закрыть его

Да, это не скриптовый интерфейс. Кроме того он доступен только начиная с Висты. До этого использовался IShellFolderView, но он уже не работает в 7. В принципе методы можно вызывать через DllCall, но, конечно, возни больше, чем со скриптовыми объектами.

65

Re: AHK: Определить процесс выделенного файла и закрыть его

Ну, как в принципе вызывать — уже более-менее понятно, хотелось эту задачку решить.

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

66

Re: AHK: Определить процесс выделенного файла и закрыть его

Вот так вроде удаётся получить указатель на IFolderView2. Дальше копать пока не стал, спать охота.


DllCall("shell32\SHGetDesktopFolder", "ptr *", pShellFolder)
VarSetCapacity(CSFV, A_PtrSize * 7, 0)
NumPut(A_PtrSize * 7, CSFV, 0, "uint")
NumPut(pShellFolder, CSFV, A_PtrSize, "ptr")
DllCall("shell32\SHCreateShellFolderViewEx", "ptr", &CSFV, "ptr *", pShellView)
pVTable := NumGet(pShellView + 0, 0, "ptr")
pQueryInterface := NumGet(pVTable + 0, 0, "ptr")
iidFolderView2 := "{1af3a467-214f-4298-908e-06b03e0b39f9}"
VarSetCapacity(iidfv2, 16, 0)
DllCall("ole32\IIDFromString", "wstr", iidFolderView2, "ptr", &iidfv2)
hres := DllCall(pQueryInterface, "ptr", pShellView, "ptr", &iidfv2, "ptr *", pFolderView2, "uint")

MsgBox, %hres% %pFolderView2%

67

Re: AHK: Определить процесс выделенного файла и закрыть его

Ядрён сумел напрячь умы лучших AHK-кодеров форума!

68

Re: AHK: Определить процесс выделенного файла и закрыть его

YMP пишет:

Дальше копать пока не стал, спать охота.

Мне тоже, уже завтра посмотрю.

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

69

Re: AHK: Определить процесс выделенного файла и закрыть его

Попробовал вызывать методы — возвращают E_FAIL. Причина пока непонятна.

70

Re: AHK: Определить процесс выделенного файла и закрыть его

В общем, это всё фигня, наверно. Просто новый экземпляр объекта создаётся. То же самое, как открыть одну папку в двух окнах Проводника. Если в одном окне что-то выделить, другое об этом ничего не узнает.

71

Re: AHK: Определить процесс выделенного файла и закрыть его

А ты вообще уверен, что вызывая

DllCall("shell32\SHGetDesktopFolder", "ptr *", pShellFolder)

ты получаешь pShellFolder для окна рабочего стола, а не для папки "Рабочий стол"? И если да, то почему?

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

72 (изменено: YMP, 2014-05-28 07:29:45)

Re: AHK: Определить процесс выделенного файла и закрыть его

А что такое ShellFolder для окна Рабочего стола? Насколько я понял описательную часть, если программа хочет отобразить содержимое какой-то папки оболочки, она получает объект ShellFolder этой папки, создаёт окно и в нём отображает с помощью этого объекта содержимое папки. Вот это и делает Проводник на Рабочем столе.

Если ты в другом процессе (AutoHotkey) тоже получишь объект ShellFolder для этой папки, то это будет лично твой экземпляр объекта. Ты его можешь использовать для тех же целей, но никакой связи с тем экземпляром, что использует Проводник, у него нет, и, соответственно, тебе никак через него не узнать, что там у Проводника выделено. Поскольку в самой папке это выделение никак не отражается.

А если ты каким-то образом узнаешь указатель на объект, используемый Проводником, то что ты с ним будешь делать? Это адрес в адресном пространстве Проводника, а не в процессе AutoHotkey.

73

Re: AHK: Определить процесс выделенного файла и закрыть его

Но ведь скриптовый Shell.Application может работать с окнами, созданными в других процессах. Другое дело, окно Рабочего стола по моим представлениям к Shell-окнам не относится (поправь меня, если ошибаюсь), поэтому применять для работы с ним Shell-интерфейсы изначально бессмысленно. Какой-то другой подход нужен.

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

74

Re: AHK: Определить процесс выделенного файла и закрыть его

Может, но как он это делает, неизвестно. Через какой-то опосредующий код.

Окон Рабочего стола два, насколько я понимаю. Одно — это корневое окно вообще, а второе — корневое окно оболочки, и именно в нём находятся значки Рабочего стола.

GetDesktopWindow Function

The GetDesktopWindow function returns a handle to the desktop window. The desktop window covers the entire screen. The desktop window is the area on top of which other windows are painted.

GetShellWindow Function

The GetShellWindow function returns a handle to the Shell's desktop window.

75 (изменено: serzh82saratov, 2014-05-28 18:18:38)

Re: AHK: Определить процесс выделенного файла и закрыть его

Может где то в памяти искать, вот пара тем:
http://www.autohotkey.com/board/topic/6 … ons/page-2
http://www.autohotkey.com/board/topic/4 … s-delphic/

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

76

Re: AHK: Определить процесс выделенного файла и закрыть его

А причём тут это? Там позиции иконок определяются. Я такое тоже пару лет назад писал.

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

77

Re: AHK: Определить процесс выделенного файла и закрыть его

Где то ведь должны быть полные пути к файлам, с привязкой к позиции в ListView.

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

78

Re: AHK: Определить процесс выделенного файла и закрыть его

Почему, позиция в ListView может быть любой. Там речь идёт о физической позиции на экране.

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

79

Re: AHK: Определить процесс выделенного файла и закрыть его

Там я понял что про позицию, Я про то что в памяти процесса рабочего стола они ведь что то ищут, и находят. Может там и полные пути есть. Под позицией в нашем случае я подразумеваю не координаты иконки, а индекс порядка отображения строки в ListView.

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

80

Re: AHK: Определить процесс выделенного файла и закрыть его

serzh82saratov пишет:

Я про то что в памяти процесса рабочего стола они ведь что то ищут, и находят.

Ну просто мистика какая-то, не иначе.
На самом деле просто читают из памяти процесса проводника результаты сообщений LVM_GETITEMPOSITION, LVM_GETITEM. Если найдёшь сообщение, которое возвратит путь к файлу выделенного пункта в ListView, тоже прочитаем.

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

81

Re: AHK: Определить процесс выделенного файла и закрыть его

А путь мы можем увидеть только выбрав в меню  - свойства....

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

82

Re: AHK: Определить процесс выделенного файла и закрыть его

Это всё чтобы Ctrl+C не посылать?

83 (изменено: serzh82saratov, 2014-05-28 21:30:02)

Re: AHK: Определить процесс выделенного файла и закрыть его

ypppu
Ну да.

teadrinker пишет:

На самом деле просто читают из памяти процесса проводника результаты сообщений

А что там будет, если послать WM_COPY?

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

84

Re: AHK: Определить процесс выделенного файла и закрыть его

Для начала почитай его описание. Но ход твоих мыслей понятен. Только чем это лучше Ctrl + C, если там всё равно буфер обмена используется?

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

85

Re: AHK: Определить процесс выделенного файла и закрыть его

Русско язычный чейтатель вроде меня, мало что поймёт наверняка, потому уж лучше у тебя уточнить.

Только чем это лучше Ctrl + C, если там всё равно буфер обмена используется?

Не знаю, возможно можно в неактивное окно отправить. Ещё думал что можно будет в ErrorLevel проверить успех, но видимо нет:

This message does not return a value.

Ну а буфер то пусть и используется, его же вернуть можно. Тут по моему главный недостаток именно в посыле нажатия клавиш Ctrl + C, и обязательно в активное окно.

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

86

Re: AHK: Определить процесс выделенного файла и закрыть его

serzh82saratov пишет:

Русско язычный чейтатель вроде меня, мало что поймёт наверняка, потому уж лучше у тебя уточнить.

MSDN пишет:

An application sends the WM_COPY message to an edit control or combo box to copy the current selection to the clipboard in CF_TEXT format.

Понятно, что это не тот случай.

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

87

Re: AHK: Определить процесс выделенного файла и закрыть его

Ну да, глупое предположение.

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

88

Re: AHK: Определить процесс выделенного файла и закрыть его

В Installer.ahk есть такая функция.


ShellRun(prms*)
{
    shellWindows := ComObjCreate("{9BA05972-F6A8-11CF-A442-00A0C90A8F39}")
    
    desktop := shellWindows.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) = 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:=0)
           
            ; Get Shell object.
            shell := ComObj(9,pdisp,1).Application
           
            ; IShellDispatch2.ShellExecute
            shell.ShellExecute(prms*)
           
            ObjRelease(psv)
        }
        ObjRelease(ptlb)
    }
}

В ней что то про DESKTOP.

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

89

Re: AHK: Определить процесс выделенного файла и закрыть его

Надо посмотреть.

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

90

Re: AHK: Определить процесс выделенного файла и закрыть его

Да, это работает. Вот так, например.


F11::
    SelectedItems := DesktopGetSelectedItems()
    Loop, % SelectedItems.Count
        MsgBox, % SelectedItems.Item(A_Index - 1).Name
Return
    

DesktopGetSelectedItems()
{
    shellWindows := ComObjCreate("{9BA05972-F6A8-11CF-A442-00A0C90A8F39}")
    
    desktop := shellWindows.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) = 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:=0)
           
            Items := ComObjEnwrap(pdisp).SelectedItems()
            ObjRelease(psv)
        }
        ObjRelease(ptlb)
    }
    return Items
}

91

Re: AHK: Определить процесс выделенного файла и закрыть его

YMP, круто!
А тут

ComObjEnwrap(pdisp)

мы получаем объект IFolderView2 принадлежащий рабочему столу, и можем использовать все методы по ссылке? И возможно ли получать его для других окон проводника?

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

92

Re: AHK: Определить процесс выделенного файла и закрыть его

Нет, это IShellFolderViewDual, насколько понимаю. Про другие окна не знаю пока.

93

Re: AHK: Определить процесс выделенного файла и закрыть его

Кстати, на XP SP3 вот это не работает:


if ptlb := ComObjQuery(desktop
        , "{4C96BE40-915C-11CF-99D3-00AA004AE837}"  ; SID_STopLevelBrowser
        , "{000214E2-0000-0000-C000-000000000046}") ; IID_IShellBrowser

No valid COM object.

94

Re: AHK: Определить процесс выделенного файла и закрыть его

А почему так, ведь:

IShellFolderViewDual  пишет:

Minimum supported client Windows XP desktop apps only

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

95

Re: AHK: Определить процесс выделенного файла и закрыть его

Собственно, там проблема выше, где получается объект desktop. Константа SCW_DESKTOP введена только в Висте. Поэтому в XP получить таким образом desktop не удаётся.

96

Re: AHK: Определить процесс выделенного файла и закрыть его

serzh82saratov пишет:

И возможно ли получать его для других окон проводника?

А зачем для других окон? В других работает Shell.Application.

YMP пишет:

Вот так, например.

Наверное, лучше так:

IShellFolderViewDual := GetDesktopIShellFolderViewDual()
Return
    
F11::
    for item in IShellFolderViewDual.SelectedItems
        MsgBox, % item.Path
Return
    

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
}

Пробовал получить IShellBrowser для XP через WM_GETISHELLBROWSER, указатель возвращает, но выяснилось, что он в адресном пространстве проводника, так что для нас бесполезен.

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

97

Re: AHK: Определить процесс выделенного файла и закрыть его

teadrinker пишет:

Наверное, лучше так:

А чем лучше?

98

Re: AHK: Определить процесс выделенного файла и закрыть его

В смысле? Универсальностью, наверное. Получаем IShellFolderViewDual для рабочего стола, можем использовать и другие его методы.

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

99

Re: AHK: Определить процесс выделенного файла и закрыть его

Ну, в том смысле, что интересно стало, вот и спросил.

Универсальностью, наверное.

В смысле, "наверное"? Код-то ты писал или нет?

100

Re: AHK: Определить процесс выделенного файла и закрыть его

Ну, "писал" — это громко сказано. Так, скорректировал просто.

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