快捷搜索:

用C#和本地Windows API操纵体系菜单

  一、前言

  .NET框架是Windows应用领域中一个十分 新的技能 ,可以肯定在未来的一段时间内,.NET应用有必要 与现存的Windows技能 交互作用。这种交互作用主要体现在两个领域:COM和应用编程接口(API)。为此,.NET框架在Windows API之上提供了一个OO层,但是 有时分 可能需要使用一个.NET不可抵达 的API调用。在这种状况 下,能够使 用.NET平台调用(P/Invoke)机制从.NET中调用C或C++函数。因为Windows API函数在DLL中,所以,P/Invoke为从.NET代码调用DLL中的C或C++函数提供了一种通用机制。

  本文针对C#.NET中没有提供直接的类似SystemMenu的属性或类似GetSystemMenu的成员函数的实践 ,编写了一个C#类SystemMenu,从而完成 了传统的关于 体系 菜单的操作,这是通过调用本地Windows API来完成的。

  二、体系 菜单简介

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

  修正 体系 菜单的利益 :

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

  ·在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);
 

  “Item”参数指定了新项中要显示的文本,其ID有必要 是仅有 的数字――用来标志该菜单项。

  留意 :确保新项的ID大于0小于0XF000。因为大于等于0XF000的规模 为体系 命令所保留使用。你也能够 调用类SystemMenu的静态方法VerifyItemID来核验是否你的ID正确。

  另外,还有两个需要解释的常量:mfByCommand和mfByPosition。

  第一,在缺省状况 下,使用mfByCommand。第二,“Pos”的解释依赖于这些标志:假如 你指定mfByCommand,“Pos”参数就是在新项目刺进 前项用意ID;假如 你指定mfByPosition,“Pos”参数就是以0索引为最初 的新项的相对方位 ;假如 是-1并且指定mfByPosition,该项目将被刺进 到终究 。这也正是为什么AppendMenu()可认为 InsertMenu()所取代的原因。

1

作者:朱先中职责 修正 :方舟)

天极新媒体 最酷科技资讯

扫码赢大奖

评论

* 网友说话 均非本站情绪 ,本站不在评论栏引荐 任何网店、经销商,谨防上当上当 !

您可能还会对下面的文章感兴趣: