0

マウスがフォームの特定の領域にあるかどうかを検出するようにタイマーを設定しました。これは、50,50(ピクセル)で始まり1000,500で終わる長方形であると想像できます。マウスがその長方形の内側にある場合、マウスの周りに続いて、ツールチップのように機能する2番目のウィンドウがポップアップします。問題は、上部のメニューがこの長方形の上にドレープすることです。メニューを使用しようとすると、メニューを下に移動するとすぐに2番目のウィンドウがポップアップします(タイマーはその表示プロパティをtrueに設定します)。メニューを閉じる(フォーカスが失われたか何かが原因だと思います)。

メニューの1つが開いていることを検出できれば、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

SBEIHIyad-シリア-ダマスカスによって書かれました。2021年4月1日。

VB6.0を使用すると、次のことが可能になります。すべてのメニューウィンドウが開いているかどうかを確認します。つまり、メニューが開いています。メインメニューのhWndにAPI"GetMenu"を使用し、次にAPI "GetMenuState"を使用して、メニューの1つが開いているかどうかを確認します。

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 に答える