メニューの矩形サイズを取得 <TOP>
指定したメニューの矩形サイズを取得し、そのメニューのクリックをシミュレートします。
GetMenu メニューのハンドルを取得
GetMenuItemRect 指定したメニューの矩形サイズを取得
GetSubMenu ポップアップメニューのハンドルを取得
mouse_event マウスイベントの生成
GetMessageExtraInfo 現在のスレッドに関するメッセージの拡張情報を取得
GetSystemMetrics システムメトリックの値とシステムの現在の構成を取得
例では、「実行」ボタンをクリックすることにより、「SubMenu2」クリックをシミュレートしています。
'================================================================ '= メニューの矩形サイズを取得
'= (GetMenuItemRect.bas) '================================================================ #include "Windows.bi" Type POINTAPI x As Long y As Long End Type Type RECT Left As Long Top As Long Right As Long Bottom As Long End Type ' メニューのハンドルを取得 Declare Function Api_GetMenu& Lib "user32" Alias "GetMenu" (ByVal hWnd&) ' 指定のメニューの矩形サイズを取得 Declare Function Api_GetMenuItemRect& Lib "user32" Alias "GetMenuItemRect" (ByVal hWnd&, ByVal hMenu&, ByVal uItem&, lprcItem As RECT) ' ポップアップメニューのハンドルを取得 Declare Function Api_GetSubMenu& Lib "user32" Alias "GetSubMenu" (ByVal hMenu&, ByVal nPos&) ' マウスイベントの生成 Declare Sub Api_mouse_event Lib "user32" Alias "mouse_event" (ByVal dwFlags&, ByVal dx&, ByVal dy&, ByVal cButtons&, ByVal dwExtraInfo&) ' 現在のスレッドに関するメッセージの拡張情報を取得 Declare Function Api_GetMessageExtraInfo& Lib "user32" Alias "GetMessageExtraInfo" () ' さまざまなシステムメトリックの値とシステムの現在の構成を取得 Declare Function Api_GetSystemMetrics& Lib "user32" Alias "GetSystemMetrics" (ByVal nIndex&) #define MOUSEEVENTF_ABSOLUTE &H8000 '絶対座標(スクリーン座標Left=0・Top=0・Right=35535・Bottom=65535) #define MOUSEEVENTF_LEFTDOWN &H2 'マウス左ボタンDOWN #define MOUSEEVENTF_LEFTUP &H4 'マウス左ボタンUP #define MOUSEEVENTF_MIDDLEDOWN &H20 'マウス中ボタンDOWN #define MOUSEEVENTF_MIDDLEUP &H40 'マウス中ボタンUP #define MOUSEEVENTF_MOVE &H1 'マウス移動 #define MOUSEEVENTF_RIGHTDOWN &H8 'マウス右ボタンDOWN #define MOUSEEVENTF_RIGHTUP &H10 'マウス右ボタンUP #define SM_CXSCREEN 0 'ディスプレイの幅 #define SM_CYSCREEN 1 'ディスプレイ高さ #define vbCrLf (Chr$(13) & Chr$(10)) 'キャリッジリターンとラインフィード(\r\n) Var Shared Flg As Integer '================================================================ '= '================================================================ Declare Sub ScreenToAbsolute(pa As POINTAPI) Sub ScreenToAbsolute(pa As POINTAPI) pa.x = pa.x * (&HFFFF / Api_GetSystemMetrics(SM_CXSCREEN)) pa.y = pa.y * (&HFFFF / Api_GetSystemMetrics(SM_CYSCREEN)) End Sub '================================================================ '= マウスクリックシミュレート '================================================================ Declare Sub MouseClick(pa As POINTAPI) Sub MouseClick(pa As POINTAPI) Api_mouse_event MOUSEEVENTF_ABSOLUTE Or MOUSEEVENTF_MOVE, pa.x, pa.y, 0, Api_GetMessageExtraInfo() 'Mouse Down Api_mouse_event MOUSEEVENTF_LEFTDOWN, 0, 0, 0, Api_GetMessageExtraInfo() 'Mouse Up Api_mouse_event MOUSEEVENTF_LEFTUP, 0, 0, 0, Api_GetMessageExtraInfo() End Sub '================================================================ '= '================================================================ Declare Sub ClickMenuItem(ByVal mWnd As Long, ByVal hMenu As Long, ByVal hPos As Long) Sub ClickMenuItem(ByVal mWnd As Long, ByVal hMenu As Long, ByVal hPos As Long) Var rct As RECT Var pa As POINTAPI Var Ret As Long Ret = Api_GetMenuItemRect(mWnd, hMenu, hPos, rct) If Ret = 0 Then Exit Sub pa.x = (rct.Left + rct.Right) / 2 pa.y = (rct.Top + rct.Bottom) / 2 ScreenToAbsolute pa MouseClick pa Flg = 0 End Sub '================================================================ '= '================================================================ Declare Sub Button1_on edecl () Sub Button1_on Var mWnd As Long Var hMenu As Long Var hSubMenu As Long mWnd = GethWnd hMenu = Api_GetMenu(mWnd) 'メニューのハンドルを取得 ClickMenuItem mWnd, hMenu, 0 'Menu1をクリック hSubMenu = Api_GetSubMenu(hMenu, 0) 'サブメニューのハンドルを取得 ClickMenuItem mWnd, hSubMenu, 1 'SubMenu2をクリック Flg = 1 End Sub '================================================================ '= '================================================================ Declare Sub SubMenu2_on edecl () Sub SubMenu2_on() Var txt As String If Flg = 1 Then txt = "「Button」によりSubMenu2の" & vbCrLf & "Clickがシミュレートされました!" Else txt = "SubMenu2が直接クリックされました!" End If A% = MessageBox(GetWindowText, txt, 0, 2) Flg = 0 End Sub '================================================================ '= '================================================================ Declare Sub MainForm_Start edecl () Sub MainForm_Start() Var mWnd As Long Var pa As POINTAPI Var hMenu As Long Var hSubMenu As Long mWnd = GethWnd hMenu = Api_GetMenu(mWnd) 'メニューのハンドルを取得 ClickMenuItem mWnd, hMenu, 0 ' hSubMenu = Api_GetSubMenu(hMenu, 0) 'サブメニューのハンドルを取得 ClickMenuItem mWnd, hSubMenu, 1 'サブメニューの1番目 pa.x = &HFFFF / 2 pa.y = &HFFFF / 2 MouseClick pa End Sub '================================================================ '= '================================================================ While 1 WaitEvent Wend Stop End