精华内容
下载资源
问答
  • 自定义Windows 10开始菜单的10种方法

    千次阅读 2020-09-20 14:54:26
    Windows 10 finally brought back the Start menu, and it’s more customizable than ever. Here’s a quick rundown of all the different ways that you can make the Start... Windows 10终于带回了“开始”菜单...
    windows desktop with open start menu

    Windows 10 finally brought back the Start menu, and it’s more customizable than ever. Here’s a quick rundown of all the different ways that you can make the Start menu your own.

    Windows 10终于带回了“开始”菜单,并且它比以往任何时候都更具可定制性。 这是您可以使“开始”菜单成为自己的所有不同方式的简要介绍。

    组织,编辑,删除或将新项目添加到应用程序列表 (Organize, Edit, Delete, or Add New Items to the Apps List)

    You can easily get to the Start menu’s folder structure on the hard drive to edit, rearrange, or even add new items. This also gives you the benefit of being able to search for these new shortcuts that you create. And yes, you can do this by dragging items around individually on (or to) the Start menu, but rearranging via File Explorer is much quicker if you have a bunch of things you want to change.

    您可以轻松地进入硬盘驱动器上“开始”菜单的文件夹结构 ,以进行编辑,重新排列甚至添加新项目。 这也使您能够搜索自己创建的这些新快捷方式。 是的,您可以通过在“开始”菜单上(或拖到“开始”菜单上)单独拖动项目来完成此操作,但是如果您要更改很多东西,则通过文件资源管理器进行重新排列要快得多。

    Start menu\programs folder in File Explorer

    It’s worth noting that the Start menu folder won’t show Universal apps you have installed, so you’ll need to deal with those just using the menu itself. For the most part, you can uninstall any app—except for some built-in apps—by right-clicking them in the Start menu and choosing “Uninstall.”

    值得注意的是,“开始”菜单文件夹不会显示您已安装的通用应用程序,因此您只需要使用菜单本身即可处理这些应用程序。 在大多数情况下,可以通过右键单击“开始”菜单中的“应用程序”并选择“卸载”来卸载任何应用程序(某些内置应用程序除外)。

    uninstall app from start menu

    调整开始菜单的大小 (Resize the Start Menu)

    You can quickly resize the Start menu by dragging the top or right edge of the menu with your mouse.

    您可以通过使用鼠标拖动菜单的顶部或右侧边缘来快速调整“开始”菜单的大小。

    drag edges to resize start menu

    Resizing vertically works just as you’d expect. When you resize horizontally, you can increase the Start menu by one full column of icon groups at a time—up to four columns. Unfortunately, you can only narrow the menu down to one column.

    垂直调整大小可以按照您的期望进行。 水平调整大小时,可以一次在“开始”菜单上增加一整列图标组的列,最多四列。 不幸的是,您只能将菜单缩小到一列。

    You can also set Windows to show a few extra tiles in each column. Just head to Settings > Personalization > Start and turn on the “Show more tiles on Start” option.

    您还可以将Windows设置为在每列中显示一些额外的图块。 只需转到“设置”>“个性化”>“开始”,然后打开“在开始时显示更多图块”选项即可。

    turn on show more tiles on start option

    With the “Show more tiles on Start” option on, you can see that the tile column has expanded by the width of one medium-sized tile.

    启用“在开始时显示更多图块”选项后,您会看到图块列已扩展了一个中型图块的宽度。

    start menu with extra tiles showing

    Note that if you do turn on the “Show more tiles” option, you can still resize the Start menu horizontally, but only up to three columns of icon groups instead of four.

    请注意,如果您确实启用了“显示更多图块”选项,则仍可以水平调整“开始”菜单的大小,但最多只能调整三列图标组,而不是四列。

    固定和取消固定瓷砖 (Pin and Unpin Tiles)

    You can easily pin and unpin tiles by right-clicking on each one and selecting “Unpin from Start.”

    右键单击每个磁贴,然后选择“从开始取消固定”,即可轻松固定和取消固定磁贴。

    unpin from start option on start menu

    If there’s an app that isn’t pinned, but you want a tile for it, just browse through the list of apps on the left side of the Start menu. When you find what you’re looking for, right-click the app and choose “Pin to Start.”

    如果有一个未固定的应用程序,但您需要一个图块,则只需浏览“开始”菜单左侧的应用程序列表即可。 找到所需的内容后,右键单击该应用程序,然后选择“固定到启动”。

    pin to start option on start menu

    调整瓷砖 (Resize Tiles)

    You can change the size of a tile by right-clicking it, pointing to “Resize,” and then picking the size you want.

    您可以通过右键单击并指向“调整大小”,然后选择所需的大小来更改图块的大小。

    resizing tile on start menu

    Four small tiles fit into a medium tile. Four medium tiles fit into a large tile. And a wide tile is the size of two side-by-side medium tiles.

    四个小砖块可放入一个中号砖块。 四个中等大小的瓷砖可放入一个大瓷砖中。 一个宽的磁贴等于两个并排的中等磁贴的大小。

    start menu showing relative tile sizes

    Unfortunately, the tiling can be a little weird, so if you have an odd number of small tiles, you’ll end up with blank space.

    不幸的是,平铺可能有点怪异,因此,如果您有奇数个小瓷砖,则最终会留有空白。

    关闭实时磁贴更新 (Turn Off Live Tile Updates)

    If all those flashing tiles end up annoying you, just right-click on them, point to “More,” and then choose “Turn live tile off.”

    如果所有这些闪烁的磁贴最终都惹恼了您,只需右键单击它们,指向“更多”,然后选择“关闭实时磁贴”。

    turn live tile off option on start menu

    Compared to the example above, you can see that the News tile is back to being a regular tile button.

    与上面的示例相比,您可以看到“新闻”图块已恢复为常规图块按钮。

    showing live tile now turned off

    For the most part, we find live tiles a little busy for our tastes, but they can be useful for tiles like Weather or Calendar where it’s nice to have some at-a-glance info.

    在大多数情况下,我们发现实时显示的图块忙于我们的口味,但对于诸如“天气”或“日历”之类的图块很有用,它们可以快速显示一些信息。

    将图块分组到文件夹中 (Group Tiles Into Folders)

    You can also group tiles on the Start menu into folders. These folders work much like app folders on a smartphone. To create a new folder, drag any tile and drop it onto another tile. Those tiles will then be grouped into a folder. You can then add other tiles to the folder by dragging them on top of the folder.

    您也可以将“开始”菜单上的图块分组到文件夹中。 这些文件夹的工作方式类似于智能手机上的应用程序文件夹。 要创建新文件夹,请将任何图块拖放到另一个图块上。 这些磁贴将被分组到一个文件夹中。 然后,可以通过将其他磁贴拖动到文件夹顶部来将其添加到该文件夹​​中。

    drag tile onto another tile

    Once you have tiles in a folder, you just have to click the folder to expand it.

    文件夹中有图块后,只需单击该文件夹即可将其展开。

    click a folder to expand it

    Then, you can click any tile inside to launch the app. Click the arrow above the folder to collapse it again.

    然后,您可以单击内部的任意图块以启动应用程序。 单击文件夹上方的箭头再次将其折叠。

    click arrow above tile group to close folder

    If you want to remove tiles from a folder, drag them back out of the folder and drop them directly on your Start menu. You could also unpin the tile from your Start menu and then pin it back again if dragging them out is too awkward.

    如果要从文件夹中删除磁贴,请将其拖出文件夹,然后将其直接放在“开始”菜单上。 您也可以从“开始”菜单中取消固定图块,然后再将其拖出(如果将它们拖出太尴尬)。

    如果您不喜欢,请删除所有活动瓷砖 (Remove All Live Tiles if You Don’t Like Them)

    If you don’t like the tiles on your Start menu at all, you can remove them. Just right-click each one and then click “Unpin from Start” until they’re all gone.

    如果您根本不喜欢“开始”菜单上的图块,则可以将其删除。 只需右键单击每个,然后单击“从开始取消固定”,直到它们全部消失。

    unpin from start option

    After you unpin the last tile, you can resize the Start menu horizontally by grabbing its right edge and dragging until the tile section disappears. You’re then left with just a nice, trim list of apps.

    取消固定最后一个图块后,您可以通过抓住右边缘并拖动直到图块部分消失来水平调整“开始”菜单的大小。 然后,您只剩下一个不错的应用清单。

    start menu with no tiles showing

    更改开始菜单(和任务栏)颜色 (Change the Start Menu (and Taskbar) Color)

    You can easily change the color of your Start Menu and Taskbar. Head to Settings > Personalization > Colors to get started. Windows lets you pick a single accent color from a preselected group, or you can fine tune the accent color you want by clicking the “Custom Color” button. Just click any color you want to use. You can also let Windows pick an accent color for you based on your current background wallpaper by selecting the “Automatically pick an accent color from my background” option.

    您可以轻松更改“开始”菜单和任务栏的颜色。 转到设置>个性化>颜色开始。 Windows使您可以从预选组中选择一种强调色,也可以通过单击“自定义颜色”按钮微调所需的强调色。 只需单击您要使用的任何颜色。 您还可以通过选择“从我的背景自动选择一种强调色”选项,让Windows根据当前背景墙纸为您选择一种强调色。

    choosing colors in the settings app

    After picking an accent color, your next step is choosing where that accent color gets used. Scroll down a bit to the “More Options” section. Your two options here are “Start, taskbar, and action center” and “Title bars.” The first option uses the accent color as the background for your Start menu, taskbar, and action center and also highlights certain items on those elements—such as app icons on the Start menu—with the same accent color. The second option uses the accent color for the title bar of your active window.

    选择一种强调色后,下一步就是选择该强调色的使用位置。 向下滚动到“更多选项”部分。 这里的两个选项是“开始,任务栏和操作中心”和“标题栏”。 第一个选项使用强调色作为开始菜单,任务栏和操作中心的背景,并使用相同的强调色突出显示这些元素上的某些项目(例如“开始”菜单上的应用程序图标)。 第二个选项为活动窗口的标题栏使用强调色。

    more options for colors

    Unfortunately, the Start menu, taskbar, and Action Center elements are grouped for color selection, and you can’t make them different colors. We do, however, have a quick registry hack that can at least let you keep a black background on your Start menu and action center. The second option uses the accent color on the title bar of active windows, though we also have another hack for you if you want to use the accent color on inactive windows, as well.

    不幸的是,“开始”菜单,任务栏和“操作中心”元素已分组以进行颜色选择,并且您不能将它们设置为不同的颜色。 但是,我们确实有一个快速的注册表黑客,至少可以让您在“开始”菜单和操作中心上保留黑色背景 。 第二个选项使用活动窗口标题栏上的强调色,尽管如果您也想在不活动窗口上使用强调色 ,我们也有另一种技巧。

    Back on the Colors personalization screen, you’ll also find a “Transparency effect” option for making your Start menu, taskbar, and action center transparent or not. This option does not affect the accent color if it’s used on those elements.

    返回到“颜色”个性化设置屏幕,您还将找到一个“透明效果”选项,以使“开始”菜单,任务栏和操作中心透明。 如果在这些元素上使用了强调色,则此选项不会影响其颜色。

    And finally, you can enable a dark mode for settings and apps. While this app mode setting doesn’t affect every app, we do have some tricks you might enjoy for using a dark theme almost everywhere in Windows 10.

    最后,您可以为设置和应用启用暗模式。 尽管此应用程序模式设置不会影响每个应用程序,但在Windows 10中几乎所有地方 ,我们都会为您提供一些使用暗色主题的技巧。

    控制您的应用列表在“开始”菜单上的显示方式 (Control How Your App Lists Appear on the Start Menu)

    By default, your Start menu displays several of your recently installed, most used, and suggested apps, followed by a list of all the apps installed on your system.

    默认情况下,“开始”菜单显示一些最近安装,使用最频繁和建议使用的应用程序,然后显示系统上安装的所有应用程序的列表。

    app lists on the start menu

    If you don’t like these—say you’d rather just see your full list of apps without having to scroll for it—all three sections are easy to turn off. Head to Settings > Personalization > Start. Look for the “Show app list in Start menu,” “Show recently added apps,” and “Show most used apps” options and turn off any you don’t want to see on your Start menu.

    如果您不喜欢这些工具(例如,您只想查看完整的应用程序列表而不用滚动即可),那么可以轻松关闭所有三个部分。 转到设置>个性化>开始。 查找“在“开始”菜单中显示应用程序列表”,“显示最近添加的应用程序”和“显示最常用的应用程序”选项,然后关闭所有不想在“开始”菜单上看到的内容。

    turning off app displays in the settings app

    选择出现在开始菜单上的文件夹 (Choose Which Folders Appear on the Start Menu)

    The User, Documents, Pictures, Settings, and Power options are now tucked away in a tiny column on the far left of the Start menu. Click the button at the top left of the Start menu to expand this column.

    现在,“用户”,“文档”,“图片”,“设置”和“电源”选项被藏在“开始”菜单最左侧的小栏中。 单击开始菜单左上方的按钮以展开此列。

    click hamburger menu at top of start menu to expand folder names

    You can see those same options with their full names and also a lot of nice, inviting open space above them. You can add stuff to that space.

    您可以看到具有相同全名的相同选项,并且在它们上方还有很多不错的,吸引人的开放空间。 您可以向该空间添加内容。

    start menu showing expanded folder names

    Head to Settings > Personalization > Start. On the right, scroll all the way to the bottom and click the “Choose which folders appear on Start” link.

    转到设置>个性化>开始。 在右侧,一直滚动到底部,然后单击“选择在“开始”中出现哪些文件夹”链接。

    choosing which folders appear on start in the settings app

    Choose whatever folders you want to appear on the Start menu.

    选择要显示在“开始”菜单上的任何文件夹。

    choosing which folders appear on start in the settings app

    And here’s a side-by-side look at how those new folders look as icons and in the expanded view.

    这是这些新文件夹在图标和展开视图中的外观的并排视图。

    start menu with icons showing for folders
    start menu with names showing for folders

    使用全屏开始菜单 (Use a Full-Screen Start Menu)

    On the other hand, if you really like the tiles and miss the full-screen Start experience from Windows 8, you can have the Start menu always open full screen. Head to Settings > Personalization > Start. Turn on the “Use Start full screen” option.

    另一方面,如果您真的很喜欢磁贴并错过Windows 8的全屏启动体验,则可以使“开始”菜单始终打开全屏。 转到设置>个性化>开始。 打开“使用开始全屏显示”选项。

    select the use start full screen option in settings

    Now, whenever you open your Start menu, you will see it in all its full-screen glory.

    现在,只要打开“开始”菜单,便会在所有全屏显示中看到它。

    desktop showing full start screen

    从您的应用列表中删除建议的应用 (Remove Suggested Apps from Your App List)

    As you’ve used your Start menu, you’ve probably noticed the occasional suggestions for apps you might want to install appear in your app list.

    使用“开始”菜单时,您可能会注意到偶尔会出现一些有关您可能要安装的应用程序的建议,这些建议会出现在应用程序列表中。

    suggest apps list on start menu

    To get rid of those, all you have to do is head to Settings > Personalization > Start and turn off the “Occasionally show suggestions in Start” option.

    要消除这些问题,您要做的就是前往“设置”>“个性化”>“启动”,然后关闭“偶尔在“启动”中显示建议”选项。

    disable the occasionally show suggestions in start option

    Note that these suggested apps are different than the preinstalled apps and ads—like Candy Crush—that you also likely don’t want. To get rid of those, you’ll need to right-click each one and uninstall it. And while you’re at it, you might want to look at how to disable all of Windows 10’s built-in advertising.

    请注意,这些建议的应用程序与您可能不希望的预装应用程序和广告(如Candy Crush)不同。 要摆脱这些漏洞,您需要右键单击每个漏洞并将其卸载。 在使用它时,您可能想看看如何禁用Windows 10的所有内置广告



    And don’t forget: if you don’t like the Windows 10 Start menu at all, you can return to the glory days of Windows 7—and still keep much of the Windows 10 functionality—with a Start menu replacement like Start10 or ClassicShell.

    并且不要忘记:如果您根本不喜欢Windows 10的“开始”菜单,则可以返回Windows 7的辉煌岁月,并且仍然保留许多Windows 10功能,并可以通过替换Start10ClassicShell开始菜单。

    翻译自: https://www.howtogeek.com/197836/8-ways-to-customize-the-windows-10-start-menu/

    展开全文
  • Windows 右键菜单扩展

    千次阅读 2018-08-05 01:12:07
    右键菜单,指用户在对Windows Shell Object右键单击时,弹出的上下文菜单(Context Menu)。 如上图所示的对右键菜单进行扩展,属于Windows Shell Extension编程的一部分。 注:一般扩展程序的信息会注册到注册表...

     

    右键菜单,指用户在对Windows Shell Object右键单击时,弹出的上下文菜单(Context Menu)。

    如上图所示的对右键菜单进行扩展,属于Windows Shell Extension编程的一部分。

    注:一般扩展程序的信息会注册到注册表某个路径的ShellExt下。

    本文将介绍利用COM接口对Windows右键菜单进行扩展,笔者将分四个步骤对整个项目建立过程进行引导和解释,并会在文章末尾将给出项目代码(C++)链接。

    声明:本文在某些API的解释中,加入了笔者的个人理解,可能并不完全或存在理解错误,故在重要WinAPI的解释后面会加入MSDN的连接,方便读者直接查阅官方文档。一切解释请以官方文档为准!

    可能需要用到但并不是阅读本文必须的前置知识:COM、ATL、注册表。

     

    一. 新建一个ATL项目

    Visual Studio——新建项目——ATL——使用默认配置(一直按下一步即可)。

    注:默认配置中程序类型为动态链接库dll。

    注:如果生成的项目中多了一个以PS为后缀的子项目,可以选择将之移除。

     

    二. 为项目添加一个简单的ATL对象,继承并实现相应的IContextMenu、IShellExtInit的接口方法。

    右键项目——添加(Add)——类(Class)——弹出添加引导

    引导中双击选择ATL简单对象(ATL Simple Object),并根据需要填写类名字以及对应的信息,(某些信息VS将自动帮填写,但ProgID建议手动填写一下),点击完成生成一个ATL 简单对象,会发现项目中生成了刚才填写类名字的.h、.cpp、.rgs文件。

    打开.h文件,会发现刚才填写的C++类型的声明,请在继承语法的最后添加上

    public IContextMenu,public IShellExtInit

    添加COM类型映射:在宏BEGIN_COM_MAP与宏BEGIN_COM_END之间的列表下手动加上

    COM_INTERFACE_ENTRY(IContextMenu)
    
    COM_INTERFACE_ENTER(IShellExtInit)

    然后覆盖并实现IContextMenu接口(QueryInterface,GetCommandString、InvokeCommand)以及IShellExtInit接口(Initialize)

    系统对这些接口的调用顺序、时刻为:

    1. Initialize(用户右键点击某个Shell程序时)
    2. QueryContextMenu(1.返回S_OK或其他表示初始化成功的HRESULT时。插入自定义菜单的入口。)
    3. GetCommandString(用户光标盘旋(hover)在插入的菜单项时,系统status bar将显示的信息。Vista以后的系统不再有作用,不是实现的重点。)
    4. InvokeCommand(用户点击新插入的菜单项时,将会调用这个方法。用户点击菜单项回调的入口。)

    下面笔者来解析一下这些接口的作用,所有对本文较为有用的地方都以红色标注。

    ​HRESULT Initialize(
      PCIDLIST_ABSOLUTE pidlFolder,
      IDataObject       *pdtobj,
      HKEY              hkeyProgID
    );

    参数pdtobj,表示指向某个Shell Object的指针。可以通过这个指针获取用户右键单击的Shell Object信息。比如,可以获取该Shell Object的名称,并且判断其是不是我们需要处理的类型。特别地,对于右键单击桌面空白处或者是文件夹空白处,pdtobj为NULL

    注:只有当这个函数返回S_OK的时候,QueryContextMenu才会被调用。

    IShellExtInit::Initialize-MSDN

    HRESULT QueryContextMenu(
        HMENU hmenu,
        UINT indexMenu,
        UINT idCmdFirst,
        UINT idCmdLast,
        UINT uFlags
    );
    
    ​
    1. 参数hmenu,表示用户右键单击弹出的那个菜单的Handle。配合使用GetMenuItemCount、GetSubMenu、GetMenuString、InsertMenuItem等Win API可以将自定义的菜单插入到hemnu菜单树所包含的任意菜单中去。
    2. 参数indexMenu,表示你可以调用InsertMenu或者InsertMenuItem将你的菜单插入的起始位置。
    3. idCmdFirst,你可以用作作为你自定义菜单标识的最小值。
    4. idCmdLast,你可以用作作为你自定义菜单标识的最大值。
    5. uFlags,用于标识当前回调状态的标志位。一般只需要关注一个位标识:CMF_DEFAULTONLY.这个为表示用户只在右键双击Shell Object,这个时候不需要插入菜单,只需要简单返回MAKE_HRESULT(SEVERITY_SUCCESS, 0, 0)即可。
    6. 函数返回值,一般为MAKE_HRESULT(SEVERITY_SUCCESS, 0 ,你插入的菜单数量)

    注:通过WIN API插入菜单的时候,需要注意的几点:

    自定义菜单的id值必须在区间[idCmdFirst,idCmdLast]之间,这个id值同时也是当你的菜单项被用户点击的时候,回调时用于区分你自己的多个菜单项的一个标识值。

    插入菜单代码逻辑流应为(位于QueryContextMenu函数内):
     

    if(CMF_DEFAULTONLY & uFlags)
    {
        return MAKE_HRESULT(SEVERITY_SUCCESS, FACILITY_NULL, USHORT(0));
    }
    UINT uid = idCmdFirst;
    //当你插入菜单的时候,同时递增uid,同时保存uid值到对应菜单的映射。
    
    //递增uid时,也需要判断一下uid<=idCmdLast
    
    .....
    
    //插入菜单完毕
    return MAKE_HRESULT(SEVERITY_SUCCESS,0,uid-idCmdFirst);

    为hemu插入子菜单主要有两个WIN_API:InsertMenu以及InsertMenuItem。我们只关注更为常用的后者。

    BOOL InsertMenuItemA(
      HMENU            hmenu,
      UINT             item,
      BOOL             fByPosition,
      LPCMENUITEMINFOA lpmi
    );
    
    
    1. hemenu表示你的自定义菜单需要插入到的父菜单。
    2. Item表示位置或者菜单的Id
    3. fByPosition,True表示item为插入到菜单的位置,False表示item为插入菜单的id
    4. Lpmi,表示需要插入的子菜单的信息,见下文。
    typedef struct tagMENUITEMINFOW {
      UINT      cbSize;
      UINT      fMask;
      UINT      fType;
      UINT      fState;
      UINT      wID;
      HMENU     hSubMenu;
      HBITMAP   hbmpChecked;
      HBITMAP   hbmpUnchecked;
      ULONG_PTR dwItemData;
      LPWSTR    dwTypeData;
      UINT      cch;
      HBITMAP   hbmpItem;
    } MENUITEMINFOW, *LPMENUITEMINFOW;

     

    fMask 表示系统应该关注这个结构体的那些成员数据,我们可以用或位操作进行。比如我们让系统关注我们设置的fType\fState\wID,则需要设置fMask = MIIM_FTYPE | MIIM_ID|MIIM_STATE 。

    fType 表示我们将数据存到dwTypeData的数据类型。通常为MFT_STRING,并且将用于显示菜单名称的字符串赋值给dwTypeData

    wID 是最为重要的一个菜单标识。如前文所说,wID的赋值应为[idCmdFirst,idCmdLast]之间。

    并且这个值在InvokeCommand的回调当中用于确定自定义的哪个菜单被按下(见后文)

    为菜单插入图标:

    hbmpChecked\hbmpUnchecked:使用时必须在fMask中设置位MIIM_CHECKMASKS。

    hbmpItem :设置位MIIM_BITMAP。

    范例:

    在hmenu中插入一个名称叫做“Demo”的,图标显示为hbmpDemo的菜单项如下。

    ​
    MENUITEMINFO mii;
    ::memset(&mii, 0, sizeof(MENUITEMINFO));
    mii.cbSize = (UINT)sizeof(MENUITEMINFO);
    mii.fMask = MIIM_STRING|MIIM_ID|MIIM_FTYPE|MIIM_BITMAP;
    mii.fType = MFT_STRING;
    mii.dwTypeData = L”Demo”;
    mii.wID = id;//id 为[idCmdFirst,idCmdLast]之间某个值
    mii.hbmpItem = hbmpDemo;
    ::InsertMenuItem(hmenu, uiIndex, TRUE, (LPCMENUITEMINFO)&mii);
    
    ​

    IContextMenu::QueryContextMenu

    WIN_API InsertMenuItem 以及 MENUITEMINFO 结构体

    最后,响应菜单项被点击事件的入口在InvokeCommand函数

    HRESULT InvokeCommand( CMINVOKECOMMANDINFO *pici )
    {
        //利用pici的lpVerb判断对应哪个自定义菜单项被点击了
        WORD menuId = LOWORD(pici->lpVerb);
        //一般选择switch case的方法来进行判断
        switch(menuId)
        {
            ....//做某个菜单被点击的用户逻辑。   
        }
        //但也有直接用hash table or map将菜单id和回调绑定到一起,然后查询菜单所代表的业务逻辑的。
    }
    
    typedef struct _CMINVOKECOMMANDINFO {
        DWORD cbSize;
        DWORD fMask;
        HWND hwnd;
        LPCSTR lpVerb;
        LPCSTR lpParameters;
        LPCSTR lpDirectory;
        int nShow;
        DWORD dwHotKey;
        HANDLE hIcon; } CMINVOKECOMMANDINFO;

    InvokeCommand函数作为回调入口,重点关注lpVerb这个数据,这个数据的低位字(Low Word)表示被点击的菜单项的ID,这个ID和调用InsertMenuItem的时候,传入的MENUITEMINFO结构的wID相同

    通常,我们使用这个ID来区分自定义的菜单项。

    一旦确认某个菜单被点击了,就执行该菜单所代表的程序逻辑。

    IContextMenu::InvokeCommand

     

    三. 修改添加该类时自动生成的.rgs脚本文件

    .rgs文件是由ATL项目用于修改注册表的脚本文件。

    一般,在添加了一个简单的ATL对象类之后,会对应地生成一个.rgs脚本文件。并且,会自动生成如下信息(这些脚本主要作用是为你的类型自动注册COM组件)。

    HKCR
    {
    	DesktopContextMenuExtension.ShellExt.1 = s 'DesktopContextMenuExtension ShellExt Class'
    	{
    		CLSID = s '{721F6C56-9944-4E82-BCBB-977F7681D7AC}'
    	}
    	DesktopContextMenuExtension.ShellExt = s 'DesktopContextMenuExtension Class'
    	{		
    		CurVer = s 'DesktopContextMenuExtension.ShellExt.1'
    	} 
    	
    	NoRemove CLSID
    	{
    		ForceRemove {721F6C56-9944-4E82-BCBB-977F7681D7AC} = s 'DesktopContextMenuExtension Class'
    		{
    			ProgID = s 'DesktopContextMenuExtension.ShellExt.1'
    			VersionIndependentProgID = s 'DesktopContextMenuExtension.ShellExt'
    			ForceRemove Programmable
    			InprocServer32 = s '%MODULE%'
    			{
    				val ThreadingModel = s 'Apartment'
    			}
    			TypeLib = s '{AB96BF74-098F-4B26-916C-FA785E3C33B6}'
    			Version = s '1.0'
    		}
    	}
    }

    注:CLSID 

    简单来说,就是通过编写这个文件,将一切有关注册表的操作都交给该脚本语言的解析器去做,然后轻松粗暴解决频繁使用CKey类或者Win API对注册表进行读写步骤。

    注:使用CKey或者WINAPI也能达到目的,但对于编码来说难免会有些麻烦,必须在dll注册的函数体内注册表插入信息,然后在dll卸载的函数体内移除注册表中的信息,整个过程十分难受。该脚本的语法语义,请见 MSDN rgs脚本语法语义

     

    为了实现右键菜单的扩展,以桌面空白处以及文件夹空白处为例。

    需要在注册表中插入的位置以及信息为(HKCR == HKEY_CLASSES_ROOT):

    HKCR\\DesktopBackground\\shellex\\ContextMenuHandlers\\InsertedDemoName

    将InsertedDemoName的默认值改成你程序对应的CLSID

    还有两处需要插入的信息同上。位置为:

    HKCR\\Directory\\shellex\\ContextMenuHandlers

    HKCR\\Directory\\background\\shellex\\ContextMenuHandlers

    以DesktopBackground为例的.rgs脚本为:

    HKCR
    {
    	NoRemove DesktopBackground
    	{
    		NoRemove ShellEx
    		{
    			NoRemove ContextMenuHandlers
    			{
    				ForceRemove 'DesktopContextMenuExtension' = s '{721F6C56-9944-4E82-BCBB-977F7681D7AC}'
    			}
    		}
    	}
    }

    注:这里还可以对应不同类型文件右键菜单进行扩展,对应的扩展名下的HKCR\\扩展名\\shellex\\ContextMenuHandlers下插入信息同上。

    如在HKCR\\.pdf\\shellext\\ContextMenuHandlers插入,则当用户右键点击.pdf文件时,会调用到我们的Initialize -> QueryContextMenu...

    另外 文件夹:folder,快捷方式:.lnk,分区:drive等等

    三.5  有了IShellExtInit和IContextMenu接口,又有了修改注册表对应位置的.rgs脚本文件,现在终于可以来解析一下整个右键菜单扩展的调用流程了。

    当用户右键单击某个Shell对象的时候,此时Windows系统会自动在对应的注册表项中查找ShellExt\\ContextMenuHandlers下的所有键的列表。注:这便是为什么我们要往生成的.rgs文件添加我们修改注册表的脚本,将我们的类型的CLSID信息加入到XXXX\\ContextMenuHandlers当中去的原因

    此时系统会读取的列表当中的所有CLSID信息,并且在HKCR\\CLSID\\目录下找到对应名字就为这些CLSID的键项,里面会有我们注册的dll的位置信息。注:这是在我们添加一个ATL简单对象时,.rgs自动添加的那串脚本所做的事情。就是注册我们的COM组件。

    此时,系统将我们的dll加载到explorer进程的地址空间里边(载入过程只会进行一次),利用dll中的DllGetClassObject函数获取到了所有加载的dll中编写了继承了IShellExtInit和IContextMenu的类对象,(怎么判断类对象是否继承了IShellExtInit和IContextMenu?这就和COM相关了。DllGetClassObject中有一个参数为riid,就是为某些COM接口类的唯一一个标识,通过IUnkown中的QueryInterface就可以知道该实例对象是否继承了IShellExtInit和IContextMenu[1]),并调用Initialize,若该函数返回S_OK,就调用QueryContextMenu函数,我们往右键菜单插入自定义扩展菜单就是这样做的。

    注[1]:笔者在编写此文的时候,才刚刚开始阅读《COM本质论》了解COM的知识,此处可能会有错漏。

    后面当点击我们自定义的菜单的时候,explorer就会调用我们的InvokeCommand函数,此时我们的菜单被点击逻辑被执行。

    注:如果你尝试在被点击逻辑的代码中打开了模态窗口(例如MessageBox),那么对应的Explorer进程就会进入假死状态。阻塞代码同理。

     

    四.使用regsvr32注册该COM dll,并测试对应功能。

    右键项目属性,分别修改以下几项。

    编译项目,分别在不同平台测试。x64位dll对应64位系统,Win32对应32位系统。

    管理员方式运行cmd或powershell

    注册dll:regsvr32  “你的dll路径”

    卸载dll:regsvr32  /u  “你的dll路径”

    如果注册dll报“LoadLibrary(XXXX.dll)错误”,重点看上面红字红框,并且请尝试使用dll依赖工具查看依赖缺失。

    如果报“0x800200?”错误,请检查是否使用管理员身份运行cmd,若确定已使用来管理员权限,请检查.rgs文件脚本的语法是否出错(下面是我碰到过的小坑

    坑1:ForceRemove ‘MyProgram.Name.1’ =空格s空格 ’Demo’,注意检查空格。

    坑2:.rgs文件编码方式推荐选择无BOM的UTF-8编码

    目前已知问题:

    XP系统,插入到右键菜单“新建”二级菜单下,存在图标文字不齐问题。(Win7,Win10,无此问题)

    附上Demo源码。

    @Mapupcal    联系我 

     

    展开全文
  • Windows特定文件添加右键菜单(一)

    千次阅读 2018-03-27 16:40:55
    最近尤其项目需要想给文件添加一个右键菜单,当且仅当右键该文件的时候,右键菜单显示“XXXXTest” 原本以为添加一个右键菜单是一个很简单的事情,添加一个command命令即可,但是后来发现command有一定局限性,最终...

    最近尤其项目需要想给文件添加一个右键菜单,当且仅当右键该文件的时候,右键菜单显示“XXXXTest”

    原本以为添加一个右键菜单是一个很简单的事情,添加一个command命令即可,但是后来发现command有一定局限性,最终采用了shell handler方式

    添加右键菜单有两种方式:

     

    1. 静态添加,即添加shell+command实现
    2. 动态添加,即添加Shortcut menu handler实现

     

    • 静态添加

    一个command命令可以添加给某一个应用程序关联的文件类型a File Type ProgID 或者某一系统子项Windows Subkey

    应用程序注册的关联文件类型

     

    系统默认提供的SubKey

    上述添加右键菜单有一个局限性就是没有针对某一个特定文件添加右键菜单,通过上述方式添加的右键菜单都是一类型文件共有

    显然我们遇到的问题,微软肯定也收到多类似需求并提供了方法:win7之后的系统可以通过添加特定条件Advanced Query Syntax来满足这类需求

    因此我们可以给command添加子健AppliesTo限定我们右键添加的条件,如果一个文件名称中包含exampleText1,那么此右键功能是可以的

    通过这种方法有一定的局限性,第一限定性比较强,第二win7之前的系统并不支持例如XP

    静态添加右键菜单还有很多技巧,例如级联菜单、shift菜单、以及其他接口方法等,静态添加右键菜单简单方便易维护,具体的可以查看MSDN文档

     

    • 动态添加

     

    有静态方式就有动态方式,动态方式就是通过windows系统外壳接口实现动态添加右键菜单,静态方式简单方便,动态方式灵活复杂,menu handler 可以动态判断是否添加右键菜单,自定义复杂的右键响应功能

    实现menu handler之后,explorer加载的时候会调用我们实现的接口,动态添加右键功能以及响应右键功能

    menu handler其实是一个COM组件的dll,具体实现后面再讲,网上也有很多类似的资料

    实现menu handler主要实现两个接口IShellExtInit和IContextMenu

    STDMETHODIMP Initialize(LPCITEMIDLIST, LPDATAOBJECT, HKEY):初始化接口,可以获取右键目标,自定义是否需要添加右键功能,本例中通过此函数判断目标文件名,如果右键的是我们的对象则添加右键菜单,否则不添加

    STDMETHODIMP GetCommandString(UINT_PTR, UINT, UINT*, LPSTR, UINT):系统帮助信息接口,本例中不提供帮助信息直接返回

    STDMETHODIMP InvokeCommand(LPCMINVOKECOMMANDINFO):右键菜单响应接口,当点击右键菜单时执行,本例中我们直接调用第三方exe显示版本信息

    STDMETHODIMP QueryContextMenu(HMENU, UINT, UINT, UINT, UINT):右键菜单添加接口,本例中添加一个右键菜单

    接口具体用法和参数说明可以查阅MSDN

    参看文献:

    https://msdn.microsoft.com/zh-cn/library/windows/desktop/cc144169(v=vs.85).aspx

    https://docs.microsoft.com/zh-cn/windows/desktop/shell/context-menu-handlers

     

     

    展开全文
  • Windows 窗体添加菜单菜单

    千次阅读 2016-01-21 06:34:15
    Windows 窗体上的菜单是使用 MainMenu 对象创建的,该对象是一个 MenuItem 对象集合。可以在设计时向 Windows 窗体添加菜单,方法是添加MainMenu 组件然后使用菜单设计器向其追加菜单项。还可以用编程方法添加...

    Windows 窗体上的菜单是使用 MainMenu 对象创建的,该对象是一个 MenuItem 对象集合。可以在设计时向 Windows 窗体添加菜单,方法是添加MainMenu 组件然后使用菜单设计器向其追加菜单项。还可以用编程方法添加菜单,方法是向 Windows 窗体添加一个或多个 MainMenu 对象并向该集合中添加 MenuItem 对象。本主题中的过程说明如何使用菜单设计器或代码创建一个名为 File 的简单菜单。

    在设计时向 Windows 窗体添加菜单

    1. 在 Windows 窗体设计器中打开要将菜单添加到的窗体。
    2. 在“工具箱”中双击 MainMenu 组件。

      一个菜单被添加到窗体中(该窗体显示文本“请在此处输入”),同时 MainMenu 组件添加到了组件栏中。

    以编程方式向 Windows 窗体添加菜单

    1. 在代码编辑器中,创建一个新公共方法,其中包含将菜单添加到窗体的代码。有关打开代码编辑器的更多信息,请参见在设计器中显示 Windows 窗体
      ' Visual Basic
      Public Sub AddMenu()
      
      End Sub
      
      // C#
      public void AddMenu(){
      
      }
      
      // C++
      public:
         void AddMenu()
         {
      
         }
      
    2. 在该方法内添加类似于以下内容的代码,以创建 MainMenu 组件的实例:
      ' Visual Basic
         Dim mnuFileMenu as New MainMenu()
         Me.Menu = mnuFileMenu
      
      // C#
         MainMenu mnuFileMenu = new MainMenu();
         this.Menu = mnuFileMenu;
      
      // C++
         MainMenu *mnuFileMenu = new MainMenu();
         this->Menu = mnuFileMenu;
      

    将 MainMenu 组件添加到 Windows 窗体后,需要向其添加菜单项。菜单设计器可让您在设计时向菜单组件添加菜单项。菜单内容保存在一个集合内,所以可在运行时通过向此集合添加 MenuItem 对象来向菜单添加菜单项。

    在设计时向菜单添加菜单项

    1. 单击 Windows 窗体上的 MainMenu 组件。

      显示文本“请在此处输入”。

    2. 单击显示的文本,然后键入所需菜单项的名称以添加它。
    3. 若要添加另一个菜单项,请单击“菜单设计器”内的另一个“请在此处输入”区域。
      • 单击当前菜单项右侧的区域以添加子菜单。

        - 或 -

      • 单击当前菜单项下方的区域,以便将另一个项添加到同一菜单中。

    以编程方式向菜单添加菜单项

    1. 如果还没有 MainMenu 组件,则向公共方法内的 Windows 窗体添加一个 MainMenu 组件,并将一个 MainMenu 类的实例分配给该窗体的Menu 属性。有关集合的更多信息,请参见对象之间的关系
      ' Visual Basic
      Public Sub AddMenuAndItems()
         Dim mnuFileMenu as New MainMenu()
         Me.Menu = mnuFileMenu
      End Sub
      
      // C#
      public void AddMenuAndItems(){
         MainMenu mnuFileMenu = new MainMenu();
         this.Menu = mnuFileMenu;
      }
      
      // C++
      public:
         void AddMenu()
         {
            MainMenu *mnuFileMenu = new MainMenu();
            this->Menu = mnuFileMenu;
         }
      
    2. 在该方法内,创建要添加到 MainMenu 对象的集合中的 MenuItem 对象:
      ' Visual Basic
         Dim myMenuItemFile as New MenuItem("&File")
         Dim myMenuItemNew as New MenuItem("&New")
      
      // C#
         MenuItem myMenuItemFile = new MenuItem("&File");
         MenuItem myMenuItemNew = new MenuItem("&New");
      
      // C++
         MenuItem *myMenuItemFile = new MenuItem(S"&File");
         MenuItem *myMenuItemNew = new MenuItem(S"&New");
      
      注意   默认情况下, MainMenu 对象不包含菜单项,所以添加的第一个菜单项成为菜单标题。这就是  myMenuItemFile 的  Text属性设置为  &File 的原因。
    3. 在该方法内,分配顶级菜单项并向其添加后面的菜单项:
      ' Visual Basic
         mnuFileMenu.MenuItems.Add(myMenuItemFile)
         myMenuItemFile.MenuItems.Add(myMenuItemNew)
      
      // C#
         mnuFileMenu.MenuItems.Add(myMenuItemFile);
         myMenuItemFile.MenuItems.Add(myMenuItemNew);
      
      // C++
         mnuFileMenu->MenuItems->Add(myMenuItemFile);
         myMenuItemFile->MenuItems->Add(myMenuItemNew);
      
      注意   若要创建子菜单,可将  MenuItem 对象添加到父  MenuItem 的  MenuItems 属性中。对于上面的示例,如果希望将第三个菜单项 ( myMenuItemFolder) 作为第二个菜单项 ( myMenuItemNew) 的子菜单添加,则应包括下列代码行:
      ' Visual Basic
      Dim myMenuItemFolder as New MenuItem("&Folder")
      myMenuItemNew.MenuItems.Add(myMenuItemFolder)
      
      // C#
      MenuItem myMenuItemFolder = new MenuItem("&Folder");
      myMenuItemNew.MenuItems.Add(myMenuItemFolder);
      
      // C++
      MenuItem *myMenuItemFolder = new MenuItem(S"&Folder");
      myMenuItemNew->MenuItems->Add(myMenuItemFolder);
      

      菜单项也可在创建时动态添加,属性也是这样,可在创建和添加菜单项时设置。例如,若要向上面的集合中添加第四个菜单项,请输入下列代码:

      ' Visual Basic
      mnuFileMenu.MenuItems.Add("Save &As")
      
      // C#
      mnuFileMenu.MenuItems.Add("Save &As");
      
      // C++
      mnuFileMenu->MenuItems->Add("Save &As");
      

    有关向 MenuItems 集合中添加菜单项时动态创建菜单项的更多信息,请参见 Menu.MenuItemCollection 类

    向菜单项添加功能

    最后,建立菜单结构后,需要为菜单项提供功能。通常需要通过 MenuItem.Click 事件的事件处理程序做到这一点。有关事件处理程序的更多信息,请参见 Windows 窗体中事件处理程序的介绍

    展开全文
  • RightMenuMgr是一款非常方便的管理器Windows右键菜单的工具。 界面如下,百度可下。 扩展项名称对应列表 可在RightMenuMgr(下文成为管理器)软件中找到对应关系并设置。 右键菜单显示的名称 ...
  • Windows基础编程 -菜单

    千次阅读 2016-02-17 23:53:03
    前言windows窗口创建以后,往里头添加菜单就是一件很有意义的事了,菜单关联的东西有 -它本身是一种资源,有菜单句柄HMENU需要维护 -菜单点击会发出消息,需要知道怎么维护相关的消息处理函数 分类>窗口顶层菜单、弹...
  • 本笔记源自windows游戏编程大师技巧第二版3.2章,记...打开resource.h后系统帮我们创建了两个宏定义,其中IDR_MEUN1也就是位数的就是菜单编号,五位数的选项ID,之后会用到。 使用菜单 1.关联在window里:...
  • windows右键菜单大揭密

    千次阅读 2015-09-26 15:37:53
    Windows系统中,只要对着桌面或是文件(夹)单击右键,就会弹出一个快捷菜单,里面有对该文件(夹)的一些常用操作命令,通过右键菜单,可以方便用户对文件的某些操作。不知道你是否对它感兴趣?是否想对它作一番...
  • 凡是接触过windows系统的,我想对菜单都不会感到陌生,菜单Windows应用程序提供刚给一致用户界面的很重要的部分。(还记得窗口结构中的lpszMenuName项吗?) 想要在程序中使用菜单,我们首先需要定义菜单资源,...
  • C#Windows应用程序开发—>菜单

    千次阅读 2017-03-22 13:15:56
    在system.windows.Forms的名称空间中,所有与菜单相关的控件都是menu的子类,menu是一个实体,你不能直接将其实例化。  menu有个子类: ContextMenu MainMenu MenuItem C#Windows应用程序开发之添加...
  • windows通过LoadIcon LoadCursor等函数来加载资源 图标 鼠标指针 字符串 自定义资源 菜单 键盘加速键 对话框 位图 10.1 图标,鼠标指针,字符串和自定义资源 10.1.1 向程序添加图标 Tools->Options->Build->...
  • If your Taskbar, System Tray, or Start menu acts up, you might be ... Instead, you can usually just restart Windows Explorer—and Windows makes it pretty easy. 如果“任务栏”,“系统任务栏”或“...
  • Android_菜单介绍

    千次阅读 2016-09-16 21:46:47
    Android的菜单分为种类型:选项菜单(Option Menu)、上下文菜单(Context Menu)、子菜单(Sub Menu) 一.选项菜单 当用户单击设备上的菜单按钮(Menu),触发事件弹出的菜单就是选项菜单。选项菜单最多只有六个,...
  • Windows日志分析 一、Windows事件日志简介 1、Windows事件日志 ...Windows主要有以下三类日志记录系统事件:应用程序日志、系统日志和安全日志。 系统日志 Windows系统组件产生的事件,主要包括...
  • windows右键菜单开发--with vs2008(2005) or vc9(vc8) 前言:其实最近一直在看微软的刻录函数 imapi2,发现大量的接口函数,不过com没怎么接触过,上手比较困难。但是以前给自己的一个程序做过一个右键菜单,是...
  • 好久没有学windows编程了,今天计算机图形学作业用到了mfc,发现各种不适应。好了,不吐槽了,come on baby! 1. 首先新建当文档程序,并命名为Demo1,如图:一路next。。,注意点如图:2. 接下来添加菜单项操作过程...
  • 前言 写这篇笔记的原因,是前几天在虚拟机 Vmware 中重新安装了几个操作系统,突然...前两个虚拟机软件也是我使用比较多的,个人感觉 VirtualBox 轻巧(而且我觉得 VirtualBox 和 windows自带的Hyper-V 虚拟功能是很
  • Win11开始菜单恢复Win10样式的方法

    千次阅读 2021-07-08 10:44:22
    许多用户夹紧器都已经抢先体验升级了Windows11系统,但是对于一些用户来说,Windows11开始菜单的界面不是非常好用,想要将开始菜单改成Win10的样子。那么我们要怎么调整呢?下面小编就为大家具体讲解一下吧! Win11...
  • 装上 windows 8 发现 新开始菜单不习惯。  想调教下,本文不需要任何第方软件  找回开始菜单  任务栏鼠标右键,工具栏-〉新建一个工具栏,然后在文件夹 把下面地址扔进去 C:\ProgramData\...
  • Windows系统、Mac、桌面版Linux、Java Swing等,都有可视化菜单。一、Android平台3种菜单 选项菜单(OptionMenu)、上下文菜单(ContextMenu)、子菜单(SubMenu)。1.Option Menu 一般手机上都会提供Menu的按钮,对应的...
  • VC++ 外壳扩展编程之windows右键菜单

    千次阅读 2007-03-21 22:32:00
    http://www.programbbs.com/doc/show.asp?ID=473文档作者:李晓飞所属类别:VC++推荐指数:★★★☆文档人气:418本周人气:13发布日期:2006-12-13这次我想和大家一起讨论一下 Windows 的 Shell 扩展编程,首先在...
  • 1.什么是Windows API函数? Windows API是Windows 系统和应用程序间的标准接口,为应用程序提供Windows支持的函数定义、参数定义和消息格式等。 Visual C++提供两套完整的Windows程序开发系统: 直接使用Windows...
  • 通过菜单栏,或工具栏,或按钮,实现图片框中图像的显示和隐藏。 1. 更改窗体大小 由于添加的控件比较多,默认的窗体300*300肯定不够用的,需要将窗体大小调大。现更改为800*600。 打开TriPaint.cs[设计]文件,...
  • win32(5)--Windows菜单

    千次阅读 2017-06-10 11:51:49
    Windows程序的菜单,分为:系统菜单、弹出式菜单(右键菜单)、顶层菜单(下拉式菜单)。 系统菜单: 在windows程序左上角的图标点击鼠标左键、或者在标题栏点击鼠标右键,出现的就是系统菜单。主要...
  • swing 菜单+右键菜单+二级菜单实现

    千次阅读 2014-12-24 21:50:17
    闲话少说直接代码,这里主要用到JMenuBar JMenu,JMenuItem ,JPopupMenu(右键菜单),看文档(javax.swing下)就能轻松学会,界面写的有点乱,但是基本用到了这 import javax.swing.* ; import java.awt....
  • windows右键菜单中加入自己的程序

    千次阅读 2009-03-20 08:44:00
    修改右键菜单应该在...一般地说,只要是在windows系统中已注册过的扩展名,在HKEY_CLASSES_ROOT下均有“·该扩展名”子键 ,记录该扩展名的一些信息,对某种特定类型的文件的右键菜单的修改,便是在该键或“扩展名f
  • MacBook M1 Windows for ARM虚拟机体验

    千次阅读 2021-03-26 19:08:44
    前言 大家好,我是 刚进入春天还没来得及踏青又开始从早忙到晚的 蛮三刀。去年给大家带来了一篇比较详尽的MacBook M1评测。评测经历了全网的热情转载,成为...主要来感受一下MacBook M1芯片下使用Windows10虚拟机的体验
  • C# WPF侧边栏导航菜单(Dropdown Menu)

    千次阅读 2019-12-27 14:50:18
    时间如流水,只能流去不流回! 点赞再看,养成习惯,这是您给我创作的动力! 本文 Dotnet9 https://dotnet9.com 已收录,站长乐于分享dotnet相关技术,比如Winform、WPF、ASP... 阅读导航: ... 、代码实现 四...
  • 类WindowsXp 开始菜单[原创]

    千次阅读 热门讨论 2005-12-26 11:35:00
    类WindowsXp 开始菜单实现 作者:深圳远客 一、实现原理:用CWnd 和 CButton 来实现。 

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 128,462
精华内容 51,384
关键字:

windows的三类菜单