Вверх ↑
Этот топик читают: Гость
Ответов: 5227
Рейтинг: 587
#121: 2009-11-02 09:03:50 ЛС | профиль | цитата
Так, голову сломал нафиг этим контекстным меню к чёртовой бабушке, решил проблему инжектом готовой библиотеки в 12Kb, если кому нужно приду домой выложу.
карма: 4
Мой форум - http://hiasm.bbtalk.me/ схемы, компоненты...
0
Разработчик
Ответов: 4698
Рейтинг: 426
#122: 2009-11-02 09:31:52 ЛС | профиль | цитата
Иван Балван, пожалуйста уберите столь огромную по размеру картинку из подписи, не у всех безлимитный трафик
карма: 10
0
Ответов: 4641
Рейтинг: 334
#123: 2009-11-02 09:33:02 ЛС | профиль | цитата
andrestudio писал(а):
если кому нужно приду домой выложу.

выложи с примером.
карма: 1
Время верстки: %cr_time% Текущее время: %time%
0
Ответов: 5227
Рейтинг: 587
#124: 2009-11-02 11:35:28 ЛС | профиль | цитата
Пардон, погарячился однако. Думал что это можно сделать без проблем НО! подключив библиотеку получил облом как в прошлом примере с IC. Проблемы с контекстом в KOL, так что инжектировать бесполезно. Можете проверить сами (пример на hiasm и на VB + exe 25Kb - http://slil.ru/28151766 )
карма: 4
Мой форум - http://hiasm.bbtalk.me/ схемы, компоненты...
0
Разработчик
Ответов: 26113
Рейтинг: 2126
#125: 2009-11-02 14:47:50 ЛС | профиль | цитата
andrestudio, мура у тебя на Delphi получилась, также выдает ошибку. Вот тебе подшаманеный твой IC, который не дает ошибку, но с иконками я не могу поянть (да и не нашел я), откуда брать ее Handle, хотя, маску отображения я поставил



Add(MainForm,162249,378,168)
{
Point(Handle)
}
Add(InlineCode,2747598,378,217)
{
WorkPoints=#12:doCreateMenu|
DataPoints=#4:hwnd|
Code=#15:unit HiAsmUnit;|0:|9:interface|0:|41:uses Windows, Kol, Share, Debug, ActiveX;|0:|5:const|29: CMIC_MASK_ICON = $00000010;|0:|5: type|0:|21: PSTRRet = ^TStrRet;|24: {$EXTERNALSYM _STRRET}|18: _STRRET = record|78: uType: UINT; { One of the STRRET_* values }|20: case Integer of|95: 0: (pOleStr: LPWSTR); { must be freed by caller of GetDisplayNameOf }|60: 1: (pStr: LPSTR); { NOT USED }|79: 2: (uOffset: UINT); { Offset into SHITEMID (ANSI) }|69: 3: (cStr: array[0..MAX_PATH-1] of Char); { Buffer to fill in }|8: end;|20: TStrRet = _STRRET;|23: {$EXTERNALSYM STRRET}|20: STRRET = _STRRET; |2: |25: PSHItemID = ^TSHItemID;|27: TSHItemID = packed record|78: cb: Word; { Size of the ID (including cb itself) }|71: abID: array[0..0] of Byte; { The item ID (variable length) }|6: end;|0:|29: PItemIDList = ^TItemIDList;|22: TItemIDList = record|21: mkid: TSHItemID;|6: end;|0:|47: PCMInvokeCommandInfo = ^TCMInvokeCommandInfo;|37: {$EXTERNALSYM _CMINVOKECOMMANDINFO}|31: _CMINVOKECOMMANDINFO = record|65: cbSize: DWORD; { must be sizeof(CMINVOKECOMMANDINFO) }|60: fMask: DWORD; { any combination of CMIC_MASK_* }|72: hwnd: HWND; { might be NULL (indicating no owner window) }|74: lpVerb: LPCSTR; { either a string of MAKEINTRESOURCE(idOffset) }|69: lpParameters: LPCSTR; { might be NULL (indicating no parameter) }|78: lpDirectory: LPCSTR; { might be NULL (indicating no specific directory) }|68: nShow: Integer; { one of SW_ values for ShowWindow() API }|20: dwHotKey: DWORD;|19: hIcon: THandle;|6: end;|0:|46: TCMInvokeCommandInfo = _CMINVOKECOMMANDINFO;|36: {$EXTERNALSYM CMINVOKECOMMANDINFO}|45: CMINVOKECOMMANDINFO = _CMINVOKECOMMANDINFO;|0:|51: PCMInvokeCommandInfoEx = ^TCMInvokeCommandInfoEx;|39: {$EXTERNALSYM _CMInvokeCommandInfoEx}|33: _CMInvokeCommandInfoEx = record|66: cbSize: DWORD; { must be sizeof(CMINVOKECOMMANDINFOEX) }|59: fMask: DWORD; { any combination of CMIC_MASK_* }|71: hwnd: HWND; { might be NULL (indicating no owner window) }|73: lpVerb: LPCSTR; { either a string or MAKEINTRESOURCE(idOffset) }|68: lpParameters: LPCSTR;{ might be NULL (indicating no parameter) }|77: lpDirectory: LPCSTR; { might be NULL (indicating no specific directory) }|67: nShow: Integer; { one of SW_ values for ShowWindow() API }|20: dwHotKey: DWORD;|19: hIcon: THandle;|69: lpTitle: LPCSTR; { For CreateProcess-StartupInfo.lpTitle }|71: lpVerbW: LPCWSTR; { Unicode verb (for those who can use it) }|77: lpParametersW: LPCWSTR; { Unicode parameters (for those who can use it) }|76: lpDirectoryW: LPCWSTR; { Unicode directory (for those who can use it) }|72: lpTitleW: LPCWSTR; { Unicode title (for those who can use it) }|56: ptInvoke: TPoint; { Point where it's invoked }|6: end;|52: TCMInvokeCommandInfoEx = _CMINVOKECOMMANDINFOEX;|40: {$EXTERNALSYM CMINVOKECOMMANDINFOEX}|51: CMINVOKECOMMANDINFOEX = _CMINVOKECOMMANDINFOEX;|0:|31: IMalloc = interface(IUnknown)|46: ['{00000002-0000-0000-C000-000000000046}']|50: function Alloc(cb: Longint): Pointer; stdcall;|65: function Realloc(pv: Pointer; cb: Longint): Pointer; stdcall;|41: procedure Free(pv: Pointer); stdcall;|52: function GetSize(pv: Pointer): Longint; stdcall;|53: function DidAlloc(pv: Pointer): Integer; stdcall;|36: procedure HeapMinimize; stdcall;|6: end;|0:|35: IEnumIDList = interface(IUnknown)|46: ['{000214F2-0000-0000-C000-000000000046}']|54: function Next(celt: ULONG; out rgelt: PItemIDList;|49: var pceltFetched: ULONG): HResult; stdcall;|49: function Skip(celt: ULONG): HResult; stdcall;|37: function Reset: HResult; stdcall;|62: function Clone(out ppenum: IEnumIDList): HResult; stdcall;|6: end;|2: |36: IShellFolder = interface(IUnknown)|46: ['{000214E6-0000-0000-C000-000000000046}']|46: function ParseDisplayName(hwndOwner: HWND;|74: pbcReserved: Pointer; lpszDisplayName: POLESTR; out pchEaten: ULONG;|73: out ppidl: PItemIDList; var dwAttributes: ULONG): HResult; stdcall;|58: function EnumObjects(hwndOwner: HWND; grfFlags: DWORD;|53: out EnumIDList: IEnumIDList): HResult; stdcall;|66: function BindToObject(pidl: PItemIDList; pbcReserved: Pointer;|54: const riid: TIID; out ppvOut): HResult; stdcall;|67: function BindToStorage(pidl: PItemIDList; pbcReserved: Pointer;|54: const riid: TIID; out ppvObj): HResult; stdcall;|39: function CompareIDs(lParam: LPARAM;|51: pidl1, pidl2: PItemIDList): HResult; stdcall;|64: function CreateViewObject(hwndOwner: HWND; const riid: TIID;|36: out ppvOut): HResult; stdcall;|64: function GetAttributesOf(cidl: UINT; var apidl: PItemIDList;|44: var rgfInOut: UINT): HResult; stdcall;|79: function GetUIObjectOf(hwndOwner: HWND; cidl: UINT; var apidl: PItemIDList;|74: const riid: TIID; prgfInOut: Pointer; out ppvOut): HResult; stdcall;|63: function GetDisplayNameOf(pidl: PItemIDList; uFlags: DWORD;|45: var lpName: TStrRet): HResult; stdcall;|77: function SetNameOf(hwndOwner: HWND; pidl: PItemIDList; lpszName: POLEStr;|66: uFlags: DWORD; var ppidlOut: PItemIDList): HResult; stdcall;|9: end; |0:|36: IContextMenu = interface(IUnknown)|46: ['{000214E4-0000-0000-C000-000000000046}']|42: function QueryContextMenu(Menu: HMENU;|72: indexMenu, idCmdFirst, idCmdLast, uFlags: UINT): HResult; stdcall;|78: function InvokeCommand(var lpici: TCMInvokeCommandInfo): HResult; stdcall;|68: function GetCommandString(idCmd, uType: UINT; pwReserved: PUINT;|54: pszName: LPSTR; cchMax: UINT): HResult; stdcall;|6: end;|0:|41: IContextMenu2 = interface(IContextMenu)|46: ['{000214F4-0000-0000-C000-000000000046}']|82: function HandleMenuMsg(uMsg: UINT; WParam, LParam: Integer): HResult; stdcall;|7: end; |4: |81://------------------------------------------------------------------------------ |29: THiAsmClass = class(TDebug)|9: private|0:|8: public|36: hwnd:THI_Event; //aa?oiyy oi?ea|57: procedure doCreateMenu(var _Data:TData; Index:word);|5: |6: end;|82://------------------------------------------------------------------------------ |14:implementation|0:|6:const |0:|103: IID_IShellFolder: TGUID = (D1:$000214E6; D2:$0000; D3:$0000; D4:($C0,$00,$00,$00,$00,$00,$00,$46)); |101: IID_IContextMenu: TGUID = (D1:$000214E4; D2:$0000; D3:$0000; D4:($C0,$00,$00,$00,$00,$00,$00,$46));|101: IID_IContextMenu2: TGUID = (D1:$000214F4; D2:$0000; D3:$0000; D4:($C0,$00,$00,$00,$00,$00,$00,$46));|101: IID_IEnumIDList: TGUID = (D1:$000214F2; D2:$0000; D3:$0000; D4:($C0,$00,$00,$00,$00,$00,$00,$46));|0:|67:// SID_IShellFolder = '{000214E6-0000-0000-C000-000000000046}';|68:// SID_IContextMenu = '{000214E4-0000-0000-C000-000000000046}'; |68:// SID_IContextMenu2 = '{000214F4-0000-0000-C000-000000000046}'; |68:// SID_IEnumIDList = '{000214F2-0000-0000-C000-000000000046}'; |0:|62:function SHGetDesktopFolder(var ppshf: IShellFolder): HResult;|59: stdcall; external 'shell32' name 'SHGetDesktopFolder';|5: |50:function SHGetMalloc(ppMalloc: IMalloc): HResult; |57: stdcall; external 'shell32' name 'SHGetMalloc'; |0:|67:procedure ShowContextMenu(HWND: hWnd; Path: String; x, y: Integer);|3:var|22: FullPath: PWideChar;|38: Folder, DesktopFolder: IShellFolder;|29: ContextMenu: IContextMenu2;|18: Malloc: IMalloc;|20: hPopupMenu: HMENU;|29: pLastId, pidl: PItemIDList;|32: pchEaten, dwAttributes: ULONG;|14: temp: SHORT;|15: offset: Word;|17: nCmd: LongBool;|11: p: PChar;|14: pos: TPoint;|27: ici: CMINVOKECOMMANDINFO;|5:begin|26: GetMem(FullPath, 1024);|3:TRY|45: StringToWideChar(Path, FullPath, MAX_PATH);|36: SHGetDesktopFolder(DesktopFolder);|84: DesktopFolder.ParseDisplayName(HWND, nil, FullPath, pchEaten, pidl, dwAttributes);|26: if pidl = nil then exit;|0:|18: pLastId := pidl;|0:|15: while True do|7: begin|30: offset := pLastId.mkid.cb;|26: p := Pointer(pLastId);|20: p := @p[offset];|21: temp := word(p^);|27: if temp = 0 then Break;|30: pLastId := PItemIDList(p);|6: end;|0:|32: hPopupMenu := CreatePopupMenu;|3:TRY|26: temp := pLastId.mkid.cb;|23: pLastId.mkid.cb := 0;|66: DesktopFolder.BindToObject(pidl, nil, IID_IShellFolder, Folder);|26: pLastId.mkid.cb := temp;|77: Folder.GetUIObjectOf(HWND, 1, pLastId, IID_IContextMenu, nil, ContextMenu);|60: ContextMenu.QueryContextMenu(hPopupMenu, 0, 1, $07FFF, 0);|67:// ContextMenu.QueryContextMenu(hPopupMenu, 0, 1, $07FFF, 16); |20: GetCursorPos(pos);|28: SetForegroundWindow(hWnd);|0:|134: nCmd := TrackPopupMenu(hPopupMenu, TPM_LEFTALIGN or TPM_LEFTBUTTON or TPM_RIGHTBUTTON or TPM_RETURNCMD, pos.x, pos.y, 0, hWnd, nil);|0:|14: if nCmd then|7: begin|51: FillChar(ici, sizeof(CMINVOKECOMMANDINFO), #0);|46: ici.cbSize := sizeof(CMINVOKECOMMANDINFO);|33: ici.fMask := CMIC_MASK_ICON; |21: ici.hwnd := hWnd;|48: ici.lpVerb := MAKEINTRESOURCE(Word(nCmd)-1);|31: ici.nShow := SW_SHOWNORMAL;|19: ici.hIcon := 0;|35: ContextMenu.InvokeCommand(ici);|6: end;|1: |24:// SHGetMalloc(Malloc);|22:// Malloc.Free(pidl);|7:FINALLY|26: DestroyMenu(hPopupMenu);|6:END; |7:FINALLY|20: FreeMem(FullPath);|8:END; |4:end;|0:|0:|35:procedure THiAsmClass.doCreateMenu;|18: var h : integer; |5:begin|30: h := ReadInteger(_Data,hwnd);|35: ShowContextMenu (h,'C:\', 10, 10);|4:end;|0:|4:end.|2: |
link(hwnd,162249:Handle,[])
}
Add(Button,9041049,322,217)
{
Left=20
Top=20
link(onClick,2747598:doCreateMenu,[])
}

карма: 22

2
Голосовали:andrestudio, a0005d26f
Ответов: 5227
Рейтинг: 587
#126: 2009-11-02 17:29:03 ЛС | профиль | цитата
спасибо, хотябы так пускай.
карма: 4
Мой форум - http://hiasm.bbtalk.me/ схемы, компоненты...
0
Ответов: 175
Рейтинг: 10
#127: 2009-11-02 18:47:41 ЛС | профиль | цитата
Чем не почва для нового и востребованного компонента HiAsm?

карма: 1

0
Разработчик
Ответов: 26113
Рейтинг: 2126
#128: 2009-11-02 18:58:42 ЛС | профиль | цитата
a0005d26f писал(а):
Чем не почва для нового и востребованного компонента HiAsm?

Рано, иконки вытащить еще надо. Вот если andrestudio поможет найти, как вытащить ресурсную иконку пункта меню, тогда и продолжим. А еще и подменю надо добавить, если есть. Целое дело, короче
карма: 22

0
Ответов: 5227
Рейтинг: 587
#129: 2009-11-02 19:17:39 ЛС | профиль | цитата
nesco, у меня есть более совершенный юнит (правда vcl) я так и не смог его запустить, встал когда не смог найти клас TControl и TWinowControl помоему, нервы здали конкретно, после того как длл даже не захотела работать в HiAsm то вообще поник почти полностью. Вот этот архив глянь, у меня делфи не стоит так что не пробовал

сюда залил http://slil.ru/28153960 ~70Kb
карма: 4
Мой форум - http://hiasm.bbtalk.me/ схемы, компоненты...
0
Разработчик
Ответов: 26113
Рейтинг: 2126
#130: 2009-11-04 02:43:59 ЛС | профиль | цитата
a0005d26f, специально для тебя
На SVN доступна первая версия компонента [svn]FilesContextMenu.pas[/svn]

andrestudio, гы, а там и иконки есть
карма: 22

1
Голосовали:andrestudio
Ответов: 5227
Рейтинг: 587
#131: 2009-11-04 08:55:54 ЛС | профиль | цитата
nesco, а что в следующих версиях намечается?, на самом деле прогресс в линейке Shell появился наконец таки.
карма: 4
Мой форум - http://hiasm.bbtalk.me/ схемы, компоненты...
0
Разработчик
Ответов: 26113
Рейтинг: 2126
#132: 2009-11-04 11:42:34 ЛС | профиль | цитата
andrestudio писал(а):
а что в следующих версиях намечается?

Может, чего дополнить придется.
карма: 22

0
Гость
Ответов: 17029
Рейтинг: 0
#133: 2009-11-04 13:09:11 правка | ЛС | профиль | цитата


Редактировалось 5 раз(а), последний 2021-06-21 07:03:30
карма: 0

0
Ответов: 5227
Рейтинг: 587
#134: 2009-11-04 13:11:03 ЛС | профиль | цитата
Забыл войти. Внимание, в этом примере пункты роботают вплоть до пункта --- Мой пункт меню типа ---, дальше может быть смещение (советую ничего ниже этого пункта не нажимать)
карма: 4
Мой форум - http://hiasm.bbtalk.me/ схемы, компоненты...
0
Разработчик
Ответов: 26113
Рейтинг: 2126
#135: 2009-11-04 13:14:07 ЛС | профиль | цитата
Да, я в курсе про возможность добавления пунктов меню, где-то и код у меня лежит этот. Буду на досуге пробовать
карма: 22

0
Сообщение
...
Прикрепленные файлы
(файлы не залиты)