原来在网上看到了,一个叫EnableButton的程序,可以让当前运行程序中所有的按钮,由失效变成有效,
分析了一个,一定是用API作的,注意,程序是已编译过的,没有源代码的!
我现在想做一个类似的程序,按当前程序中所有菜单由失效变成有效,如VB中菜单的Enabled改成True一样,我已找了资料做了可以打开菜单的API EnableMenuItem,ModifyMenu,这时界面上显示是有效的,
但我点了相应的按钮后,并没有执行对应的功能,这是为什么?
也就是说我做的功能是把菜单从失效变成有效了,但点了菜单以后,并没有执行菜单的功能?
分析了一个,一定是用API作的,注意,程序是已编译过的,没有源代码的!
我现在想做一个类似的程序,按当前程序中所有菜单由失效变成有效,如VB中菜单的Enabled改成True一样,我已找了资料做了可以打开菜单的API EnableMenuItem,ModifyMenu,这时界面上显示是有效的,
但我点了相应的按钮后,并没有执行对应的功能,这是为什么?
也就是说我做的功能是把菜单从失效变成有效了,但点了菜单以后,并没有执行菜单的功能?
-------------------------
|可能只是有禁用的菜单 |
|并没有程序代码 |
|比如一些演示版的软件 |
| |
|或者就是程序里有其他判断 |
-------------------------
=============================
非也,你理解错误!搞个低版本的“连连看”看,能够达到不玩初级就直接进入中级或高级的话,问题就解决了。我也遇到同样的问题没有解决。帮你顶!
我想做一个EanbleMenu之类的,但表面好了,还是不能用的!
http://community.csdn.net/Expert/topic/3198/3198711.xml?temp=4.327029E-02
=====================
你自己用VB写个包含菜单的程序,跟踪一下 菜单.Enabled=True、 菜单.Enabled=False的操作,看有没有发现。
程序可能是有其他的操作来防止你用代码点击
比如这样的代码
你可以改掉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
AprilSong(X)思路有误。
好像是是VB的Enable后面另有其它东西,不只是用了EnableMenuItem,还要把MenuID对应的Envents绑定到这个MenuID上,这样,系统收到MenuID的消息后就可以触发对应的事件了!如何绑定?
但我点了相应的按钮后,并没有执行对应的功能,这是为什么?
======================
你大概是使用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属性兼容”可能就是问题的关键了还没有找到解决方法。
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
在IDE下设计时让菜单无效,会立即生效,结果连想通过点击菜单,给其Click事件加代码都不行。很不方便,一直认为是VB的一个BUG。推测VB为每个菜单单独维护一个状态表,API修改状态只是决定是否给VB发消息,而VB自己的状态表则决定是否处理这些消息。API的修改,VB却不会知道,矛盾由此产生。