65.9K
CodeProject 正在变化。 阅读更多。
Home

PocketPC - 将永久菜单项添加到新建按钮菜单

starIconstarIconstarIcon
emptyStarIcon
starIcon
emptyStarIcon

3.50/5 (6投票s)

2002年11月27日

CPOL

4分钟阅读

viewsIcon

74282

downloadIcon

155

了解如何为 PocketPC 的“新建”按钮弹出菜单添加新的自定义菜单项。

Sample Image - PPCNewMenu.jpg

引言

在我最近编写的一个 PocketPC 应用程序中,我的一项任务是为 PocketPC 的“新建”按钮菜单添加自定义菜单项。由于我在 Pocket PC 编程论坛上看到过这个问题被问及很多次,我认为有必要写一篇相关的文章。当然,您也可以参考 PocketPC SDK 中关于“新建”菜单项的文档。通过这个简短的教程,我将向您展示完成此操作所需的步骤。示例项目添加了此类菜单项并处理相应的菜单单击事件。

我假设您是一名使用 eMbedded Visual C++ 3.0 进行开发的 PocketPC 程序员,并且具有一定的 COM 编程经验,不过 eVC++ 初学者也应该能够轻松理解。

概述

PocketPC “今日”屏幕底部的“新建”按钮允许用户快速创建任何类型的项目并启动父应用程序。单击“新建”按钮会显示一个弹出菜单,其中包含一个菜单项列表,每个菜单项都让用户能够快速访问常用项目,例如联系人、新电子邮件或文档类型,如 Word 文档、Excel 工作簿等。“新建”按钮和所有单个菜单项可以在通过“开始”->“设置”->“菜单”并单击“新建菜单”选项卡弹出的“新建菜单”属性页中启用和禁用。

您会发现,向“新建”按钮菜单添加自定义菜单项非常容易。最棒的是,如果您使用 ATL 这样的框架来创建 COM 对象,您只需要不到 10 行代码即可完成所有操作。

COM 插件

可以通过 COM 插件将自定义项目添加到“新建”按钮弹出菜单。添加条目到“新建”按钮菜单有两种方式——动态和通过COM 插件。动态方式是指,当应用程序在前台并且单击“新建”菜单时,应用程序会收到一个通知消息(NMN_GETAPPREGKEY)。传递给此通知消息的 NMNEWMENU 指针可以用来添加/修改“新建”按钮菜单的条目。但是,本文的讨论仅限于 COM 插件。如果您对动态添加条目感兴趣,请查阅 MSDN 中关于 NMNEWMENU 结构和 NMN_GETAPPREGKEY 通知消息的文档。

通过 COM 插件,可以为“新建”按钮菜单的弹出菜单创建一个新的自定义条目。 such a component is like a Windows shell extension and such a menu addition will be more permanent in nature. 您可能已经看到过“新建”菜单子项,例如新建约会、新建联系人、便笺、任务等。这些基本上是始终显示的 COM 插件。文档建议应用程序应通过 COM 插件向“新建”按钮菜单添加单个菜单项。

注册表

与 Shell 扩展一样,自定义菜单扩展需要添加一些注册表项。以下键很重要:

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Shell\Extensions\NewMenu
\CLSID = <menu string>
\Enabled = DWORD

HKEY_CLASSES_ROOT\CLSID\
\CLSID\InprocServer = <component dll location>

入门

在这里,我们将使用 ATL 创建一个 COM 插件,该插件向“新建”按钮添加一个自定义菜单项。接下来,我们将学习如何在插件中处理单击事件。因此,启动 eVC++ IDE,并使用WCE COM ATL Appwizard创建一个新的 ATL COM 项目。保存项目后,使用“插入”->“新建 ATL 对象”菜单向您的项目添加一个名为MenuHandler的新 ATL 简单对象(选择所有默认设置,然后单击“确定”)。

首先,是必要的注册表例程。转到“文件视图”,打开MenuHandler.rgs资源文件,并添加以下脚本。

HKLM
{
  SOFTWARE
    {
        Microsoft
        {
            Shell
            {
                Extensions
                {
                  NewMenu
                  {
                    ForceRemove 
                     {7EB8A0D7-7D17-44CC-A74A-00DC6AB30734} = s 'Clickety'
                        {
                            val Enabled = d '1'
                        }
                  }
                }
            }
        }
    }

}

幸运的是,ATL 对象向导已经将创建注册 COM DLL 所需的注册表项的代码添加到我们的注册表脚本中了,我们无需再处理这些键。

当单击我们的菜单项时,Shell 会枚举 NewMenu 注册表项,并根据 CLSID 创建 COM 对象。您可能希望执行一些有用的操作,例如在单击“应用程序文档”菜单项时运行您的应用程序。在这里,为了处理“单击”事件,我们将代码添加到项目中的 ATL 类。该类的构造函数仅使用 ShellExecuteEx API 来启动 Pocket PC 欢迎屏幕(welcome.exe)可执行文件的实例,例如:

SHELLEXECUTEINFO sei;
ZeroMemory(&sei, sizeof(SHELLEXECUTEINFO));
sei.cbSize = sizeof(SHELLEXECUTEINFO);
sei.lpFile = _T("\\windows\\welcome.exe");
sei.nShow = SW_SHOW;
ShellExecuteEx(&sei);

但是在您的应用程序中,例如,您可以运行以下代码来运行您的应用程序并在单击“新建应用程序文档”菜单时打开新文档:

sei.lpFile = _T("\\windows\\myapp.exe");
sei.lpParameters = _T("-new");
ShellExecuteEx(&sei);

就是这样。要禁用插件菜单项,请将 Enabled 设置为 DWORD 0。要删除它,请注销组件 DLL。

尽情享用!

参考文献

  • MSDN 文档。

其他

是的——“The Ladder”专辑,我似乎一直在不停地听。:)

© . All rights reserved.