No.4ベストアンサー
- 回答日時:
ウィンドウハンドルの取得については割愛します。
Option Explicit
Private Declare Function GetMenu Lib "user32" (ByVal hWnd As Long) As Long
Private Declare Function GetMenuItemCount Lib "user32" (ByVal hMenu As Long) As Long
Private Declare Function GetMenuItemInfo Lib "user32" Alias "GetMenuItemInfoA" (ByVal hMenu As Long, ByVal un As Long, ByVal b As Long, lpMenuItemInfo As MENUITEMINFO) As Long
Private Declare Function PostMessage Lib "user32" Alias "PostMessageA" (ByVal hWnd As Long, ByVal wMsg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
Private Const WM_COMMAND = &H111
Private Type MENUITEMINFO
cbSize As Long
fMask As Long
fType As Long
fState As Long
wID As Long
hSubMenu As Long
hbmpChecked As Long
hbmpUnchecked As Long
dwItemData As Long
dwTypeData As String
cch As Long
End Type
' hWndに指定したウィンドウのメニュークリックをエミュレート
' Menusには、メニューを辿る順序を文字列配列で定義
' ファイル -> 印刷 であれば Menus() = {"ファイル", "印刷"}
Private Sub EmulateMenuClick(ByVal hWnd As Long, Menus() As String)
Dim hMenu As Long, lngID As Long, intMenuIndex As Integer
hMenu = GetMenu(hWnd)
' メニュー階層をたどる
For intMenuIndex = 0 To UBound(Menus)
If ContainMenu(hMenu, Menus(intMenuIndex), lngID) = False Then
Call MsgBox("一致するメニューはありません。")
Exit Sub
End If
Next
' 最終的に見つかったメニューのIDをWM_COMMANDでPostMessage
Call PostMessage(hWnd, WM_COMMAND, lngID, 0&)
End Sub
' hMenuのメニューハンドル内でTextの文字列と一致するメニューがあるかどうかを返す
' 見つかればTrue。このとき、hMenuにはサブメニューのハンドル、IDにはメニューのIDが返される
' 見つからなければFalse
Private Function ContainMenu(hMenu As Long, ByVal Text As String, ID As Long) As Boolean
Dim lngCount As Long, lngPos As Long
Dim typMenuItem As MENUITEMINFO
lngCount = GetMenuItemCount(hMenu)
' メニューの個数でループ
For lngPos = 0 To lngCount - 1
typMenuItem.fMask = &H3F&
typMenuItem.dwTypeData = vbNullChar
typMenuItem.cch = 0
typMenuItem.cbSize = Len(typMenuItem)
Call GetMenuItemInfo(hMenu, lngPos, 1, typMenuItem)
typMenuItem.dwTypeData = String(typMenuItem.cch, " ")
typMenuItem.cch = typMenuItem.cch + 1
typMenuItem.cbSize = Len(typMenuItem)
Call GetMenuItemInfo(hMenu, lngPos, 1, typMenuItem)
Debug.Print typMenuItem.dwTypeData
' メニューの文字列を比較(比較方法はどちらでも)
'If typMenuItem.dwTypeData = Text Then
If typMenuItem.dwTypeData Like Text Then
' 一致したらIDとサブメニューハンドルを返す
ID = typMenuItem.wID
hMenu = typMenuItem.hSubMenu
ContainMenu = True
Exit Function
End If
Next
ContainMenu = False
End Function
EmulateMenuClickにウィンドウハンドルと実行したいメニューを辿る文字列配列を渡してください。
画像は、このコードを利用してAPIビューアのバージョン情報をForm1から実行して表示させたものです。
連絡が大変遅くなりましてもうしわけございません。
上記サンプルのおかげでやりたい事が出来るようになりました。
大変ありがとうございます。
No.3
- 回答日時:
ショートカットが定義されていないんですか、windowsの基本が
なってないような・・・。
それはさておき、他の方がGetMenu等のやり方を書かれているので違う方法を。
マウスカーソルを操作して、実際の動作をプログラムで実行させるのは
どうでしょうか。これならショートカットが無くてもマウスをメニューの
ところに移動させて、クリック動作、その後サブメニューの上にマウスを
移動させてクリック。。。って感じにすればいけると思います。
Wizard_Zeroさんのより力技っぽいかも(w
No.2
- 回答日時:
Menu処理関係のAPIとPostMessageを使って試してみました。
まず、対象アプリケーションのウィンドウハンドルを取得します。
次に、
GetMenuやGetSubMenuでメニューハンドルを取得
GetMenuItemCountでサブメニューの項目数を取得
GetMenuItemInfoでメニュー情報を取得
この3つを組み合わせて目的のメニューを探し出してメニューIDを取得。
対象のウィンドウに、WM_COMMANDと探し出したメニューのIDをPostMessage。
メモ帳で試してみたところ一応動作しました。かなり強引な方法ですが。。。
ご回答ありがとうございます。
いろいろ調べてみて
GetMenuやGetSubMenuでメニューハンドルを取得
GetMenuItemCountでサブメニューの項目数を取得
まではできました。
それ以降が出来ず困っております。
出来ればサンプルのプログラムでご教示頂けないでしょうか。
大変申し訳ございませんがよろしくお願い致します。
No.1
- 回答日時:
出来ますよ。
以前同じようなソフトをやっつけで作った事がありますので。
ただ、かなり昔なので記憶が薄れていますが。。。
メニューの操作をする場合、そのソフトウェアに対して
ショートカットを送って実行させてたかな?
ctrl+ほげ、少し時間を開けて次のctrl+ほげほげって
感じで操作しました。そのときは他のソフトウェアが
動いていると困りますので、それは運用でなんとかするようにしてください(汗
ご連絡ありがとうございます。
残念ならが制御したい側のアプリケーションにショートカットが設定されおらず、ショートカットでの制御はできません。
他にいい方法があればご教示お願い致します。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
このQ&Aを見た人はこんなQ&Aも見ています
-
【大喜利】【投稿~11/1】 存在しそうで存在しないモノマネ芸人の名前を教えてください
【お題】 ・存在しそうで存在しないモノマネ芸人の名前を教えてください
-
これ何て呼びますか
あなたのお住いの地域で、これ、何て呼びますか?
-
「これはヤバかったな」という遅刻エピソード
寝坊だったり、不測の事態だったり、いずれにしても遅刻の思い出はいつ思い出しても冷や汗をかいてしまいますよね。
-
自分のセンスや笑いの好みに影響を受けた作品を教えて
子どもの頃に読んだ漫画などが その後の笑いの好みや自分自身のユーモアのセンスに影響することがあると思いますが、 「この作品に影響受けてるな~!」というものがあれば教えてください。
-
ハマっている「お菓子」を教えて!
この世には、おいしいお菓子がありすぎて……。 次何を食べたらいいか迷っています。 みなさんが今、ハマっている「お菓子」を教えてください!
-
他のウィンドウのボタンを自動的に押したい
C言語・C++・C#
-
Excel VBA で外部アプリケーションのコンテキストメニューを操作したい
その他(プログラミング・Web制作)
-
他のアプリケーションとの連携
Visual Basic(VBA)
-
-
4
親ウインドウにあるOKボタンを押す方法
Visual Basic(VBA)
-
5
Alt+P,Alt+NをPostmessageで送るには
Visual Basic(VBA)
-
6
VBAで、なぜかSendkeyが効きません。
PowerPoint(パワーポイント)
-
7
EXCEL VBAから他アプリケーションを操作することは可能ですか?
Visual Basic(VBA)
-
8
【VBA】UI Automationコンボボックスを制御したい
Visual Basic(VBA)
-
9
他アプリのアクティブな子ウインドウを取得するには?
C言語・C++・C#
-
10
ExcelVBAでAPIを使って外部ウインドウのエディットテキストを取得する方法
Visual Basic(VBA)
-
11
特定のセルがアクティブになったときのイベント?
Excel(エクセル)
-
12
vbaから他のアプリを終了
Visual Basic(VBA)
-
13
EnumChildWindowsの使い方(VBA)
Visual Basic(VBA)
-
14
VBA初心者です。ExcelのVBAで他のアプリケーションを操作している際、操作先のアプリケーション
Visual Basic(VBA)
-
15
今更、VBAでRPA、キーボード操作自動化ってどうやるの?
Visual Basic(VBA)
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・一回も披露したことのない豆知識
- ・これ何て呼びますか
- ・チョコミントアイス
- ・初めて自分の家と他人の家が違う、と意識した時
- ・「これはヤバかったな」という遅刻エピソード
- ・これ何て呼びますか Part2
- ・許せない心理テスト
- ・この人頭いいなと思ったエピソード
- ・牛、豚、鶏、どれか一つ食べられなくなるとしたら?
- ・あなたの習慣について教えてください!!
- ・ハマっている「お菓子」を教えて!
- ・高校三年生の合唱祭で何を歌いましたか?
- ・【大喜利】【投稿~11/1】 存在しそうで存在しないモノマネ芸人の名前を教えてください
- ・好きなおでんの具材ドラフト会議しましょう
- ・餃子を食べるとき、何をつけますか?
- ・あなたの「必」の書き順を教えてください
- ・ギリギリ行けるお一人様のライン
- ・10代と話して驚いたこと
- ・家の中でのこだわりスペースはどこですか?
- ・つい集めてしまうものはなんですか?
- ・自分のセンスや笑いの好みに影響を受けた作品を教えて
- ・【お題】引っかけ問題(締め切り10月27日(日)23時)
- ・大人になっても苦手な食べ物、ありますか?
- ・14歳の自分に衝撃の事実を告げてください
- ・架空の映画のネタバレレビュー
- ・「お昼の放送」の思い出
- ・昨日見た夢を教えて下さい
- ・ちょっと先の未来クイズ第4問
- ・【大喜利】【投稿~10/21(月)】買ったばかりの自転車を分解してひと言
- ・メモのコツを教えてください!
- ・CDの保有枚数を教えてください
- ・ホテルを選ぶとき、これだけは譲れない条件TOP3は?
- ・家・車以外で、人生で一番奮発した買い物
- ・人生最悪の忘れ物
- ・【コナン30周年】嘘でしょ!?と思った○○周年を教えて【ハルヒ20周年】
- ・10秒目をつむったら…
- ・人生のプチ美学を教えてください!!
- ・あなたの習慣について教えてください!!
- ・都道府県穴埋めゲーム
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
エクセルで作った新しいウイン...
-
「アイテムは収集されました」...
-
検索の画面がでなくなってしま...
-
ExcelのBOOKが消えた!
-
ゲームでは結局どっちが良いの?
-
勝手にウィンドウが開いて止ま...
-
名前を付けて保存のウィンドウ...
-
自作関数内でウインドウハンド...
-
EXCEL2016で新しいウィンドウを...
-
他アプリの操作(メニューバー)
-
VBA .Value=.Value ?
-
ExcelVBAでAPIを使って外部ウイ...
-
Alt+P,Alt+NをPostmessageで送...
-
MFC ダイアログ上のID取得につ...
-
C#でファイル転送プログラムWin...
-
(ショートカットキー)Alt+...
-
VBでアプリケーションを自動操...
-
アウトルックの既読、未読の設...
-
エクセルでフレーム仕様?
-
[VBA] UserForm を Excel の W...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
エクセルで作った新しいウイン...
-
「アイテムは収集されました」...
-
検索の画面がでなくなってしま...
-
ゲームでは結局どっちが良いの?
-
ExcelのBOOKが消えた!
-
VBA .Value=.Value ?
-
[VBA] UserForm を Excel の W...
-
ラジオボタンの初期指定
-
勝手にウィンドウが開いて止ま...
-
Excelの上下を固定したい
-
【VB2008】 マウス操作の一時的...
-
「&HFFFF」「&H1A」とは?
-
作成したウインドウのサイズを...
-
親ウインドウにあるOKボタンを...
-
他のアプリケーションの終了処理
-
MFC ダイアログ上のID取得につ...
-
ExcelVBAでAPIを使って外部ウイ...
-
EnumChildWindowsの使い方(VBA)
-
Alt+P,Alt+NをPostmessageで送...
-
Vba LongPtrについて教えてくだ...
おすすめ情報