C#+WindowsAPI操纵系统菜单

C#+WindowsAPI操纵系统菜单,第1张

C#+WindowsAPI操纵系统菜单,第2张

一.导言

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

二。系统菜单介绍

当你点击窗口图标或者右击窗口的标题栏时,会弹出系统菜单。它包含当前窗口的默认行为。不同窗口的系统菜单看起来不一样。例如,普通窗口的系统菜单看起来不同于工具栏子对话窗口的菜单。

修改系统菜单的好处:

添加由应用程序本身定义的菜单项。

当WW最小化时,SS是放置动作的好地方,并且可以被访问,因为右击任务栏窗口图标可以显示SS。

禁用一个菜单项,如从系统菜单中删除“华”、“最小化”、“关闭”。由于这一改变也会影响到窗口右上角的三个按钮,所以禁用窗口右上角的“X”是一个很好的方法。

操纵系统菜单

通过调用API函数GetSystemMenu,可以检索系统菜单的副本。该函数的第二个参数表示您是否希望将系统菜单重置为默认状态。加上其他几个API菜单函数,比如AppendMenu,InsertMenu等。,可以实现对系统菜单的灵活控制。

我只简单介绍一下如何添加菜单项,如何实现新项与用户的交互。

三。SystemMenu类介绍

menu类的实现使得访问整个系统菜单变得非常容易。你可以使用这个类来修改窗口的菜单。通过从Form调用静态成员函数来获取对象,这需要Form对象或从Form继承的类作为其参数。然后它创建一个新的对象。当然,如果GetSystemMenu API调用失败,会抛出NoSystemMenuException异常。

请注意,每个Windows API菜单功能都需要一个菜单句柄来方便操作。因为菜单句柄实际上是一个C++指针,所以你必须使用IntPtr来操作它。网。许多函数还需要一个位掩码标志来指示新菜单项的动作或形式。幸运的是,您不必像在VC++中那样通过包含头文件来使用一系列位掩码标志定义。中提供了现成的公共枚举类ItemFlags。网。以下是该类的一些重要成员:

MF String-告诉子系统将显示菜单项中“Item”参数传递的字符串。

MF separator-此时将忽略“ID”和“Item”参数。

MFBarbreak-用于菜单栏时,其功能与mfBreak相同;用于下拉菜单、子菜单或快捷菜单时,新列与旧列之间用一条垂直线隔开。

MfBreak――将当前项目放在新行(菜单栏)或新列(下拉菜单、子菜单或快捷菜单)中。

注意:如果指定了多个标志,它们应该由按位运算符| (or)连接。例如:

//将创建并检查菜单项“Test”。

mySystemMenu。AppendMenu(myID," Test ",item flags . MF string | item flags . MF checked);

“Item”参数指定要在新项目中显示的文本,其ID必须是一个数字——用于标记菜单项。

注意:确保新项目的ID大于0且小于0XF000。因为大于或等于0XF000的范围是为系统命令保留的。还可以调用SystemMenu类的静态方法VerifyItemID来检查ID是否正确。

此外,还有两个常量需要说明:mfByCommand和mfByPosition。

首先,默认情况下,使用mfByCommand。其次,“Pos”的解释取决于这些标志:如果指定mfByCommand,“Pos”参数是在新项中插入前一项的ID;如果指定mfByPosition,“Pos”参数是新项从0索引开始的相对位置;如果为-1并且指定了mfByPosition,则该项将被插入到末尾。这就是为什么AppendMenu()可以用InsertMenu()代替。

位律师回复
DABAN RP主题是一个优秀的主题,极致后台体验,无插件,集成会员系统
白度搜_经验知识百科全书 » C#+WindowsAPI操纵系统菜单

0条评论

发表评论

提供最优质的资源集合

立即查看 了解详情