Entfernen Sie das Element „Senden an“ aus dem Menü, das IContextMenu::QueryContextMenu zurückgibtC++

Programme in C++. Entwicklerforum
Guest
 Entfernen Sie das Element „Senden an“ aus dem Menü, das IContextMenu::QueryContextMenu zurückgibt

Post by Guest »

Ich muss das Element „Senden an“ aus dem von IContextMenu::QueryContextMenu zurückgegebenen Menü entfernen. Das Problem ist, dass das Menü „Senden an“ kein Verb hat und ich es mit nichts vergleichen kann, um es in der hMenu-Liste zu finden und zu entfernen.
Gibt es eine Möglichkeit, „Senden an“ auszuschließen? aus dem IContextMenu::QueryContextMenu-Ergebnis?
Hinweis: Ich muss „Senden an“ nicht für alle, sondern für einen bestimmten IContextMenu::QueryContextMenu-Aufruf ausschließen.
Ich habe versucht, anders zu verwenden Flags, zum Beispiel das CMF_VERBSONLY-Flag, schließen das Menü „Senden an“ aus, aber ich verstehe nicht, was genau dieses Flag im Allgemeinen bewirkt (es entfernt auch einige andere Menüs).
Zum Testen können Sie das ausführen folgenden Code. Sie können Ihren Ordner im Variablenwert „Pfad“ angeben.

Code: Select all

#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;
}

Quick Reply

Change Text Case: 
   
  • Similar Topics
    Replies
    Views
    Last post