您现在的位置: 无忧电子商务网 >> 信息学院 >> 程序开发 >> asp.net >> 正文

C#+Windows API操纵系统菜单

作者:佚名    信息学院来源:整理    点击数:    更新时间:2008-1-30 我要参与讨论

 

  一、前言

  本文针对C#.NET中没有提供直接的类似SystemMenu的属性或类似GetSystemMenu的成员函数的情况,通过调用Windows API设计了一个C#类SystemMenu,从而实现了传统的对于系统菜单的操作。

  二、系统菜单简介

  当你单击窗口图标或右击窗口标题栏时系统菜单即弹出。它包含当前窗口的默认行为。不同窗口的系统菜单看起来有些不同,如一个正常窗口的系统菜单看起来与一个工具栏子对话框窗口的菜单就不一样。

  修改系统菜单的好处:

  ·添加应用程序自己定义的菜单项。

  ·在WW被最小化时,SS是一个很好的地方来放置动作,可以被存取,因为SS可以显示,通过在任务栏窗口图标上单击右键。

  ·使某菜单项失去能力,如从系统菜单中移去“最大化”,“最小化”“关闭”等。由于这种改动还影响到窗口右上角的三个按钮,所以这是一个使窗口右上角“X”失去能力的不错的办法。

  操纵系统菜单

  通过调用 API函数GetSystemMenu,你就检索到了系统菜单的一个拷贝。该函数的第二个参数指明是否你要复位系统菜单到它的缺省状态。再加上另外几个API菜单函数如AppendMenu, InsertMenu等,你就能实现对于系统菜单的灵活控制。

  下面我仅简单介绍如何添加菜单项以及如何实现新项与用户的交互。

  三、SystemMenu 类介绍

  SystemMenu类的实现使得整个系统菜单存取变得非常容易。你可以使用这个类来修改一个窗口的菜单。 通过调用静态成员函数FromForm你得到一个对象,该函数要求一个Form对象或一个从Form继承的类作为它的参数。然后它创建一个新的对象,当然如果GetSystemMenu API调用失败的话,将引发一个NoSystemMenuException例外。

  注意,每一个Windows API菜单函数要求一个菜单句柄以利于操作。因为菜单句柄实际上是一个C++指针,所以在.NET中你要使用IntPtr来操作它。许多函数还需要一个位掩码标志来指明新菜单项的动作或形式。幸运的是,你不必象在VC++中那样,通过某个头文件的包含来使用一系列的位掩码标志定义,.NET中已经提供了一个现成的公共枚举类ItemFlags。下面对这个类的几个重要成员作一说明:

  ·mfString―― 告诉子系统将显示由菜单项中的“Item”参数传递的字符串。

  ·mfSeparator――此时 "ID" 与 "Item" 参数被忽略。

  ·MfBarBreak―― 当用于菜单条时,其功能与mfBreak一样;当用于下拉菜单,子菜单或快捷菜单时,新的一列与旧有的一列由一线垂直线所隔开。

  ·MfBreak――把当前项目放在一个新行(菜单条)或新的一列(下拉菜单,子菜单或快捷菜单)。

  注意:如果指定多个标志,应该用位操作运算符|(或)连接。例如:

//将创建一个菜单项 "Test" ,且该项被选中(checked)

mySystemMenu.AppendMenu(myID, "Test", ItemFlags.mfString |ItemFlags.mfChecked);

在google里搜索更多C#+Windows API操纵系统菜单

Google
Web www.51ec.org
【字体: 】【发表评论】【加入收藏】【告诉好友】【打印此文】【关闭窗口
我来说两句 对此文章发表了评论
  昵 称: *必填    ·注册用户·
  评 分: 1分 2分 3分 4分 5分     严禁发表危害国家安全、政治、黄色淫秽等内容的评论,用户需对自己在使用本网站服务过程中的行为承担法律责任。本站管理员有权保留或删除评论内容,评论内容只代表机友个人观点,与本网站立场无关。  
评 论
内 容

 
评论列表 (最新 评论仅限网友观点!)

供求信息




| 设为首页 | 加入收藏 | 关于我们 | 广告服务 | 联系方式 | 友情链接 | 版权申明