1

Тема: AHK: Получить полное имя файла под курсором

Нужно получить полное имя файла в проводнике над которым находится курсор, не кликая на файл.

2

Re: AHK: Получить полное имя файла под курсором

Можно получить путь только к выделенному файлу.

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

3

Re: AHK: Получить полное имя файла под курсором

А с помощью WinApi никак нельзя? Ведь в Windows, когда курсор над файлом, появляется всплывающая подсказка с информацией о файле. Это сообщение перехватить нельзя?

4

Re: AHK: Получить полное имя файла под курсором

А зачем? Там разве есть путь к файлу? У меня, во всяком случае, нет.

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

5

Re: AHK: Получить полное имя файла под курсором

Путь по идее можно взять из адресной строки, где-то была такая тема.  А как просто имя файла взять тогда?

6

Re: AHK: Получить полное имя файла под курсором

Оказалось не так уж сложно:

   LVM_FIRST := 0x1000
   LVM_GETITEMCOUNT := (LVM_FIRST + 4)
   LVM_GETTOPINDEX := (LVM_FIRST + 39)
   LVM_GETITEMRECT := (LVM_FIRST + 14)
   PROCESS_VM_OPERATION := 0x8
   PROCESS_VM_READ := 0x10
   MEM_COMMIT := 0x1000
   PAGE_READWRITE := 0x4
   MEM_RELEASE := 0x8000

   #Persistent
   SetBatchLines, -1
   CoordMode, Mouse
   VarSetCapacity(RECT, 16)
   SetTimer, MGP
   Return

MGP:
   MouseGetPos,,,, Control
   if !InStr(Control, "SysListView32")
   {
      ToolTip
      Return
   }
   
   MouseGetPos, XM, YM, Win_ID, LV_ID, 2
   if (YM = YM_Prev && XM = XM_Prev)
      Return
   
   WinGetPos, X_LV, Y_LW,,, ahk_id %LV_ID%
   WinGet, PID, PID, ahk_id %Win_ID%
   
   SendMessage, LVM_GETITEMCOUNT,,,, ahk_id %LV_ID%
   Rows := ErrorLevel
   SendMessage, LVM_GETTOPINDEX,,,, ahk_id %LV_ID%
   TopIndex := ErrorLevel
   ControlGet, Text, List, Col1,, ahk_id %LV_ID%

   Loop % Rows + 1 - TopIndex
   {
      CurrentItem := TopIndex + A_Index - 1
      
      hProcess := DllCall("OpenProcess", UInt, PROCESS_VM_OPERATION|PROCESS_VM_READ
                                       , UInt, 0
                                       , UInt, PID)
                                       
      pBuffer := DllCall("VirtualAllocEx", UInt, hProcess
                                         , UInt, 0
                                         , UInt, 4
                                         , UInt, MEM_COMMIT
                                         , UInt, PAGE_READWRITE)
                                         
      SendMessage, LVM_GETITEMRECT, CurrentItem, pBuffer,, ahk_id %LV_ID%
      DllCall("ReadProcessMemory", UInt, hProcess
                                 , UInt, pBuffer
                                 , UInt, &RECT
                                 , UInt, 16
                                 , UInt, 0)
                                 
      Left := NumGet(RECT), Right := NumGet(RECT, 8)
      Top := NumGet(RECT, 4), Bottom := NumGet(RECT, 12)
      
      DllCall("VirtualFreeEx", UInt, hProcess
                             , UInt, pBuffer
                             , UInt, 0
                             , UInt, MEM_RELEASE)
      DllCall("CloseHandle", UInt, hProcess)
      
      if (XM >= X_LV + Left && XM <= X_LV + Right && YM >= Y_LW + Top && YM <= Y_LW + Bottom)
      {
         Loop, parse, Text, `n
         {
            if (A_Index = CurrentItem + 1)
            {
               ToolTip % A_LoopField
               Break
            }
         }
      }
   }
   XM_Prev := XM, YM_Prev := YM
   Return
Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

7

Re: AHK: Получить полное имя файла под курсором

Ничего себе не сложно Спасибо)

8

Re: AHK: Получить полное имя файла под курсором

2teadrinker: коллега, пополняйте Коллекцию — думаю, будет востребовано.

9

Re: AHK: Получить полное имя файла под курсором

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

   LVM_FIRST := 0x1000
   LVM_GETITEMCOUNT := (LVM_FIRST + 4)
   LVM_GETTOPINDEX := (LVM_FIRST + 39)
   LVM_GETITEMRECT := (LVM_FIRST + 14)
   PROCESS_VM_OPERATION := 0x8
   PROCESS_VM_READ := 0x10
   MEM_COMMIT := 0x1000
   PAGE_READWRITE := 0x4
   MEM_RELEASE := 0x8000

   #Persistent
   Process, Priority,, H
   CoordMode, Mouse
   CoordMode, ToolTip
   VarSetCapacity(RECT, 16)
   SetTimer, MouseGetPos, 50
   Return

MouseGetPos:
   MouseGetPos,,,, Control
   if !InStr(Control, "SysListView32")
   {
      ToolTip
      Return
   }

   MouseGetPos, XM, YM, Win_ID, LV_ID, 2
   if (XM != XM_Prev || YM != YM_Prev)
   {
      ToolTip
      SetTimer, GetItem, -100
   }
   XM_Prev := XM, YM_Prev := YM
   Return

GetItem:
   WinGetPos, X_LV, Y_LW,,, ahk_id %LV_ID%
   WinGet, PID, PID, ahk_id %Win_ID%

   SendMessage, LVM_GETITEMCOUNT,,,, ahk_id %LV_ID%
   Rows := ErrorLevel
   SendMessage, LVM_GETTOPINDEX,,,, ahk_id %LV_ID%
   TopIndex := ErrorLevel
   ControlGet, Text, List, Col1,, ahk_id %LV_ID%

   Stop =
   While !Stop && (A_Index <= Rows - TopIndex)
   {
      CurrentItem := TopIndex + A_Index - 1

      hProcess := DllCall("OpenProcess", UInt, PROCESS_VM_OPERATION|PROCESS_VM_READ
                                       , UInt, 0
                                       , UInt, PID)

      pBuffer := DllCall("VirtualAllocEx", UInt, hProcess
                                         , UInt, 0
                                         , UInt, 16
                                         , UInt, MEM_COMMIT
                                         , UInt, PAGE_READWRITE)

      SendMessage, LVM_GETITEMRECT, CurrentItem, pBuffer,, ahk_id %LV_ID%
      DllCall("ReadProcessMemory", UInt, hProcess
                                 , UInt, pBuffer
                                 , UInt, &RECT
                                 , UInt, 16
                                 , UInt, 0)

      Left := NumGet(RECT), Right := NumGet(RECT, 8)
      Top := NumGet(RECT, 4), Bottom := NumGet(RECT, 12)

      DllCall("VirtualFreeEx", UInt, hProcess
                             , UInt, pBuffer
                             , UInt, 0
                             , UInt, MEM_RELEASE)
      DllCall("CloseHandle", UInt, hProcess)

      if (XM >= X_LV + Left && XM <= X_LV + Right && YM >= Y_LW + Top && YM <= Y_LW + Bottom)
      {
         Loop, parse, Text, `n
         {
            if (A_Index = CurrentItem + 1)
            {
               ToolTip, %A_LoopField%, XM+20, YM-5
               Stop = 1
               Break
            }
         }
      }
   }
   Return
Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

10

Re: AHK: Получить полное имя файла под курсором

Извините за глупый вопрос: А куда сохраняется определенный путь к файлу?

11

Re: AHK: Получить полное имя файла под курсором

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

12

Re: AHK: Получить полное имя файла под курсором

А где они отображаются то????!!! Запускаю скрипт, и ничего!  Совсем! В диспетчере задач процесс есть, а ничего нет. Как путь файла или имя отображаться должны, если определились?

13

Re: AHK: Получить полное имя файла под курсором

Имя файла отображается во всплывающей подсказке (ToolTip).

14

Re: AHK: Получить полное имя файла под курсором

Странно. У меня не показывает имя файла. Как было три графы ( Имя, Размер, Дата изменения) так и осталось. Я конечно никогда не пользовался такими сложными скриптами, больше для вызова приложения с горячей кнопки. Может что-то не так делаю?

15

Re: AHK: Получить полное имя файла под курсором

Вообще-то мне нужен скрипт который при наведении или выделении (без открытия) файла, прописывал бы его адрес в текстовый документ или сохранял в буфер в виде текста.
По работе очень надо!
У меня католог из 75000 файлов (в основном - png, txt, 3ds и jpeg). К каждому файлу требуется в текстовом файле прописать адрес!!! 
Не спрашивайте зачем, я самый маленький винтик в большом ящике.
Сейчас приходится брать в проводнике адрес папки, вставлять его в блокнот. Затем выделять нужный файл -> ПКМ -> переименовать -> ctrl+c -> клик в блокнот напротив ранее вставленного адреса каталога -> ctrl+v!
И так 75000 раз !!!
Сделал чуть более 1500 и чуть не свихнулся!
Вот я и подумал, может есть какой-нибудь хитрый скрипт который будет срабатывать при наведении - выделении файла и тутже прописывать его адрес в текстовый документ??? Допускаю что на каждом файле придется задерживать курсор на 1-2 секунды чтобы обновить список, но оно все же будет не тем идиотизмом которым я занят сейчас.
Ну собственно вот нашел я тут этот скрипт написанный умными людьми и что-то немогу с ним подружиться! :-(

16

Re: AHK: Получить полное имя файла под курсором

orfei пишет:

Вообще-то мне нужен скрипт который при наведении или выделении (без открытия) файла, прописывал бы его адрес в текстовый документ или сохранял в буфер в виде текста.
По работе очень надо!
У меня католог из 75000 файлов (в основном - png, txt, 3ds и jpeg). К каждому файлу требуется в текстовом файле прописать адрес!!! 
Не спрашивайте зачем, я самый маленький винтик в большом ящике.
Сейчас приходится брать в проводнике адрес папки, вставлять его в блокнот. Затем выделять нужный файл -> ПКМ -> переименовать -> ctrl+c -> клик в блокнот напротив ранее вставленного адреса каталога -> ctrl+v!
И так 75000 раз !!!
Сделал чуть более 1500 и чуть не свихнулся!
Вот я и подумал, может есть какой-нибудь хитрый скрипт который будет срабатывать при наведении - выделении файла и тутже прописывать его адрес в текстовый документ??? Допускаю что на каждом файле придется задерживать курсор на 1-2 секунды чтобы обновить список, но оно все же будет не тем идиотизмом которым я занят сейчас.
Ну собственно вот нашел я тут этот скрипт написанный умными людьми и что-то немогу с ним подружиться! :-(

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

Ходит Спесь, надуваючись, С боку на бок переваливаясь. Ростом-то Спесь аршин с четвертью, Шапка-то на нём во целу сажень, Пузо-то его всё в жемчуге, Сзади-то у него раззолочено... Идет Спесь, видит: на небе радуга; Повернул Спесь во другую сторону: Не пригоже-де мне нагибатися!
А. К. Толстой

17

Re: AHK: Получить полное имя файла под курсором

Странно. У меня не показывает имя файла. Как было три графы ( Имя, Размер, Дата изменения) так и осталось. Я конечно никогда не пользовался такими сложными скриптами, больше для вызова приложения с горячей кнопки. Может что-то не так делаю?

Видимо у вас Win-7.
ToolTip будет только на рабочем столе, скрипт для ХР. Пример получения пути выделенного файла есть на форуме.

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

18 (изменено: orfei, 2013-11-14 02:57:39)

Re: AHK: Получить полное имя файла под курсором

Менеджерами воспользоваться не могу. Так как прав нет на установку, я не администратор, работаю под юзером.
Письмо айтишнику отправил, но ждать системщика, это как гадать на ромашке, может придет, а может и не придет. У нас только в  нашем корпусе 6 этажей, 42 кабинета только на нашем этаже. Системщика видел последний раз полгода назад, когда он мне AHK установил. Дал мне два разрешенных имени скрипта и сказал чтобы я отстал от него.
Пока вариант лишь со скриптами. 

Да у меня Win-7 64 . 
Форум посмотрел, но что-то не нашел подобных тем... :-(
Завтра попробую еще раз поколупать этот скрипт.

LVM_FIRST := 0x1000
   LVM_GETITEMCOUNT := (LVM_FIRST + 4)
   LVM_GETTOPINDEX := (LVM_FIRST + 39)
   LVM_GETITEMRECT := (LVM_FIRST + 14)
   PROCESS_VM_OPERATION := 0x8
   PROCESS_VM_READ := 0x10
   MEM_COMMIT := 0x1000
   PAGE_READWRITE := 0x4
   MEM_RELEASE := 0x8000

   #Persistent
   SetBatchLines, -1
   CoordMode, Mouse
   VarSetCapacity(RECT, 16)
   SetTimer, MGP
   Return

MGP:
   MouseGetPos,,,, Control
   if !InStr(Control, "SysListView32")
   {
      ToolTip
      Return
   }
   
   MouseGetPos, XM, YM, Win_ID, LV_ID, 2
   if (YM = YM_Prev && XM = XM_Prev)
      Return
   
   WinGetPos, X_LV, Y_LW,,, ahk_id %LV_ID%
   WinGet, PID, PID, ahk_id %Win_ID%
   
   SendMessage, LVM_GETITEMCOUNT,,,, ahk_id %LV_ID%
   Rows := ErrorLevel
   SendMessage, LVM_GETTOPINDEX,,,, ahk_id %LV_ID%
   TopIndex := ErrorLevel
   ControlGet, Text, List, Col1,, ahk_id %LV_ID%

   Loop % Rows + 1 - TopIndex
   {
      CurrentItem := TopIndex + A_Index - 1
      
      hProcess := DllCall("OpenProcess", UInt, PROCESS_VM_OPERATION|PROCESS_VM_READ
                                       , UInt, 0
                                       , UInt, PID)
                                       
      pBuffer := DllCall("VirtualAllocEx", UInt, hProcess
                                         , UInt, 0
                                         , UInt, 4
                                         , UInt, MEM_COMMIT
                                         , UInt, PAGE_READWRITE)
                                         
      SendMessage, LVM_GETITEMRECT, CurrentItem, pBuffer,, ahk_id %LV_ID%
      DllCall("ReadProcessMemory", UInt, hProcess
                                 , UInt, pBuffer
                                 , UInt, &RECT
                                 , UInt, 16
                                 , UInt, 0)
                                 
      Left := NumGet(RECT), Right := NumGet(RECT, 8)
      Top := NumGet(RECT, 4), Bottom := NumGet(RECT, 12)
      
      DllCall("VirtualFreeEx", UInt, hProcess
                             , UInt, pBuffer
                             , UInt, 0
                             , UInt, MEM_RELEASE)
      DllCall("CloseHandle", UInt, hProcess)
      
      if (XM >= X_LV + Left && XM <= X_LV + Right && YM >= Y_LW + Top && YM <= Y_LW + Bottom)
      {
         Loop, parse, Text, `n
         {
            if (A_Index = CurrentItem + 1)
            {
               ToolTip % A_LoopField
               Break
            }
         }
      }
   }
   XM_Prev := XM, YM_Prev := YM
   Return

19

Re: AHK: Получить полное имя файла под курсором

Да у меня Win-7 64 . 
Форум посмотрел, но что-то не нашел подобных тем... :-(

Get paths of selected items in an explorer window

Если надо просто файл под курсором, то может помочь функция GetTextUnderMouse из AhkSpy, в некоторых видах отображения проводника.

Завтра попробую еще раз поколупать этот скрипт.


Очень интересно как вы его из SysListView32 в DirectUIHWND переколупаете.

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

20

Re: AHK: Получить полное имя файла под курсором

orfei пишет:

У меня католог из 75000 файлов (в основном - png, txt, 3ds и jpeg). К каждому файлу требуется в текстовом файле прописать адрес!!!

А почему это надо делать вручную через Проводник? В АНК же есть команды для работы с файлами и папками.

21

Re: AHK: Получить полное имя файла под курсором

Поддерживаю, легче сворганить свой проводник.

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

22

Re: AHK: Получить полное имя файла под курсором

YMP пишет:
orfei пишет:

У меня католог из 75000 файлов (в основном - png, txt, 3ds и jpeg). К каждому файлу требуется в текстовом файле прописать адрес!!!

А почему это надо делать вручную через Проводник? В АНК же есть команды для работы с файлами и папками.

Если подскажете, буду очень благодарен. Просто я чайник в этих делах.

23

Re: AHK: Получить полное имя файла под курсором

Задача пока что не понятна. Пути всех файлов в папке записать в один текстовый файл?

24 (изменено: orfei, 2013-11-14 22:33:41)

Re: AHK: Получить полное имя файла под курсором

YMP пишет:

Задача пока что не понятна. Пути всех файлов в папке записать в один текстовый файл?

Ну собственно да. :-) Только там так: общая папка в ней несколько сот файлов и 6 папок. В каждой папке еще файлы и  и еще папки  с файлами. надо в самой верхней папке сделать один текстовый файл с путями ко всем файлам в этой папке и ко всем вложенным в папки ниже! Во как!

25

Re: AHK: Получить полное имя файла под курсором

Ну, тогда можно так:


Folder = D:\Temp    ; Верхняя папка.
TextFile = D:\Temp\Files.txt
File := FileOpen(TextFile, "w")

Loop, %Folder%\*.*, 0, 1
    File.WriteLine(A_LoopFileFullPath)

File.Close()
MsgBox, Готово

26

Re: AHK: Получить полное имя файла под курсором

YMP пишет:

Ну, тогда можно так:


Folder = D:\Temp    ; Верхняя папка.
TextFile = D:\Temp\Files.txt
File := FileOpen(TextFile, "w")

Loop, %Folder%\*.*, 0, 1
    File.WriteLine(A_LoopFileFullPath)

File.Close()
MsgBox, Готово

Спасибо большое. Это то что нужно. :-)
Ссылки правда все в одну строку, но с этим я справлюсь.

Спасибо за помощь. :-)

27

Re: AHK: Получить полное имя файла под курсором

orfei пишет:

Ссылки правда все в одну строку, но с этим я справлюсь.

Ну, это Блокнот их так показывает. Это можно и в коде поправить.


Folder = D:\Temp
TextFile = D:\Temp\Files.txt
File := FileOpen(TextFile, "w`n")

Loop, %Folder%\*.*, 0, 1
    File.WriteLine(A_LoopFileFullPath)

File.Close()
MsgBox, Готово