原来在网上看到了,一个叫EnableButton的程序,可以让当前运行程序中所有的按钮,由失效变成有效,
分析了一个,一定是用API作的,注意,程序是已编译过的,没有源代码的!
我现在想做一个类似的程序,按当前程序中所有菜单由失效变成有效,如VB中菜单的Enabled改成True一样,我已找了资料做了可以打开菜单的API EnableMenuItem,ModifyMenu,这时界面上显示是有效的,
但我点了相应的按钮后,并没有执行对应的功能,这是为什么?
也就是说我做的功能是把菜单从失效变成有效了,但点了菜单以后,并没有执行菜单的功能?

解决方案 »

  1.   

    你是说使得外部其他exe程序的吧
      

  2.   

    就是外部EXE的,我自己做的程序试了,菜单执行时并没有判断的!界面上是好的,用了API后点一下就不起作用了!
      

  3.   

    to AprilSong(X):
     -------------------------
    |可能只是有禁用的菜单     |
    |并没有程序代码           |
    |比如一些演示版的软件     |
    |                         |
    |或者就是程序里有其他判断 |
     -------------------------
    =============================
    非也,你理解错误!搞个低版本的“连连看”看,能够达到不玩初级就直接进入中级或高级的话,问题就解决了。我也遇到同样的问题没有解决。帮你顶!
      

  4.   

    大家帮我呀,哪个EanbleButton就可以把当前窗口的把有按钮都打开有效的,
    我想做一个EanbleMenu之类的,但表面好了,还是不能用的!
      

  5.   

    相关连接:如何用API实现 “菜单a.enable = true”同样的功能
    http://community.csdn.net/Expert/topic/3198/3198711.xml?temp=4.327029E-02
      

  6.   

    跟踪后,发现VB和API的方法都用了EnableMenuItem但,传入Hwnd不对!
      

  7.   

    to :qffhq(我心依旧) 
    =====================
    你自己用VB写个包含菜单的程序,跟踪一下 菜单.Enabled=True、 菜单.Enabled=False的操作,看有没有发现。
      

  8.   

    VB中的Eanble=Ture,发现了一个SetProp的函数,我正在看这个,用GetProp取窗口属性时不知道参数lpString应试是哪个对应对Enable呀,
      

  9.   

    gz一下,怎么用C语言写Win32程序的时候,只要一句EnableMenuItem就可以了,我不记得要什么其他函数啊?你能不能把你的代码段贴出来?
      

  10.   

    我的意思是
    程序可能是有其他的操作来防止你用代码点击
    比如这样的代码
    你可以改掉mnu2.Enabled
    然后也可以点mnu2
    但控制变量CanEnter2没有Enable的时候是没有用的Option ExplicitPrivate CanEnter2 As BooleanPrivate Sub Form_Load()
        CanEnter2 = False
        
        mnu2.Enabled = False
    End SubPrivate Sub mnu1_Click()
        Me.Caption = "1"
        CanEnter2 = True
    End SubPrivate Sub mnu2_Click()
        If CanEnter2 Then Me.Caption = "2"
    End Sub
      

  11.   

    支持我心依旧!
    AprilSong(X)思路有误。
      

  12.   

    帮忙呀,难道就搞不定了呀,大家一起讨论呀!
    好像是是VB的Enable后面另有其它东西,不只是用了EnableMenuItem,还要把MenuID对应的Envents绑定到这个MenuID上,这样,系统收到MenuID的消息后就可以触发对应的事件了!如何绑定?
      

  13.   

    按照我的理解,解决方法是找到菜单的句柄,发送wm_enable消息并带上相应的参数。
      

  14.   

    让按钮有效和让菜单有效在原理上可能一样,但实际做起来却极可能完全不同,菜单可能要麻烦很多我已找了资料做了可以打开菜单的API EnableMenuItem,ModifyMenu,这时界面上显示是有效的,
    但我点了相应的按钮后,并没有执行对应的功能,这是为什么?
    ======================
    你大概是使用mf_enabled参数吧,但注意:
    MF_BITMAP 菜单条目是一幅位图。一旦设入菜单,这幅位图就绝对不能删除。所以不应该使用由vb的image属性返回的值 
    MF_BYCOMMAND 菜单条目由菜单的命令ID指定 
    MF_BYPOSITION 菜单条目由条目在菜单中的位置决定。零代表菜单中的第一个条目 
    MF_CHECKED 检查指定的菜单条目。不能与vb的checked属性兼容 
    MF_DISABLED 禁止指定的菜单条目。不与vb的enabled属性兼容 
    MF_ENABLED 允许指定的菜单条目。不与vb的enabled属性兼容 
    MF_GRAYED 禁止指定的菜单条目,并用浅灰色描述它。不与vb的enabled属性兼容 
    MF_MENUBARBREAK 在弹出式菜单中,将指定的条目放置于一个新列,并用一条垂直线分隔不同的列 
    MF_MENUBREAK 在弹出式菜单中,将指定的条目放置于一个新列。在顶级菜单中,将条目放置到一个新行 
    MF_OWNERDRAW 创建一个物主绘图菜单(由您设计的程序负责描绘每个菜单条目) 
    MF_POPUP 将一个弹出式菜单置于指定的条目。可用于创建子菜单及弹出式菜单 
    MF_SEPARATOR 在指定的条目处显示一条分隔线 
    MF_STRING 在指定的条目处放置一个字串。不与vb的caption属性兼容 
    MF_UNCHECKED 检查指定的条目。不能与vb的checked属性兼容 
    其中的“不与vb的enabled属性兼容”可能就是问题的关键了还没有找到解决方法。
      

  15.   

    再AplleVB上找了段代码:点击Command1时,打开记事本,并执行菜单项[打开]的功能。虽然没有解决搂主的问题,但也有一定的参考价值。
    Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As Any, ByVal lpWindowName As String) As Long
    Private Declare Function GetMenuItemID Lib "user32" (ByVal hMenu As Long, ByVal nPos As Long) As Long
    Private Declare Function GetMenu Lib "user32" (ByVal hwnd As Long) As Long
    Private Declare Function GetSubMenu Lib "user32" (ByVal hMenu As Long, ByVal nPos As Long) As Long
    Private Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
    Const WM_COMMAND = &H111Private Sub Command1_Click()
        Dim hwnd As Long
        Dim hMainMenu As Long
        Dim hMenu As Long
        Dim MenuID As Long
        
        Shell "notepad.EXE"
        hwnd = FindWindow(0&, "未定标题 - 记事本")
        Debug.Print hhwnd
        If hwnd = 0 Then Exit Sub
        
        hMainMenu = GetMenu(hwnd)
        hMenu = GetSubMenu(hMainMenu, 0)
        MenuID = GetMenuItemID(hMenu, 1)
        AppActivate "未定标题 - 记事本"
        X& = SendMessage(hwnd, WM_COMMAND, MenuID, 0&)
    End Sub
      

  16.   

    看来像是双重标准问题,我以前就感觉VB菜单控件有点特殊:
    在IDE下设计时让菜单无效,会立即生效,结果连想通过点击菜单,给其Click事件加代码都不行。很不方便,一直认为是VB的一个BUG。推测VB为每个菜单单独维护一个状态表,API修改状态只是决定是否给VB发消息,而VB自己的状态表则决定是否处理这些消息。API的修改,VB却不会知道,矛盾由此产生。