0

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

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

4

2 回答 2

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),但它似乎对我有用。

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

于 2012-07-04T06:53:01.533 回答
0

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

使用VB6.0,我们可以。我们检查所有的菜单窗口,如果一个被打开,这意味着:菜单被打开。我们对主菜单的 hWnd 使用 API“GetMenu”,然后使用 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

祝你好运。

于 2021-01-04T13:54:39.230 回答