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

时间:2012-07-04 03:27:59

标签: vb6 menu tooltip

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

如果我可以检测其中一个菜单是否打开,我可以使用if语句禁用工具提示窗口的显示,但我不知道该怎么做。

2 个答案:

答案 0 :(得分:0)

我想我已经想出了如何通过搜索WIN32API.txt搜索“菜单”和一点谷歌搜索,但我不太确定。也许这个解决方案只适用于我的机器。

输入此代码......

Dim hMenu As Long
hMenu = GetMenu(Form1.hwnd)
MsgBox GetMenuState(hMenu, 0, MF_BYPOSITION)

在间隔为5000的计时器上,您可以查看菜单的状态。在关闭状态下,数字似乎是随机的(1552,1296等),但是当菜单打开时,它从该基值偏移128。关闭时状态为1552的菜单在打开时为1680.

我不确定为什么它被128偏移或者如果它适用于所有机器(为了安全起见,我会对其进行编程以检查不等式,而不是偏移128),但它似乎对我有效。

如果此解决方案存在问题或者有更好的方法,请回复另一个答案,我很乐意为您提供答案。

答案 1 :(得分:0)

由 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

祝你好运。