こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

Excel VBAでアプリのウィンドウ名取得

WindowsXP, Excel2007で、ExcelからIE8にキーコードを送りたいです。
ネットで拾った以下のコードにより、

Option Explicit

Public Declare Function FindWindow Lib "user32" Alias "FindWindowA" _
(ByVal lpClassName As Any, ByVal lpWindowName As Any) As Long
Public 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
Public Declare Function SetForegroundWindow Lib "user32" (ByVal hWnd As Long) As Long
Public Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)

Function activate_win(win_name As String) As Long
Dim hwindow As Long
hwindow = FindWindow(vbNullString, win_name)
If hwindow <> 0 Then SetForegroundWindow hwindow
activate_win = hwindow
End Function

Call activate_win("ウィンドウ名")
Sendkeys "ABC", True

のような形で、メモ帳での動作は確認したのですが、
IEだとウィンドウがアクティブになってくれません。

おそらくウィンドウタイトルを間違えているのだと思われますが、
全角半角などを変えてみたりしても、どう見比べてみても間違いがわかりません。
見た目ではわからない、似た文字だが違うということではないかと思っています。

そこで、開いているアプリのウィンドウ名すべてをメモ帳に書き出すような
(あるいは任意のアプリにペーストできるようにするような)コードはないでしょうか?

よろしくお願いします

投稿日時 - 2011-09-08 12:47:54

QNo.6997365

困ってます

質問者が選んだベストアンサー

hzd00430様

こんばんわ。IE限定なら、こんな感じでタイトルをゲットできますよ。
(ウィンド名 = タイトルという仮定の話ですが...)
外してたら、ゴメンナサイ。


Sub Test()
Dim objShell As Object, i As Variant, cnt As Integer

'シェルオブジェクトを作成
Set objShell = CreateObject("Shell.Application")

cnt = objShell.Windows.Count

'全ウィンドウをループ
For i = cnt - 1 To 0 Step -1

If TypeName(objShell.Windows((i)).document) = "HTMLDocument" Then
'タイトルを表示
MsgBox objShell.Windows((i)).document.Title
End If
Next i

End Sub

投稿日時 - 2011-09-08 20:18:16

お礼

ありがとうございます。タイトルの文字列が得られました。
その文字列を使ってCall activate_winをしたところ、
無事IEをアクティブにすることができました。

ただ、ウィンドウ名としては、タイトルに続くアプリケーション名(- Windows Internet Explorerの部分)が得られないのですね。
今後の参考まで、可能でしたらウィンドウ名そのものを得る方法があれば知りたいです。

投稿日時 - 2011-09-09 08:57:04

このQ&Aは役に立ちましたか?

0人が「このQ&Aが役に立った」と投票しています

回答(2)

ANo.2

こんばんわ。

>ただ、ウィンドウ名としては、タイトルに続くアプリケーション名(- Windows Internet Explorerの部分)が得られないのですね。
>今後の参考まで、可能でしたらウィンドウ名そのものを得る方法があれば知りたいです。


色々チャレンジしてみたのですが、私の能力ではできませんでした orz...

ちなみに objShell.Windows((i)).FullName とすると、そのウィンドウを起動しているソフトのEXEファイルのフルパスが得られます。
例えばIEだと「C:\Program Files\Internet Explorer\iexplore.exe」が返ってきます(Win7の場合です)
アプリケーション名であれば、これを使うのも一案かなぁと思います。

あと蛇足ですが、当方IE9なのですが「- Windows Internet Explorer」が表示されなくなりましたね。(私のPC環境だけかな?)

投稿日時 - 2011-09-09 20:12:21

お礼

わざわざお手数をおかけして申し訳ありません。

何しろ win_activate に渡す引数を得るのが目的なものですから、ウィンドウ名そのものを得たいなぁと思ってまして。
ですから、実行ファイル名が得られてもちょっと使えません(^^;;

> 「- Windows Internet Explorer」が表示されなくなりましたね。

そうなんですか?ウィンドウ名が「(開いているファイル等)- (アプリケーション名)」という形式なのはWindowsのシェル全体の話だと思ってました(Officeソフトやメモ帳や、大抵のアプリはそういう形式だったので)。でもそうなってないアプリもありますね。

投稿日時 - 2011-09-12 12:52:23

あなたにオススメの質問