Тема: AHK: контекстное меню диска/директории /файла
есть ли возможность вызова контекстного меню диска/директории /файла без открытия окна „ мой компьютер” и эмуляции нажатия правой кнопки мыши?
Спосибо за внимание.
Вы не вошли. Пожалуйста, войдите или зарегистрируйтесь.
Страницы 1
Чтобы отправить ответ, вы должны войти или зарегистрироваться
есть ли возможность вызова контекстного меню диска/директории /файла без открытия окна „ мой компьютер” и эмуляции нажатия правой кнопки мыши?
Спосибо за внимание.
the_grin, какова глобальная цель?
глобальная цель: вызвать и отобразить контекстное меню сьемного диска из окна скрипта.
the_grin, не надо повторять написанное. Зачем это нужно?
Иногда требуется доступ к данному меню в TotalComanderе, а в целях экономии места отключена панель дисков. Если это не теущий диск то при таких настройках требуется перейти на нужный (что затруднительно если это CD привод без диска) или в субдиректорию „мой компьютер” и нажать правой кнопкой на диск.Игра с командой cm_contextmenu не дала каких либо результатов. Хотелось бы иметь более быструю альтернативу.
Благодарю за внимание.
1. Это всё время один и тот же диск — т.е., буква съёмного диска постоянна?
2. Если — «нет», то съёмный диск — единственное съёмное устройство?
3. Вас интересует какая-то конкретная команда/команды из этого меню?
1. Чаще требовалость CD и Флеш насопители (буквы разные)
2. Такое устройсво не одно
3. Интересует меню целиком, а не отдельный пункт (т.к. например некоторые программы прячут туда свои меню)
1. Чаще требовалость CD и Флеш насопители (буквы разные)
То есть, не только съёмные устройства?! Или накопитель на компакт-дисках внешний?
2. Такое устройсво не одно
Тогда каким образом программе определять — на какое устройство в этот раз нужно вывести контекстное меню? Ваши предложения?
Это?
Александр_, примерно это. Но сначала нужно определиться с тем, что мы хотим получить и, главное, для какого объекта.
Игра с командой cm_contextmenu не дала каких либо результатов. Хотелось бы иметь более быструю альтернативу.
Вот отсюда, пожалуйста, поподробней. В проводнике скорость появления этого меню происходит быстрее, чем Application/Shift+F(9/10) в ТС?
Flasher, как можно применить команду, не имея на панели целевого объекта?
alexii
Панели с целевым объектом есть
1) \\Мой компьютер\ (cm_OpenDrives)
2) Дерево каталогов (Ctrl+F8)
3) Дерево в отдельной панели (cm_ToggleSeparateTree1)
Насколько я понимаю, автор темы хочет вызывать его из любого места, не меняя каталог панели.
Тогда каким образом программе определять — на какое устройство в этот раз нужно вывести контекстное меню? Ваши предложения?
Работа с буквой диска меня вполне бы устроила, скажем какая либо функция которой я бы "скормил" эту букву.
Насколько я понимаю, автор темы хочет вызывать его из любого места, не меняя каталог панели.
Верно.
А какой смысл вызывать меню без подвязки к определённому объекту в панели?
Из первого поста: "меню диска/директории /файла".
Если бы только диска, то ещё понятно. И, как мне кажется, можно было бы организовать всю необходимую автоматику без использования этого меню. Ну, тут каждому своё, конечно.
Flasher, в том и смысл что нужна не автоматика, а отображение меню из которого можно выбрать нужный пункт ручками.
the_grin
Поскольку речь затронута о работе в ТС, то альтернативой вполне может быть панель инструментов в виде меню с необходимыми заведомо сформированными пунктами/кнопками. Ничего такого особенного в контекстном меню дисков нет.
И ещё есть вариант откреплённого меню в виде списка пользовательских команд некого mnu-файла (реализуется утилитой).
Flasher, смысл в том, чтобы по заранее известному пути получить объект, получить перечень пунктов его контекстного меню (хотя бы основных), создать на основе полученного перечня своё меню, предъявить его пользователю, получить ответ (выбор пункта), отправить команду, соответствующую сделанному в меню выбору объекту.
Жаль, что в TC нет встроенного макроязыка. Или может быть можно: запомнить путь на текущей панели, перейти по пути «Мой компьютер», выделить потребный объект, вывести для него команду, после выбора команды вернуть запомненный путь на панели. Можно такое проделать средствами TC?
the_grin, переходите на Far Manager
, там проще некуда:
rclk_txt:O:\или:
rclk_gui:O:\где «O» — буква устройства/раздела.
Или может быть можно: запомнить путь на текущей панели, перейти по пути «Мой компьютер», выделить потребный объект, вывести для него команду, после выбора команды вернуть запомненный путь на панели. Можно такое проделать средствами TC?
Ещё проще (без запоминания):
TOTALCMD#BAR#DATA
%COMMANDER_PATH%\Utils\TCMC\TCMC.exe
cm2001 cm2003 cm2500 cm570 cm570
shell32.dll,26
Открыть контекстное меню текущего дискаТолько перед тем как вернуться обратно TCMC будет ждать пока свернётся меню.
Только перед тем как вернуться обратно TCMC будет ждать пока свернётся меню.
Это вполне нормально.
Ещё проще (без запоминания):
Это при наличии выхода в «Мой компьютер»
. А если нет?
А если нет?
Чего нет? Выхода в Мой компьютер? Это как?
Ага
. Флажок «Show «..» in root directory» (пишу по памяти) не устанавливался.
А, да. В этом случае нужно запоминать букву диска. Ну, мало кто не ставил эту птицу.
Есть ли возможность вызова контекстного меню диска/директории /файла без открытия окна „ мой компьютер”
Утянуто с оф. форума, применимо в AHK_L, проверено, работает.
ShellContextMenu("C:\Windows")
ExitApp
; ================ FUNCTION ================
ShellContextMenu(sPath)
{
If sPath Is Not Integer
DllCall("shell32\SHParseDisplayName", "str", sPath, "Ptr", 0, "Ptr*", pidl, "Uint", 0, "Uint*", 0)
;This function is the preferred method to convert a string to a pointer to an item identifier list (PIDL).
else
DllCall("shell32\SHGetFolderLocation", "Ptr", 0, "int", sPath, "Ptr", 0, "Uint", 0, "Ptr*", pidl)
DllCall("shell32\SHBindToParent", "Ptr", pidl, "Ptr", GUID4String(IID_IShellFolder,"{000214E6-0000-0000-C000-000000000046}"), "Ptr*", pIShellFolder, "Ptr*", pidlChild)
;IShellFolder->GetUIObjectOf
DllCall(VTable(pIShellFolder, 10), "Ptr", pIShellFolder, "Ptr", 0, "Uint", 1, "Ptr*", pidlChild, "Ptr", GUID4String(IID_IContextMenu,"{000214E4-0000-0000-C000-000000000046}"), "Ptr", 0, "Ptr*", pIContextMenu)
ObjRelease(pIShellFolder)
CoTaskMemFree(pidl)
hMenu := DllCall("CreatePopupMenu")
;IContextMenu->QueryContextMenu
;http://msdn.microsoft.com/en-us/library/bb776097%28v=VS.85%29.aspx
DllCall(VTable(pIContextMenu, 3), "Ptr", pIContextMenu, "Ptr", hMenu, "Uint", 0, "Uint", 3, "Uint", 0x7FFF, "Uint", 0x100) ;CMF_EXTENDEDVERBS
global pIContextMenu2 := ComObjQuery(pIContextMenu, IID_IContextMenu2:="{000214F4-0000-0000-C000-000000000046}")
global pIContextMenu3 := ComObjQuery(pIContextMenu, IID_IContextMenu3:="{BCFCE0A0-EC17-11D0-8D10-00A0C90F2719}")
Global WPOld:= DllCall("SetWindowLong", "Ptr", A_ScriptHWND, "int",-4, "Uint",RegisterCallback("WindowProc"))
DllCall("GetCursorPos", "int64*", pt)
DllCall("InsertMenu", "Ptr", hMenu, "Uint", 0, "Uint", 0x0400|0x800, "Ptr", 2, "Ptr", 0)
DllCall("InsertMenu", "Ptr", hMenu, "Uint", 0, "Uint", 0x0400|0x002, "Ptr", 1, "Ptr", &sPath)
idn := DllCall("TrackPopupMenuEx", "Ptr", hMenu, "Uint", 0x0100|0x0001, "int", pt << 32 >> 32, "int", pt >> 32, "Ptr", A_ScriptHWND, "Uint", 0)
/*
typedef struct _CMINVOKECOMMANDINFOEX
{
DWORD cbSize; 0
DWORD fMask; 4
HWND hwnd; 8
LPCSTR lpVerb; 8+A_PtrSize
LPCSTR lpParameters; 8+2*A_PtrSize
LPCSTR lpDirectory; 8+3*A_PtrSize
int nShow; 8+4*A_PtrSize
DWORD dwHotKey; 12+4*A_PtrSize
HANDLE hIcon; 16+4*A_PtrSize
LPCSTR lpTitle; 16+5*A_PtrSize
LPCWSTR lpVerbW; 16+6*A_PtrSize
LPCWSTR lpParametersW; 16+7*A_PtrSize
LPCWSTR lpDirectoryW; 16+8*A_PtrSize
LPCWSTR lpTitleW; 16+9*A_PtrSize
POINT ptInvoke; 16+10*A_PtrSize
} CMINVOKECOMMANDINFOEX, *LPCMINVOKECOMMANDINFOEX;
http://msdn.microsoft.com/en-us/library/bb773217%28v=VS.85%29.aspx
*/
struct_size := 16+11*A_PtrSize
VarSetCapacity(pici,struct_size,0)
NumPut(struct_size,pici,0,"Uint") ;cbSize
NumPut(0x4000|0x20000000,pici,4,"Uint") ;fMask
NumPut(A_ScriptHWND,pici,8,"UPtr") ;hwnd
NumPut(1,pici,8+4*A_PtrSize,"Uint") ;nShow
NumPut(idn-3,pici,8+A_PtrSize,"UPtr") ;lpVerb
NumPut(idn-3,pici,16+6*A_PtrSize,"UPtr") ;lpVerbW
NumPut(pt,pici,16+10*A_PtrSize,"Int64") ;ptInvoke
DllCall(VTable(pIContextMenu, 4), "Ptr", pIContextMenu, "Ptr", &pici) ; InvokeCommand
DllCall("GlobalFree", "Uint", DllCall("SetWindowLong", "Ptr", A_ScriptHWND, "int", -4, "Uint", WPOld))
DllCall("DestroyMenu", "Ptr", hMenu)
ObjRelease(pIContextMenu3)
ObjRelease(pIContextMenu2)
ObjRelease(pIContextMenu)
pIContextMenu2:=pIContextMenu3:=WPOld:=0
return idn
}
WindowProc(hWnd, nMsg, wParam, lParam)
{
Critical
Global pIContextMenu2, pIContextMenu3, WPOld
If pIContextMenu3
{ ;IContextMenu3->HandleMenuMsg2
If !DllCall(VTable(pIContextMenu3, 7), "Uint", pIContextMenu3, "Uint", nMsg, "Uint", wParam, "Uint", lParam, "Uint*", lResult)
return lResult
}
Else If pIContextMenu2
{ ;IContextMenu2->HandleMenuMsg
If !DllCall(VTable(pIContextMenu2, 6), "Uint", pIContextMenu2, "Uint", nMsg, "Uint", wParam, "Uint", lParam)
return 0
}
return DllCall("user32.dll\CallWindowProcW", "Uint", WPOld, "Ptr", hWnd, "Uint", nMsg, "Uint", wParam, "Uint", lParam)
}
VTable(ppv, idx)
{
return NumGet(NumGet(1*ppv)+A_PtrSize*idx)
}
GUID4String(ByRef CLSID, String)
{
VarSetCapacity(CLSID, 16,0)
return DllCall("ole32\CLSIDFromString", "wstr", String, "Ptr", &CLSID) >= 0 ? &CLSID : ""
}
CoTaskMemFree(pv)
{
return DllCall("ole32\CoTaskMemFree", "Ptr", pv)
}creature.ws
Вызов из TC: WinXP x86, AutoHotkey_L 1.1.05.02:
---------------------------
Error: Missing "}"Line#
096: {
097: Return,NumGet(NumGet(1*ppv)+A_PtrSize*idx)
098: }
101: {
102: VarSetCapacity(CLSID, 16,0)
103: Return,DllCall("ole32\CLSIDFromString", "wstr", String, "Ptr", &CLSID) >= 0 ? &CLSID : ""
104: }
---> 107: {
108: Return,DllCall("ole32\CoTaskMemFree", "Ptr", pv)
109: ExitThe program will exit.
---------------------------
ОК
---------------------------
Вы бы не поленились скопировать последнюю закрывающую фигурную скобку.
Или вы считаете это неразрешимой задачей и предлагаете прикрепить файл содержащий функции к сообщению? ![]()
Или вы считаете это неразрешимой задачей и предлагаете прикрепить файл содержащий функции к сообщению?
Что я считаю неразрешимой задачей? Какие функции?
Что я считаю неразрешимой задачей?
скопировать последнюю закрывающую фигурную скобку.
Какие функции?
ShellContextMenu, WindowProc, VTable, GUID4String, CoTaskMemFree.
Сообщение #27 подразумевает, что вы столкнулись с неразрешимой вашими силами проблемой, решение которой вы расчитываете переложить на участников форума.
Вы предлагаете трактовать ваше сообщение, содержащее копию сообщения об отсутствии в скрипте закрывающей скобки, как-то иначе?
creature.ws
Я предлагаю не лепить ярлыки и не бросаться домыслами.
Краткость - сестра таланта. Скобка так скобка. Поехали дальше:
---------------------------
Error: No valid COM object!
Line#
012: DllCall("shell32\SHGetFolderLocation", "Ptr", 0, "int", sPath, "Ptr", 0, "Uint", 0, "Ptr*", pidl)
013: DllCall("shell32\SHBindToParent", "Ptr", pidl, "Ptr", GUID4String(IID_IShellFolder,"{000214E6-0000-0000-C000-000000000046}"), "Ptr*", pIShellFolder, "Ptr*", pidlChild)
015: DllCall(VTable(pIShellFolder, 10), "Ptr", pIShellFolder, "Ptr", 0, "Uint", 1, "Ptr*", pidlChild, "Ptr", GUID4String(IID_IContextMenu,"{000214E4-0000-0000-C000-000000000046}"), "Ptr", 0, "Ptr*", pIContextMenu)
016: ObjRelease(pIShellFolder)
017: CoTaskMemFree(pidl)
019: hMenu := DllCall("CreatePopupMenu")
022: DllCall(VTable(pIContextMenu, 3), "Ptr", pIContextMenu, "Ptr", hMenu, "Uint", 0, "Uint", 3, "Uint", 0x7FFF, "Uint", 0x100)
---> 024: pIContextMenu2 := ComObjQuery(pIContextMenu, IID_IContextMenu2:="{000214F4-0000-0000-C000-000000000046}")
025: pIContextMenu3 := ComObjQuery(pIContextMenu, IID_IContextMenu3:="{BCFCE0A0-EC17-11D0-8D10-00A0C90F2719}")
026: WPOld := DllCall("SetWindowLong", "Ptr", A_ScriptHWND, "int",-4, "Uint",RegisterCallback("WindowProc"))
028: DllCall("GetCursorPos", "int64*", pt)
029: DllCall("InsertMenu", "Ptr", hMenu, "Uint", 0, "Uint", 0x0400|0x800, "Ptr", 2, "Ptr", 0)
030: DllCall("InsertMenu", "Ptr", hMenu, "Uint", 0, "Uint", 0x0400|0x002, "Ptr", 1, "Ptr", &sPath)
032: idn := DllCall("TrackPopupMenuEx", "Ptr", hMenu, "Uint", 0x0100|0x0001, "int", pt << 32 >> 32, "int", pt >> 32, "Ptr", A_ScriptHWND, "Uint", 0)
056: struct_size := 16+11*A_PtrSizeЯ предлагаю не лепить ярлыки и не бросаться домыслами.
О каких ярлыках речь?
Езжайте дальше
У меня под xp и win7 ваших проблем не наблюдается.
OFF:
Невнимательность — мать всех ошибок.
Поспешность — бабушка неадекватных диалогов.
AutoHotkey_L 1.1.05.02
Может, тут собачка порылась?
Может, тут собачка порылась?
Да нет. Я использую эту версию, т.к. с 1.0.48.5 были некоторые проблемы. С ней аналогично.
О, теперь то понятно, «откуда ноги растут» ![]()
Позволю себе домыслить, что Irbis имел в виду неактуальность упомянутой версии. Актуальная на данный момент имеет номер 1.1.08.01
Дело оказалось не в версии, а в юникодности. Только с AutoHotkeyU32 заработало.
Собственно, раз корневая задача - открывать контекстное меню текущего диска активной панели в ТС, то предлагаю добить скрипт.
Страницы 1
Чтобы отправить ответ, вы должны войти или зарегистрироваться