1

Тема: AHK: контекстное меню диска/директории /файла

есть ли возможность вызова контекстного меню диска/директории /файла без открытия окна „ мой компьютер” и эмуляции нажатия правой кнопки мыши?
Спосибо за внимание.

2

Re: AHK: контекстное меню диска/директории /файла

the_grin, какова глобальная цель?

3

Re: AHK: контекстное меню диска/директории /файла

глобальная цель: вызвать и отобразить контекстное меню сьемного диска из окна скрипта.

4

Re: AHK: контекстное меню диска/директории /файла

the_grin, не надо повторять написанное. Зачем это нужно?

5

Re: AHK: контекстное меню диска/директории /файла

Иногда требуется  доступ к данному меню в TotalComanderе, а в целях экономии места отключена панель дисков. Если это не теущий диск то при таких настройках требуется перейти на нужный (что затруднительно если это CD привод без диска) или в субдиректорию „мой компьютер” и нажать правой кнопкой на диск.Игра с командой cm_contextmenu не дала каких либо результатов. Хотелось бы иметь более быструю альтернативу.
Благодарю за внимание.

6

Re: AHK: контекстное меню диска/директории /файла

1. Это всё время один и тот же диск — т.е., буква съёмного диска постоянна?
2. Если — «нет», то съёмный диск — единственное съёмное устройство?
3. Вас интересует какая-то конкретная команда/команды из этого меню?

7

Re: AHK: контекстное меню диска/директории /файла

1. Чаще требовалость CD и Флеш насопители (буквы разные)
2. Такое устройсво не одно
3. Интересует меню целиком, а не отдельный  пункт (т.к. например некоторые программы прячут туда свои меню)

8

Re: AHK: контекстное меню диска/директории /файла

1. Чаще требовалость CD и Флеш насопители (буквы разные)

То есть, не только съёмные устройства?! Или накопитель на компакт-дисках внешний?

2. Такое устройсво не одно

Тогда каким образом программе определять — на какое устройство в этот раз нужно вывести контекстное меню? Ваши предложения?

9

Re: AHK: контекстное меню диска/директории /файла

Это?

10

Re: AHK: контекстное меню диска/директории /файла

Александр_, примерно это. Но сначала нужно определиться с тем, что мы хотим получить и, главное, для какого объекта.

11

Re: AHK: контекстное меню диска/директории /файла

the_grin пишет:

Игра с командой cm_contextmenu не дала каких либо результатов. Хотелось бы иметь более быструю альтернативу.

Вот отсюда, пожалуйста, поподробней. В проводнике скорость появления этого меню происходит быстрее, чем Application/Shift+F(9/10) в ТС?

12

Re: AHK: контекстное меню диска/директории /файла

Flasher, как можно применить команду, не имея на панели целевого объекта?

13 (изменено: Flasher, 2012-09-24 20:52:22)

Re: AHK: контекстное меню диска/директории /файла

alexii
Панели с целевым объектом есть
1) \\Мой компьютер\ (cm_OpenDrives)
2) Дерево каталогов (Ctrl+F8)
3) Дерево в отдельной панели (cm_ToggleSeparateTree1)

14

Re: AHK: контекстное меню диска/директории /файла

Насколько я понимаю, автор темы хочет вызывать его из любого места, не меняя каталог панели.

15 (изменено: the_grin, 2012-09-24 21:07:04)

Re: AHK: контекстное меню диска/директории /файла

alexii пишет:

Тогда каким образом программе определять — на какое устройство в этот раз нужно вывести контекстное меню? Ваши предложения?

Работа с буквой диска меня вполне бы устроила, скажем какая либо функция которой я бы "скормил" эту букву.


alexii пишет:

Насколько я понимаю, автор темы хочет вызывать его из любого места, не меняя каталог панели.

Верно.

16

Re: AHK: контекстное меню диска/директории /файла

А какой смысл вызывать меню без подвязки к определённому объекту в панели?
Из первого поста: "меню диска/директории /файла".
Если бы только диска, то ещё понятно. И, как мне кажется, можно было бы организовать всю необходимую автоматику без использования этого меню. Ну, тут каждому своё, конечно.

17

Re: AHK: контекстное меню диска/директории /файла

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

18

Re: AHK: контекстное меню диска/директории /файла

the_grin
Поскольку речь затронута о работе в ТС, то альтернативой вполне может быть панель инструментов в виде меню с необходимыми заведомо сформированными пунктами/кнопками. Ничего такого особенного в контекстном меню дисков нет.
И ещё есть вариант откреплённого меню в виде списка пользовательских команд некого mnu-файла (реализуется утилитой).

19

Re: AHK: контекстное меню диска/директории /файла

Flasher, смысл в том, чтобы по заранее известному пути получить объект, получить перечень пунктов его контекстного меню (хотя бы основных), создать на основе полученного перечня своё меню, предъявить его пользователю, получить ответ (выбор пункта), отправить команду, соответствующую сделанному в меню выбору объекту.

Жаль, что в TC нет встроенного макроязыка. Или может быть можно: запомнить путь на текущей панели, перейти по пути «Мой компьютер», выделить потребный объект, вывести для него команду, после выбора команды вернуть запомненный путь на панели. Можно такое проделать средствами TC?

20

Re: AHK: контекстное меню диска/директории /файла

the_grin, переходите на Far Manager , там проще некуда:

rclk_txt:O:\

или:

rclk_gui:O:\

где «O» — буква устройства/раздела.

21 (изменено: Flasher, 2012-09-25 01:11:46)

Re: AHK: контекстное меню диска/директории /файла

alexii пишет:

Или может быть можно: запомнить путь на текущей панели, перейти по пути «Мой компьютер», выделить потребный объект, вывести для него команду, после выбора команды вернуть запомненный путь на панели. Можно такое проделать средствами TC?

Ещё проще (без запоминания):

TOTALCMD#BAR#DATA
%COMMANDER_PATH%\Utils\TCMC\TCMC.exe
cm2001 cm2003 cm2500 cm570 cm570
shell32.dll,26
Открыть контекстное меню текущего диска

TCMC

Только перед тем как вернуться обратно TCMC будет ждать пока свернётся меню.

22

Re: AHK: контекстное меню диска/директории /файла

Только перед тем как вернуться обратно TCMC будет ждать пока свернётся меню.

Это вполне нормально.

Ещё проще (без запоминания):

Это при наличии выхода в «Мой компьютер» . А если нет?

23

Re: AHK: контекстное меню диска/директории /файла

alexii пишет:

А если нет?

Чего нет? Выхода в Мой компьютер? Это как?

24

Re: AHK: контекстное меню диска/директории /файла

Ага . Флажок «Show «..» in root directory» (пишу по памяти) не устанавливался.

25

Re: AHK: контекстное меню диска/директории /файла

А, да. В этом случае нужно запоминать букву диска. Ну, мало кто не ставил эту птицу.

26

Re: AHK: контекстное меню диска/директории /файла

Есть ли возможность вызова контекстного меню диска/директории /файла без открытия окна „ мой компьютер”

Утянуто с оф. форума, применимо в 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)
}

27

Re: AHK: контекстное меню диска/директории /файла

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: Exit

The program will exit.
---------------------------
ОК   
---------------------------

28 (изменено: creature.ws, 2012-09-25 18:06:18)

Re: AHK: контекстное меню диска/директории /файла

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

29

Re: AHK: контекстное меню диска/директории /файла

creature.ws пишет:

Или вы считаете это неразрешимой задачей и предлагаете прикрепить файл содержащий функции к сообщению?

Что я считаю неразрешимой задачей? Какие функции?

30 (изменено: creature.ws, 2012-09-25 18:29:37)

Re: AHK: контекстное меню диска/директории /файла

Что я считаю неразрешимой задачей?

скопировать последнюю закрывающую фигурную скобку.

Какие функции?

ShellContextMenu, WindowProc,  VTable,  GUID4String, CoTaskMemFree.

Сообщение #27 подразумевает, что вы столкнулись с неразрешимой вашими силами проблемой, решение которой вы расчитываете переложить на участников форума.
Вы предлагаете трактовать ваше сообщение, содержащее копию сообщения об отсутствии в скрипте закрывающей скобки, как-то иначе?

31

Re: AHK: контекстное меню диска/директории /файла

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

32 (изменено: creature.ws, 2012-09-25 19:13:24)

Re: AHK: контекстное меню диска/директории /файла

Я предлагаю не лепить ярлыки и не бросаться домыслами.

О каких ярлыках речь?

Езжайте дальше У меня под xp и win7 ваших проблем не наблюдается.

OFF:
Невнимательность — мать всех ошибок.
Поспешность — бабушка неадекватных диалогов.

33

Re: AHK: контекстное меню диска/директории /файла

Flasher пишет:

AutoHotkey_L 1.1.05.02

Может, тут собачка порылась?

34

Re: AHK: контекстное меню диска/директории /файла

Irbis пишет:

Может, тут собачка порылась?

Да нет. Я использую эту версию, т.к. с 1.0.48.5 были некоторые проблемы. С ней аналогично.

35 (изменено: creature.ws, 2012-09-25 20:58:28)

Re: AHK: контекстное меню диска/директории /файла

О, теперь то понятно, «откуда ноги растут»
Позволю себе домыслить, что Irbis имел в виду неактуальность упомянутой версии. Актуальная на данный момент имеет номер 1.1.08.01

36

Re: AHK: контекстное меню диска/директории /файла

Дело оказалось не в версии, а в юникодности. Только с AutoHotkeyU32 заработало.
Собственно, раз корневая задача - открывать контекстное меню текущего диска активной панели в ТС, то предлагаю добить скрипт.