我设置了一个计时器来检测鼠标是否在我的表单上的某个区域上,您可以想象它是一个从 50,50(像素)开始到 1000,500 结束的矩形。如果鼠标在该矩形内,则会弹出第二个窗口,其作用有点像工具提示,跟随鼠标。问题是顶部的菜单覆盖在这个矩形上,如果您尝试使用菜单,一旦您向下移动菜单,就会弹出第二个窗口(计时器将其可见属性设置为 true),最终关闭菜单(我猜是由于失去焦点或其他原因。)
如果我可以检测到其中一个菜单何时打开,我可以使用if
语句禁用工具提示窗口的显示,但我不知道该怎么做。
我想我已经通过在 WIN32API.txt 中搜索“菜单”和一些谷歌搜索找到了如何做到这一点,但我不太确定。也许这个解决方案只适用于我的机器。
把这段代码...
Dim hMenu As Long
hMenu = GetMenu(Form1.hwnd)
MsgBox GetMenuState(hMenu, 0, MF_BYPOSITION)
在间隔为 5000 的计时器上,您可以查看菜单的状态。在关闭状态下,数字看起来是随机的(1552、1296 等),但当菜单打开时,它会从该基值偏移 128。关闭时状态为 1552 的菜单打开时为 1680。
我不确定为什么它会偏移 128 或者这是否适用于所有机器(为了安全起见,我将对其进行编程以检查不平等,而不是偏移 128),但它似乎对我有用。
如果此解决方案有问题或有更好的方法,请回复另一个答案,我很乐意为您提供答案。
由 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
祝你好运。