#include <windows.h>
#include <shobjidl_core.h>
#include <windowsx.h>
#include <shlobj_core.h> #pragma comment(lib,"Shell32.lib") #define MAX_LOADSTRING 100
#define SCRATCH_QCM_FIRST 1
#define SCRATCH_QCM_LAST 0x7FFF IContextMenu2* g_pcm2;
IContextMenu3* g_pcm3; ... LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
int xPos;
int yPos; if (g_pcm3) {
LRESULT lres;
if (SUCCEEDED(g_pcm3->HandleMenuMsg2(message, wParam, lParam, &lres))) {
return lres;
}
}
else if (g_pcm2) {
if (SUCCEEDED(g_pcm2->HandleMenuMsg(message, wParam, lParam))) {
return 0;
}
}
switch (message)
{
case WM_CONTEXTMENU:
{
xPos = GET_X_LPARAM(lParam);
yPos = GET_Y_LPARAM(lParam);
OnContextMenu(hWnd, xPos, yPos);
}
break;
... void OnContextMenu(HWND hwnd, int xPos, int yPos)
{
WCHAR pszFilePath[] = L"C:\\Users\\xx\\Desktop\\1.txt";
IShellFolder* psfDesktop = NULL;
ITEMIDLIST* id = 0;
LPCITEMIDLIST idChild = 0;
IContextMenu* pcm = NULL;
int iCmdTemp = 0; POINT pt = { xPos, yPos };
if (pt.x == -1 && pt.y == -1) {
pt.x = pt.y = 0;
ClientToScreen(hwnd, &pt);
} SHParseDisplayName(pszFilePath, 0, &id, 0, 0);
SHBindToParent(id, IID_IShellFolder, (void**)&psfDesktop, &idChild); psfDesktop->GetUIObjectOf(hwnd, 1, (const ITEMIDLIST**)&idChild, __uuidof(IContextMenu), NULL, (void**)&pcm); if (pcm) {
HMENU hmenu = CreatePopupMenu();
if (hmenu) {
if (SUCCEEDED(pcm->QueryContextMenu(hmenu, 0,
SCRATCH_QCM_FIRST, SCRATCH_QCM_LAST,
CMF_NORMAL))) { pcm->QueryInterface(IID_IContextMenu2, (void**)&g_pcm2);
pcm->QueryInterface(IID_IContextMenu3, (void**)&g_pcm3); int iCmd = TrackPopupMenuEx(hmenu, TPM_RETURNCMD,
pt.x, pt.y, hwnd, NULL);
if (g_pcm2) {
g_pcm2->Release();
g_pcm2 = NULL;
}
if (g_pcm3) {
g_pcm3->Release();
g_pcm3 = NULL;
}
if (iCmd > 0) {
CMINVOKECOMMANDINFOEX info = { 0 };
info.cbSize = sizeof(info);
info.fMask = 0x00004000;
info.hwnd = hwnd;
iCmdTemp = iCmd - SCRATCH_QCM_FIRST;
info.lpVerb = MAKEINTRESOURCEA(iCmdTemp);
info.lpVerbW = MAKEINTRESOURCEW(iCmdTemp);
info.nShow = SW_SHOWNORMAL;
pcm->InvokeCommand((LPCMINVOKECOMMANDINFO)&info);
} }
DestroyMenu(hmenu);
}
pcm->Release();
}
}

相关:How to host an IContextMenu, part 5 – Handling menu messages

win32 - Shell菜单项的创建的更多相关文章

  1. Android开发 ---代码创建选项菜单、隐藏菜单项、菜单的生命周期,菜单按钮图标设置、搜索框、xml中设置子菜单

    1.activity_main.xml 描述: 定义了一个按钮 <?xml version="1.0" encoding="utf-8"?> < ...

  2. 基于electron+vue+element构建项目模板之【自定义标题栏&右键菜单项篇】

    1.概述 开发平台OS:windows 开发平台IDE:vs code 本篇章将介绍自定义标题栏和右键菜单项,基于electron现有版本安全性的建议,此次的改造中主进程和渲染进程彼此语境隔离,通过预 ...

  3. Android菜单项内容大全

    一.介绍: 菜单是许多应用中常见的用户界面组件. Android3.0版本以前,Android设备会提供一个专用"菜单"按钮呈现常用的一些用户操作, Android3.0版本以后, ...

  4. 添加系统右键菜单项 管理员取得所有权(W)(带盾牌)

    @color 0A @title 添加系统右键菜单项 管理员取得所有权(^&W)(带盾牌) by wjshan0808 @echo off echo * >nul reg add HKC ...

  5. SharePoint 2013:自定义ECB菜单项的添加

    本文分别介绍了两种常用的添加ECB菜单项的方式. 声明式创建 这也是微软最佳实践推荐的方式.在VS中创建一个SharePoint空解决方案,并添加一个“空元素”类型的SPI. 在Elements.xm ...

  6. Android菜单Menu的创建

    在res目录下的menu文件夹下创建一个main.xml文件,内容如下: <?xml version="1.0" encoding="utf-8"?> ...

  7. TortoiseSVN菜单项功能说明

    TortoiseSVN是windows下其中一个非常优秀的SVN客户端工具.通过使用它,我们可以可视化的管理我们的版本库.不过由于它只是一个客户端,所以它不能对版本库进行权限管理. TortoiseS ...

  8. JavaScript网站设计实践(二)实现导航栏当前所选页面的菜单项高亮显示

    一.(一)中的代码还可以修改的地方. 在(一)中,如果是运行在服务器下,如apache等,可以把head和navigation的div抽取出来,放置在另一个html文件里,然后在页面中,include ...

  9. winform 菜单项显示历史记录 分类: WinForm 2014-07-11 18:15 196人阅读 评论(0) 收藏

    (1)创建一个项目,将其命名为MenuHistory,默认窗体为Form1. (2)从工具箱中向Form1窗体添加MenuStrip控件,同时向窗体添加OpenFileDialog控件.创建一个&qu ...

  10. win32 htmlayout点击按钮创建新窗口,以及按钮图片样式

    最近在做一个C++ win32的桌面图形程序,我不是C++程序员,做这个只是因为最近没什么java的活. windows api,之前接触的时候,还是大学,那时用这个开发打飞机游戏纯粹是娱乐.现在基本 ...

随机推荐

  1. [转帖]Linux系统管理-crond、chkconfig、systemd、unit、target

    https://cloud.tencent.com/developer/article/1409845 10.23 linux任务计划cron crontab命令被用来提交和管理用户的需要周期性执行的 ...

  2. [转帖]Harbor:修改默认的172网段

    背景: harbor 默认启动会随机创建 172 网段的ip地址,跟集群规划的网段冲突 Harbor 网段修改步骤 0. 原来Harbor占用的网段 # 网桥名:harbor_harbor [root ...

  3. [转帖]TiDB BR 备份至 MinIO S3 实战

    https://tidb.net/blog/3a31d41d#3.%E9%83%A8%E7%BD%B2%20MinIO%20S3%20%E5%8F%8A%E5%A4%87%E4%BB%BD%E6%81 ...

  4. [转帖]Docker、containerd的关系

    Docker.containerd的关系 containerd囊括了单机运行一个容器时所需要的一切: 为了能够支持多种OCI Runtime,containerd 内部使用containerd-shi ...

  5. [转帖]漏洞预警|Apache Tomcat 信息泄露漏洞

    http://www.hackdig.com/03/hack-953615.htm 棱镜七彩安全预警 近日网上有关于开源项目Apache Tomcat 信息泄露漏洞,棱镜七彩威胁情报团队第一时间探测到 ...

  6. [转帖]基于腾讯云微服务引擎(TSE) ,轻松实现云上全链路灰度发布

    https://my.oschina.net/u/4587289/blog/8570699 1.  概述 软件开发过程中,应用发布非常频繁,通常情况下,开发或运维人员会将系统里所有服务同时上线,使得所 ...

  7. JVM启动速度大页内存验证

    大页内存设置 先查看 cat /proc/meminfo |grep -i huge 获取大页内存的大小信息. AnonHugePages: 42022912 kB HugePages_Total: ...

  8. [转贴]手把手教你 GitLab 的安装及使用

    https://www.jianshu.com/p/b04356e014fa 前言 新入职公司,发现公司还在使用落后生产工具 svn,由于重度使用过 svn 和 git ,知道这两个工具之间的差异,已 ...

  9. MySQL备份恢复简单处理方法

    客户备份恢复的脚本处理简要如下: 首先登陆mysql服务器 方法如下: mysql -uroot -p 输入密码即可登陆 然后需要创建一个数据库, 个人感觉同名恢复最容易出问题 create data ...

  10. 混沌测试平台 Chaos Mesh

    混沌测试平台 Chaos Mesh Chaos Mesh 是PingCap团队研发的一款用于测试kubernetes环境的工具.通过人为地在集群中注入故障来检测集群对故障的处理以及恢复能力.更详细信息 ...