Orion9
|
Posted: Sat Mar 16, 2024 20:06 Post subject: |
|
|
Loopback
Спасибо за комментарий по поводу правильности/неправильности способа. Я еще только изучаю принципы автоматизации и что с ними связано, поэтому мне очень важно услышать мнения экспертов и опытных в этом деле людей для подтверждения собственных мыслей.
Исправил на p = SendMessage(RequestInfo(RequestInfo(1000) + , 13, 100, "" , 2) - все работает. Но вызывает вопрос параметр 100. По идее здесь должно быть точное количество байт, полученное через WM_GETTEXTLENGTH? Иначе ведь при длинном пути он просто обрежется. Или можно просто цифру побольше взять?
Попробовал довести задачу до цели через скрипт AutoHotkey, чтобы посмотреть, как оно будет выглядеть в действительности. Вроде, ничего - мне нравится!
autorun.cfg
Code: |
Func ShowItemHint
Local icacl, dat, p
dat = StrPart(ItemAtCursor('text'), auTAB, 1)
p = SendMessage(RequestInfo(RequestInfo(1000) + 8), 13, 100, "" , 2)
p = StrLeft(p, StrPos(p, "\", -1))
dat = p & dat
ShellExec "%COMMANDER_PATH%\Scripts\ahk\AutoHotkey32.exe" "FileSec.ahk ""%dat%""" "%COMMANDER_PATH%\Scripts\ahk\"
EndFunc
|
FileSec.ahk
Code: |
#SingleInstance Force
ToolTip StrBuf(RunWaitOne('icacls "' A_Args[1]))
KeyWait "LButton", "D"
RunWaitOne(command) {
local sOut
dhw := A_DetectHiddenWindows
pid :=0
DetectHiddenWindows true
Run A_ComSpec " /k",, "Hide", &pid
WinWait "ahk_pid " pid
DllCall("AttachConsole", "UInt", pid)
DetectHiddenWindows dhw
shell := ComObject("WScript.Shell")
exec := shell.Exec(A_ComSpec . " /C " . command)
sOut := exec.StdOut.ReadAll()
DllCall("FreeConsole")
if ProcessExist(pid)
ProcessClose pid
return sOut
}
StrBuf(str)
{
buf := Buffer(StrPut(str, "CP0"))
StrPut(str, buf, "CP0")
return StrGet(buf.ptr, "CP866")
}
|
Думаю, тултип Autorun нужен. Может, вам удастся как-то решить проблему с его скрытием? Ну, а если нет - ничего страшного |
|