Тема: AHK: Получить полное имя файла под курсором
Нужно получить полное имя файла в проводнике над которым находится курсор, не кликая на файл.
Вы не вошли. Пожалуйста, войдите или зарегистрируйтесь.
Страницы 1
Чтобы отправить ответ, вы должны войти или зарегистрироваться
Нужно получить полное имя файла в проводнике над которым находится курсор, не кликая на файл.
Можно получить путь только к выделенному файлу.
А с помощью WinApi никак нельзя? Ведь в Windows, когда курсор над файлом, появляется всплывающая подсказка с информацией о файле. Это сообщение перехватить нельзя?
А зачем? Там разве есть путь к файлу? У меня, во всяком случае, нет.
Путь по идее можно взять из адресной строки, где-то была такая тема. А как просто имя файла взять тогда?
Оказалось не так уж сложно:
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
Ничего себе не сложно Спасибо)
2teadrinker: коллега, пополняйте Коллекцию — думаю, будет востребовано.
Немного оптимизированный вариант, определяет только при небольшой задержке над пунктом списка. Вечером выложу в Коллекцию.
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
Извините за глупый вопрос: А куда сохраняется определенный путь к файлу?
Хочу заметить, что имена файлов со скрытым расширением отображаются без оного.
А где они отображаются то????!!! Запускаю скрипт, и ничего! Совсем! В диспетчере задач процесс есть, а ничего нет. Как путь файла или имя отображаться должны, если определились?
Имя файла отображается во всплывающей подсказке (ToolTip).
Странно. У меня не показывает имя файла. Как было три графы ( Имя, Размер, Дата изменения) так и осталось. Я конечно никогда не пользовался такими сложными скриптами, больше для вызова приложения с горячей кнопки. Может что-то не так делаю?
Вообще-то мне нужен скрипт который при наведении или выделении (без открытия) файла, прописывал бы его адрес в текстовый документ или сохранял в буфер в виде текста.
По работе очень надо!
У меня католог из 75000 файлов (в основном - png, txt, 3ds и jpeg). К каждому файлу требуется в текстовом файле прописать адрес!!!
Не спрашивайте зачем, я самый маленький винтик в большом ящике.
Сейчас приходится брать в проводнике адрес папки, вставлять его в блокнот. Затем выделять нужный файл -> ПКМ -> переименовать -> ctrl+c -> клик в блокнот напротив ранее вставленного адреса каталога -> ctrl+v!
И так 75000 раз !!!
Сделал чуть более 1500 и чуть не свихнулся!
Вот я и подумал, может есть какой-нибудь хитрый скрипт который будет срабатывать при наведении - выделении файла и тутже прописывать его адрес в текстовый документ??? Допускаю что на каждом файле придется задерживать курсор на 1-2 секунды чтобы обновить список, но оно все же будет не тем идиотизмом которым я занят сейчас.
Ну собственно вот нашел я тут этот скрипт написанный умными людьми и что-то немогу с ним подружиться! :-(
Вообще-то мне нужен скрипт который при наведении или выделении (без открытия) файла, прописывал бы его адрес в текстовый документ или сохранял в буфер в виде текста.
По работе очень надо!
У меня католог из 75000 файлов (в основном - png, txt, 3ds и jpeg). К каждому файлу требуется в текстовом файле прописать адрес!!!
Не спрашивайте зачем, я самый маленький винтик в большом ящике.
Сейчас приходится брать в проводнике адрес папки, вставлять его в блокнот. Затем выделять нужный файл -> ПКМ -> переименовать -> ctrl+c -> клик в блокнот напротив ранее вставленного адреса каталога -> ctrl+v!
И так 75000 раз !!!
Сделал чуть более 1500 и чуть не свихнулся!
Вот я и подумал, может есть какой-нибудь хитрый скрипт который будет срабатывать при наведении - выделении файла и тутже прописывать его адрес в текстовый документ??? Допускаю что на каждом файле придется задерживать курсор на 1-2 секунды чтобы обновить список, но оно все же будет не тем идиотизмом которым я занят сейчас.
Ну собственно вот нашел я тут этот скрипт написанный умными людьми и что-то немогу с ним подружиться! :-(
Есть масса специализированных программ для этого. Нынче и почти каждый уважающий себя файловый менеджер этому обучен по умолчанию или имеет такой плагин. Все элементарно гуглится.
Странно. У меня не показывает имя файла. Как было три графы ( Имя, Размер, Дата изменения) так и осталось. Я конечно никогда не пользовался такими сложными скриптами, больше для вызова приложения с горячей кнопки. Может что-то не так делаю?
Видимо у вас Win-7.
ToolTip будет только на рабочем столе, скрипт для ХР. Пример получения пути выделенного файла есть на форуме.
Менеджерами воспользоваться не могу. Так как прав нет на установку, я не администратор, работаю под юзером.
Письмо айтишнику отправил, но ждать системщика, это как гадать на ромашке, может придет, а может и не придет. У нас только в нашем корпусе 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
Да у меня Win-7 64 .
Форум посмотрел, но что-то не нашел подобных тем... :-(
Get paths of selected items in an explorer window
Если надо просто файл под курсором, то может помочь функция GetTextUnderMouse из AhkSpy, в некоторых видах отображения проводника.
Завтра попробую еще раз поколупать этот скрипт.
Очень интересно как вы его из SysListView32 в DirectUIHWND переколупаете.
У меня католог из 75000 файлов (в основном - png, txt, 3ds и jpeg). К каждому файлу требуется в текстовом файле прописать адрес!!!
А почему это надо делать вручную через Проводник? В АНК же есть команды для работы с файлами и папками.
Поддерживаю, легче сворганить свой проводник.
orfei пишет:У меня католог из 75000 файлов (в основном - png, txt, 3ds и jpeg). К каждому файлу требуется в текстовом файле прописать адрес!!!
А почему это надо делать вручную через Проводник? В АНК же есть команды для работы с файлами и папками.
Если подскажете, буду очень благодарен. Просто я чайник в этих делах.
Задача пока что не понятна. Пути всех файлов в папке записать в один текстовый файл?
Задача пока что не понятна. Пути всех файлов в папке записать в один текстовый файл?
Ну собственно да. :-) Только там так: общая папка в ней несколько сот файлов и 6 папок. В каждой папке еще файлы и и еще папки с файлами. надо в самой верхней папке сделать один текстовый файл с путями ко всем файлам в этой папке и ко всем вложенным в папки ниже! Во как!
Ну, тогда можно так:
Folder = D:\Temp ; Верхняя папка.
TextFile = D:\Temp\Files.txt
File := FileOpen(TextFile, "w")
Loop, %Folder%\*.*, 0, 1
File.WriteLine(A_LoopFileFullPath)
File.Close()
MsgBox, Готово
Ну, тогда можно так:
Folder = D:\Temp ; Верхняя папка. TextFile = D:\Temp\Files.txt File := FileOpen(TextFile, "w") Loop, %Folder%\*.*, 0, 1 File.WriteLine(A_LoopFileFullPath) File.Close() MsgBox, Готово
Спасибо большое. Это то что нужно. :-)
Ссылки правда все в одну строку, но с этим я справлюсь.
Спасибо за помощь. :-)
Ссылки правда все в одну строку, но с этим я справлюсь.
Ну, это Блокнот их так показывает. Это можно и в коде поправить.
Folder = D:\Temp
TextFile = D:\Temp\Files.txt
File := FileOpen(TextFile, "w`n")
Loop, %Folder%\*.*, 0, 1
File.WriteLine(A_LoopFileFullPath)
File.Close()
MsgBox, Готово
Страницы 1
Чтобы отправить ответ, вы должны войти или зарегистрироваться