Мне нужно удалить отправку элемента из меню, возвращаемого IContextMenu::QueryContextMenu. Проблема в том, что в меню «Отправить» нет команды, и я не могу сравнить его ни с чем, чтобы найти его в списке hMenu и удалить.
Есть ли способ исключить отправку из результата IContextMenu::QueryContextMenu?
Примечание. Мне нужно исключить отправку не для всех, а для конкретного вызова IContextMenu::QueryContextMenu.
Я пытался использовать разные флаги, например флаг CMF_VERBSONLY исключает меню "Отправить в", но я не понимаю, что конкретно делает этот флаг вообще (он удаляет и некоторые другие меню).
Для тестирования можно запустить следующий код. Вы можете указать свою папку в значении переменной «path».
#include
#include
LPCWSTR path = L"c:\\users\\currentuser";
//LPCWSTR path = L"c:\\temp\\test.txt"; // file sample for "share" test
LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
const int buttonId = 1;
const int buttonX = 10;
const int buttonY = 10;
switch (message)
{
case WM_CREATE:
CreateWindow(L"BUTTON", L"Show Context menu", WS_TABSTOP | WS_VISIBLE | WS_CHILD | BS_DEFPUSHBUTTON, buttonX, buttonY, 200, 30, hwnd, (HMENU)(long)buttonId, nullptr, nullptr);
break;
case WM_COMMAND:
if (LOWORD(wParam) == buttonId)
{
IShellItem* item;
SHCreateItemFromParsingName(path, NULL, IID_PPV_ARGS(&item));
if (item)
{
IContextMenu* cm;
item->BindToHandler(nullptr, BHID_SFUIObject, IID_PPV_ARGS(&cm));
if (cm)
{
auto menu = CreatePopupMenu();
const int firstId = 1;
cm->QueryContextMenu(menu, 0, firstId, 0x7FFF, CMF_NORMAL);
POINT pt{ buttonX, buttonY };
ClientToScreen(hwnd, &pt);
auto cmd = TrackPopupMenu(menu, TPM_RETURNCMD, pt.x, pt.y, 0, hwnd, nullptr);
if (cmd)
{
CMINVOKECOMMANDINFO cmi{};
cmi.cbSize = sizeof(CMINVOKECOMMANDINFO);
cmi.lpVerb = (LPSTR)MAKEINTRESOURCE(cmd - firstId);
cmi.nShow = SW_SHOWNORMAL;
cm->InvokeCommand(&cmi);
}
cm->Release();
DestroyMenu(menu);
}
item->Release();
}
}
break;
case WM_DESTROY:
PostQuitMessage(0);
break;
default:
return DefWindowProc(hwnd, message, wParam, lParam);
}
return 0;
}
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
auto hmod = LoadLibrary(L"shell32.dll");
auto fileIconInit = (BOOL(WINAPI*)(BOOL))GetProcAddress(hmod, MAKEINTRESOURCEA(660));
if (fileIconInit)
{
fileIconInit(TRUE);
}
WNDCLASS wc = {};
wc.lpfnWndProc = WndProc;
wc.hInstance = hInstance;
wc.lpszClassName = L"MyWindowClass";
RegisterClass(&wc);
auto hwnd = CreateWindow(wc.lpszClassName, L"Context Menu", WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, nullptr, nullptr, hInstance, nullptr);
ShowWindow(hwnd, nCmdShow);
UpdateWindow(hwnd);
MSG msg;
while (GetMessage(&msg, nullptr, 0, 0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return 0;
}
Подробнее здесь: https://stackoverflow.com/questions/793 ... rycontextm
Удалите элемент «Отправить» из меню, которое возвращает IContextMenu::QueryContextMenu. ⇐ C++
Программы на C++. Форум разработчиков
1736926187
Anonymous
Мне нужно удалить отправку элемента из меню, возвращаемого IContextMenu::QueryContextMenu. Проблема в том, что в меню «Отправить» нет команды, и я не могу сравнить его ни с чем, чтобы найти его в списке hMenu и удалить.
Есть ли способ исключить отправку из результата IContextMenu::QueryContextMenu?
Примечание. Мне нужно исключить отправку не для всех, а для конкретного вызова IContextMenu::QueryContextMenu.
Я пытался использовать разные флаги, например флаг CMF_VERBSONLY исключает меню "Отправить в", но я не понимаю, что конкретно делает этот флаг вообще (он удаляет и некоторые другие меню).
Для тестирования можно запустить следующий код. Вы можете указать свою папку в значении переменной «path».
#include
#include
LPCWSTR path = L"c:\\users\\currentuser";
//LPCWSTR path = L"c:\\temp\\test.txt"; // file sample for "share" test
LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
const int buttonId = 1;
const int buttonX = 10;
const int buttonY = 10;
switch (message)
{
case WM_CREATE:
CreateWindow(L"BUTTON", L"Show Context menu", WS_TABSTOP | WS_VISIBLE | WS_CHILD | BS_DEFPUSHBUTTON, buttonX, buttonY, 200, 30, hwnd, (HMENU)(long)buttonId, nullptr, nullptr);
break;
case WM_COMMAND:
if (LOWORD(wParam) == buttonId)
{
IShellItem* item;
SHCreateItemFromParsingName(path, NULL, IID_PPV_ARGS(&item));
if (item)
{
IContextMenu* cm;
item->BindToHandler(nullptr, BHID_SFUIObject, IID_PPV_ARGS(&cm));
if (cm)
{
auto menu = CreatePopupMenu();
const int firstId = 1;
cm->QueryContextMenu(menu, 0, firstId, 0x7FFF, CMF_NORMAL);
POINT pt{ buttonX, buttonY };
ClientToScreen(hwnd, &pt);
auto cmd = TrackPopupMenu(menu, TPM_RETURNCMD, pt.x, pt.y, 0, hwnd, nullptr);
if (cmd)
{
CMINVOKECOMMANDINFO cmi{};
cmi.cbSize = sizeof(CMINVOKECOMMANDINFO);
cmi.lpVerb = (LPSTR)MAKEINTRESOURCE(cmd - firstId);
cmi.nShow = SW_SHOWNORMAL;
cm->InvokeCommand(&cmi);
}
cm->Release();
DestroyMenu(menu);
}
item->Release();
}
}
break;
case WM_DESTROY:
PostQuitMessage(0);
break;
default:
return DefWindowProc(hwnd, message, wParam, lParam);
}
return 0;
}
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
auto hmod = LoadLibrary(L"shell32.dll");
auto fileIconInit = (BOOL(WINAPI*)(BOOL))GetProcAddress(hmod, MAKEINTRESOURCEA(660));
if (fileIconInit)
{
fileIconInit(TRUE);
}
WNDCLASS wc = {};
wc.lpfnWndProc = WndProc;
wc.hInstance = hInstance;
wc.lpszClassName = L"MyWindowClass";
RegisterClass(&wc);
auto hwnd = CreateWindow(wc.lpszClassName, L"Context Menu", WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, nullptr, nullptr, hInstance, nullptr);
ShowWindow(hwnd, nCmdShow);
UpdateWindow(hwnd);
MSG msg;
while (GetMessage(&msg, nullptr, 0, 0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return 0;
}
Подробнее здесь: [url]https://stackoverflow.com/questions/79330504/remove-the-send-to-item-from-the-menu-that-returns-icontextmenuquerycontextm[/url]
Ответить
1 сообщение
• Страница 1 из 1
Перейти
- Кемерово-IT
- ↳ Javascript
- ↳ C#
- ↳ JAVA
- ↳ Elasticsearch aggregation
- ↳ Python
- ↳ Php
- ↳ Android
- ↳ Html
- ↳ Jquery
- ↳ C++
- ↳ IOS
- ↳ CSS
- ↳ Excel
- ↳ Linux
- ↳ Apache
- ↳ MySql
- Детский мир
- Для души
- ↳ Музыкальные инструменты даром
- ↳ Печатная продукция даром
- Внешняя красота и здоровье
- ↳ Одежда и обувь для взрослых даром
- ↳ Товары для здоровья
- ↳ Физкультура и спорт
- Техника - даром!
- ↳ Автомобилистам
- ↳ Компьютерная техника
- ↳ Плиты: газовые и электрические
- ↳ Холодильники
- ↳ Стиральные машины
- ↳ Телевизоры
- ↳ Телефоны, смартфоны, плашеты
- ↳ Швейные машинки
- ↳ Прочая электроника и техника
- ↳ Фототехника
- Ремонт и интерьер
- ↳ Стройматериалы, инструмент
- ↳ Мебель и предметы интерьера даром
- ↳ Cантехника
- Другие темы
- ↳ Разное даром
- ↳ Давай меняться!
- ↳ Отдам\возьму за копеечку
- ↳ Работа и подработка в Кемерове
- ↳ Давай с тобой поговорим...
Мобильная версия