如何判断菜单是否在VB6中打开?

如何判断菜单是否在VB6中打开?,vb6,menu,tooltip,Vb6,Menu,Tooltip,我已经设置了一个计时器来检测鼠标是否在我窗体的某个区域上,你可以想象它是一个从50,50(像素)开始到1000500结束的矩形。如果鼠标位于该矩形内,则会弹出第二个窗口,其作用类似于工具提示,跟随鼠标四处移动。问题是,顶部的菜单覆盖在这个矩形上,如果您尝试使用菜单,那么当您向下移动菜单时,就会弹出第二个窗口(计时器将其visible属性设置为true),最后关闭菜单(我猜是因为失去焦点或其他原因) 如果我能检测到其中一个菜单何时打开,我可以用If语句禁用工具提示窗口的显示,但我不知道怎么做。我想

我已经设置了一个计时器来检测鼠标是否在我窗体的某个区域上,你可以想象它是一个从50,50(像素)开始到1000500结束的矩形。如果鼠标位于该矩形内,则会弹出第二个窗口,其作用类似于工具提示,跟随鼠标四处移动。问题是,顶部的菜单覆盖在这个矩形上,如果您尝试使用菜单,那么当您向下移动菜单时,就会弹出第二个窗口(计时器将其visible属性设置为true),最后关闭菜单(我猜是因为失去焦点或其他原因)


如果我能检测到其中一个菜单何时打开,我可以用
If
语句禁用工具提示窗口的显示,但我不知道怎么做。

我想我已经通过搜索WIN32API.txt中的“menu”和一点谷歌搜索找到了这个方法,但我不是很确定。也许这个解决方案只适用于我的机器

把这个代码

Dim hMenu As Long
hMenu = GetMenu(Form1.hwnd)
MsgBox GetMenuState(hMenu, 0, MF_BYPOSITION)
在间隔为5000的计时器上,您可以查看菜单的状态。在关闭状态下,数字看起来是随机的(15521296等),但当菜单打开时,它会从该基值偏移128。关闭时状态为1552的菜单打开时状态为1680

我不确定为什么它会被128抵消,或者它是否在所有机器上都有效(为了安全起见,我将对它进行编程以检查不平等性,而不是被128抵消),但它似乎对我有效


如果这个解决方案有问题,或者有更好的方法,请用另一个答案回答,我很乐意为您的答案打分。

由SBEIH Iyad-叙利亚-大马士革撰写。2021年4月1日

使用VB6.0,我们可以。 我们检查所有菜单窗口,如果其中一个窗口打开,则表示:菜单已打开。 我们使用API“GetMenu”作为主菜单的hWnd, 然后使用API“GetMenuState”检查其中一个菜单是否打开

Vb6.0代码:

Private Function GetBit_I(ByVal X As Long, ByVal i As Integer) As Integer
' Get the bit number i of X.
  GetBit_I = (X And (2 ^ i)) / (2 ^ i)
End Function

Private Function MainMenuIsOpened(FRM As Form) As Boolean
Const MF_BYPOSITION = 1024
Dim H As Long, i As Integer, L As Long, MCount As Long
  MainMenuIsOpened = False
  On Error GoTo MainMenuIsOpenedError
  H = GetMenu(FRM.HWnd)
  MCount = GetMenuItemCount(H)
  ' MCount is the number of main-menus.
  Do While (i < MCount)
     L = GetMenuState(H, i, MF_BYPOSITION)
     If ((L > -1) And (GetBit_I(L, 7) = 1)) Then
        MainMenuIsOpened = True
        Exit Do
     End If
     i = i + 1
  Loop
  Exit Function
MainMenuIsOpenedError:
  MainMenuIsOpened = False
End Function
私有函数GetBit_I(ByVal X为长,ByVal I为整数)为整数
'获取X的位号i。
GetBit_I=(X和(2^I))/(2^I)
端函数
私有函数MainMenuIsOpened(FRM作为形式)作为布尔值
常量MF_BYPOSITION=1024
Dim H等于长,i等于整数,L等于长,MCount等于长
MainMenusOpen=False
转到MainMenuiOpenedError时出错
H=获取菜单(FRM.HWnd)
MCount=GetMenuItemCount(小时)
'MCount是主菜单的数量。
边做边算(i-1)和(GetBit_I(L,7)=1)),那么
MainMenusOpen=True
退出Do
如果结束
i=i+1
环
退出功能
MainMenusOpenedError:
MainMenusOpen=False
端函数

祝你好运。

状态是一个位字段。要了解这一点,请在计算器中将数字转换为二进制,然后研究位掩码。@Deanna Queen of all things VB6,你知道这个问题的答案吗@迪安娜漠视;我们找到了答案。严重的用户错误情况:s