高难问题:A软件如何才能知道B软件的一级菜单项"搜索(S)"下面的二级菜单项"结束(E)"是处于可用还是不可用?
请教! 问题点数:50、回复次数:6Top
1 楼cxbkkk(本命年,旺啊!)回复于 2005-05-18 10:56:00 得分 5
可以用一个模块,其中定义存放状态的,如果你要对多个菜单的话这个是个笨办法,不过只针对这一个还可以,呵呵。
只针对这个E菜单还可以,让b程序向某个文件发送0或者1,如果不可用就发送0,可用就发1,A程序需要知道E可用不可用的时候来读取,如果为0则不可用,1为可用。Top
2 楼rainivy(天涯远不远?-----不远。人已在天涯,天涯又怎么会远?)回复于 2005-05-18 11:35:15 得分 30
首先你要得到B软件的句柄,然后:
Option Explicit
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 GetMenuState Lib "user32" (ByVal hMenu As Long, ByVal wID As Long, ByVal wFlags As Long) As Long
Private Const MF_BYPOSITION = &H400&
Private Const MF_DISABLED = &H2&
Private Const MF_GRAYED = &H1&
Private Const MF_BYCOMMAND = &H0&
Private Sub Command1_Click()
Dim hMenu As Long
Dim hSubMenu1 As Long
Dim MenuState As Long
hMenu = GetMenu(B软件的句柄)
hSubMenu1 = GetSubMenu(hMenu, "搜索(S)"菜单的位置)
MenuState = GetMenuState(hSubMenu1, "结束(E)"菜单的位置, MF_BYPOSITION)
If (MenuState And MF_DISABLED = MF_DISABLED) Or (MenuState And MF_GRAYED = MF_GRAYED) Then
MsgBox ""结束(E)"菜单禁能"
Else
MsgBox ""结束(E)"菜单使能"
End If
End Sub
以上程序在VB6.0 + Window2000 Pro版上通过Top
3 楼imur05()回复于 2005-05-18 12:21:22 得分 0
谢谢楼上二位大侠的指点!
To cxbkkk(Cxbkkk)大侠:B软件是别人开发的,没有办法去让它发信息,我只能想怎么用A软件去做。请问能不能帮我想想?谢谢先!
To rainivy(Rain) 大侠:您的办法很好,只是有几个问题不明白:
(1)hMenu = GetMenu(B软件的句柄)----------“B软件的句柄”怎么得到?我是在A软件用shell打开B软件的,只是知道B软件的PID,至于它的句柄怎么得到?是不是B软件的主窗口的句柄?
(2)hSubMenu1 = GetSubMenu(hMenu, "搜索(S)"菜单的位置)-------"搜索(S)"菜单的位置:这个怎么才能得到?请教!!!
MenuState = GetMenuState(hSubMenu1, "结束(E)"菜单的位置, MF_BYPOSITION)----"结束(E)"菜单的位置:这个怎么才能得到?请教!!!
也请各位进来的达人指点一下!!!
Top
4 楼rainivy(天涯远不远?-----不远。人已在天涯,天涯又怎么会远?)回复于 2005-05-18 13:13:38 得分 0
(1):hMenu = GetMenu(B软件的句柄)----------“B软件的句柄”怎么得到?我是在A软件用shell打开B软件的,只是知道B软件的PID,至于它的句柄怎么得到?是不是B软件的主窗口的句柄?
>>是你要得到B软件菜单的父窗口,一般就是主窗口,你可以用FindWindow得到
(2):hSubMenu1 = GetSubMenu(hMenu, "搜索(S)"菜单的位置)-------"搜索(S)"菜单的位置:这个怎么才能得到?请教!!!
>>一般来讲,位置是从0开始计数,比如你窗体有两个菜单“文件”“编辑”,此时“文件”的位置就是0,“编辑”的位置就是1
(3):MenuState = GetMenuState(hSubMenu1, "结束(E)"菜单的位置, MF_BYPOSITION)----"结束(E)"菜单的位置:这个怎么才能得到?请教!!!
>>同(2)的答案。Top
5 楼DooDu(杜霖:I want,I can(开关拉))回复于 2005-05-18 13:36:52 得分 15
Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long
Private Sub Command1_Click()
Dim lngFrmHwnd As Long
lngFrmHwnd = FindWindow(vbNullString, "Form1") '找到窗口标题为Form1的窗口
Debug.print lngFrmHwnd
End SubTop
6 楼imur05()回复于 2005-06-18 00:06:04 得分 0
到现在才研习完上面二位大侠的代码,唉!真是笨!
再一次感谢!!!
结贴!Top




