我在系统菜单里添加了一个自定义菜单,但我要使用Checked属性(就是单击一下就在菜单前打个钩,再单击一下就取消钩),我知道普通的菜单有Checked这个属性,请问如何获取和设置系统菜单的这个属性呢。

解决方案 »

  1.   

    menuname是你的菜单名称,如果是数组有索引的,可以:
    MsgBox menuname(1).Checked
      

  2.   

    获取系统菜单的句柄后,用API函数中的 GetItemInfo 获得。
      

  3.   

    这个我也想到了,但我不知道用MENUITEMINFO结构中的哪个属性
    Public Type MENUITEMINFO
      cbSize As Long
      fMask As Long
      fType As Long
      fState As Long '会不会是这个呢,如果是的话又是怎么判断呢?不知道是不是Public Const MF_UNCHECKED = &H0&  Public Const MF_CHECKED = &H8&这两个?
      wID As Long
      hSubMenu As Long
      hbmpChecked As Long '我刚开始用的是这个,但好像不对啊
      hbmpUnchecked As Long
      dwItemData As Long
      dwTypeData As String
      cch As Long
    End Type能不能给个具体的代码啊?
      

  4.   

    Public Const MF_UNCHECKED = &H0&
    Public Const MF_CHECKED = &H8&就是上面这两个。
    看fState,具体的可以查MSDN,我现在用的别人的机器,给代码不太方便。  :(如果能等到十一我回家上网,我肯定给你代码。  :)
      

  5.   

    自己终于完成了,虽然是个笨办法,但总比没有好啊。
    以下是我程序中的一段代码,相信一看就能懂的(其它的如:添加菜单项到系统菜单、API的声明等略)。
    Public Function WindowProc(ByVal hwnd As Long, ByVal iMsg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
    Select Case iMsg '选择传递进来的消息
          Case WM_SYSCOMMAND '单击控制框
            Select Case wParam '选择单击了哪个菜单
              Case IDM_ALWAYSONTOP '“总在最前”菜单
                Dim lhSysMenu As Long '存放系统菜单的句柄
                Static blnAlwaysOnTop As Boolean '保存“总在最前”的状态的变量
                lhSysMenu = GetSystemMenu(frmMusic.hwnd, 0&) '获取系统菜单句柄
                blnAlwaysOnTop = Not blnAlwaysOnTop '改变“总在最前”变量的状态
                Call AlwaysOnTop(frmMusic.hwnd, blnAlwaysOnTop) '设置或取消窗口总在最前
                If blnAlwaysOnTop = True Then 
                  '设置“总在最前”菜单的复选标记
                  Call ModifyMenu(lhSysMenu, 1, MF_CHECKED Or MF_BYPOSITION Or MF_STRING, IDM_ALWAYSONTOP, "总在最前(&T)")
                Else
                  '取消“总在最前”菜单的复选标记
                  Call ModifyMenu(lhSysMenu, 1, MF_UNCHECKED Or MF_BYPOSITION Or MF_STRING, IDM_ALWAYSONTOP, "总在最前(&T)")
                End If
                Exit Function
              Case IDM_REFRESH '“刷新”菜单
                Call frmMusic.RefreshData '刷新数据内容
                Exit Function
              End Select
        End Select
        WindowProc = CallWindowProc(ProcOld, hwnd, iMsg, wParam, lParam)
    End Function
      

  6.   

    不是的啦,菜单项是在程序启动时就加进去的,但在需要改变checked时就重画这个菜单项而已,
    后来又找到一种更好的方法:
    Public Declare Function CheckMenuItem Lib "user32.dll" (ByVal hMenu As Long, ByVal wIDCheckItem As Long, ByVal wCheck As Long) As Long
      

  7.   

    Public Declare Function CheckMenuItem Lib "user32.dll" (ByVal hMenu As Long, ByVal wIDCheckItem As Long, ByVal wCheck As Long) As Long这个函数我倒是还真没想起来,呵呵。   :)