win32 - Shell菜单项的创建
#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菜单项的创建的更多相关文章
- Android开发 ---代码创建选项菜单、隐藏菜单项、菜单的生命周期,菜单按钮图标设置、搜索框、xml中设置子菜单
1.activity_main.xml 描述: 定义了一个按钮 <?xml version="1.0" encoding="utf-8"?> < ...
- 基于electron+vue+element构建项目模板之【自定义标题栏&右键菜单项篇】
1.概述 开发平台OS:windows 开发平台IDE:vs code 本篇章将介绍自定义标题栏和右键菜单项,基于electron现有版本安全性的建议,此次的改造中主进程和渲染进程彼此语境隔离,通过预 ...
- Android菜单项内容大全
一.介绍: 菜单是许多应用中常见的用户界面组件. Android3.0版本以前,Android设备会提供一个专用"菜单"按钮呈现常用的一些用户操作, Android3.0版本以后, ...
- 添加系统右键菜单项 管理员取得所有权(W)(带盾牌)
@color 0A @title 添加系统右键菜单项 管理员取得所有权(^&W)(带盾牌) by wjshan0808 @echo off echo * >nul reg add HKC ...
- SharePoint 2013:自定义ECB菜单项的添加
本文分别介绍了两种常用的添加ECB菜单项的方式. 声明式创建 这也是微软最佳实践推荐的方式.在VS中创建一个SharePoint空解决方案,并添加一个“空元素”类型的SPI. 在Elements.xm ...
- Android菜单Menu的创建
在res目录下的menu文件夹下创建一个main.xml文件,内容如下: <?xml version="1.0" encoding="utf-8"?> ...
- TortoiseSVN菜单项功能说明
TortoiseSVN是windows下其中一个非常优秀的SVN客户端工具.通过使用它,我们可以可视化的管理我们的版本库.不过由于它只是一个客户端,所以它不能对版本库进行权限管理. TortoiseS ...
- JavaScript网站设计实践(二)实现导航栏当前所选页面的菜单项高亮显示
一.(一)中的代码还可以修改的地方. 在(一)中,如果是运行在服务器下,如apache等,可以把head和navigation的div抽取出来,放置在另一个html文件里,然后在页面中,include ...
- winform 菜单项显示历史记录 分类: WinForm 2014-07-11 18:15 196人阅读 评论(0) 收藏
(1)创建一个项目,将其命名为MenuHistory,默认窗体为Form1. (2)从工具箱中向Form1窗体添加MenuStrip控件,同时向窗体添加OpenFileDialog控件.创建一个&qu ...
- win32 htmlayout点击按钮创建新窗口,以及按钮图片样式
最近在做一个C++ win32的桌面图形程序,我不是C++程序员,做这个只是因为最近没什么java的活. windows api,之前接触的时候,还是大学,那时用这个开发打飞机游戏纯粹是娱乐.现在基本 ...
随机推荐
- [转帖]AMD Zen CPU 架构以及不同CPU性能大PK
https://plantegg.github.io/2021/08/13/AMD_Zen_CPU%E6%9E%B6%E6%9E%84/ 前言 本文先介绍AMD Zen 架构,结合前一篇文章<C ...
- [转帖] jq命令用法总结
https://www.cnblogs.com/codelogs/p/16324928.html 原创:扣钉日记(微信公众号ID:codelogs),欢迎分享,转载请保留出处. 简介# 如果说要给Li ...
- [转帖]重置 VCSA 6.7 root密码和SSO密码
问题描述 1.用root用户登录 VMware vCenter Server Appliance虚拟机失败,无法登录 2.vCenter Server Appliance 6.7 U1的root帐户错 ...
- [转帖]Elasticsearch-索引性能调优
1:设置合理的索引分片数和副本数 索引分片数建议设置为集群节点的整数倍,初始数据导入时副本数设置为 0,生产环境副本数建议设置为 1(设置 1 个副本,集群任意 1 个节点宕机数据不会丢失:设置更多副 ...
- [转帖]linux 查看CPU 内存的信息
https://bbs.huaweicloud.com/blogs/302929 [摘要] ECS信息规格:2vCPUs | 4GiB | kc1.large.2镜像:openEuler 20.0 ...
- css3中的圆角border-radius
css3的属性应该加上浏览器前缀 不同的浏览器内核不同,因此css的前缀不同. 常见的几种浏览器内核 火狐浏览器 Geoko内核 前缀是 -mox- 谷歌浏览器, Webkit内核 前缀是 -wekb ...
- Windows10磁盘占用100%和内存占用高
前言 公司配备了两台电脑,两台电脑都是安装的win10系统,一台是磁盘占用高,另一台是内存可用低. 具体情况如下: 一台外网机 8g内存,安装win10 专业版,开机一天后经常出现内存不够用,但其实都 ...
- 若依、vue三级路由缓存失败
router.beforeEach((to, from, next) => { NProgress.start() if (getToken()) { // 三级菜单组件无法缓存问题 if (t ...
- 【一】飞桨paddle【GPU、CPU】安装以及环境配置+python入门教学
相关文章: [一]飞桨paddle[GPU.CPU]安装以及环境配置+python入门教学 [二]-Parl基础命令 [三]-Notebook.&pdb.ipdb 调试 [四]-强化学习入门简 ...
- 4.6 Windows驱动开发:内核遍历进程VAD结构体
在上一篇文章<内核中实现Dump进程转储>中我们实现了ARK工具的转存功能,本篇文章继续以内存为出发点介绍VAD结构,该结构的全程是Virtual Address Descriptor即虚 ...