これまでで一番「情けなかったとき」はいつですか?

エクセルVBAで、ユーザーフォームのリストボックスに
現在起動中のアプリやソフト(最小化されてみえないものや、エクセルのウィンドウに隠れてみないもの)の
一覧を表示させ、リストボックス上で選択した際に
その選択したアプリ、ソフトを前面に表示させたいです。

起動中のタスクを調べるコードなどはネット上に上がっていましたが
それだとバックグラウンドで動いているものなども
読み取ってしまい求めている動作になりません。

立ち上がっているが、最小化、ウィンドウ裏に隠れているものを
前面に、といのが行いたいことです。

どなたかご存知の方がいらっしゃれば宜しくお願いします。

A 回答 (3件)

If InStr(strClassName, "Window") = 0 Then


これはちょっと厳しいようですね アプリやソフトの対象が広いですし
strClassName使っちゃAPIなのでダメ見たい・・

FindWindow IsWindowVisible GetNextWindow GetClassName

Const GW_HWNDLAST = 1
Const GW_HWNDNEXT = 2
Dim hWnd As Long
Sub main()
Dim strCaption As String * 500
Dim strClassName As String * 128
hWnd = FindWindow(vbNullString, vbNullString)
Dim arrWnd(), strCap As String
Dim n As Long
Do
If IsWindowVisible(hWnd) Then
GetClassName hWnd, strClassName, Len(strClassName)
If Not Left(strClassName, InStr(strClassName, vbNullChar) - 1) Like "*Window" Then
GetWindowText hWnd, strCaption, Len(strCaption)
strCap = Left(strCaption, InStr(strCaption, vbNullChar) - 1)
If strCap <> "" Then
ReDim Preserve arrWnd(1, n)
arrWnd(0, n) = strCap
arrWnd(1, n) = hWnd
n = n + 1
End If
End If
End If
hWnd = GetNextWindow(hWnd, GW_HWNDNEXT)
Loop Until hWnd = GetNextWindow(hWnd, GW_HWNDLAST)

Range("A1").Resize(UBound(arrWnd, 2) + 1, UBound(arrWnd, 1) + 1).Value _
= Application.Transpose(arrWnd)

End Sub
    • good
    • 1
この回答へのお礼

教えて頂いたコードでやりたいことができました。
ありがとうございます。
またひとつ勉強になりました。

お礼日時:2022/12/29 08:36

#1 If IsWindowVisible(hwnd) Then だとダメなのですね


想像するに・・ GetClassName を使って ClassName を取得し
Windowクラスを排除するのはどうでしょう


Dim strClassName As String * 128
hWnd = FindWindow(vbNullString, vbNullString)


Do
If IsWindowVisible(hWnd) Then
GetClassName hWnd, strClassName, Len(strClassName)
If InStr(strClassName, "Window") = 0 Then
GetWindowText hWnd, strCaption, Len(strCaption)
cap = Left(strCaption, InStr(strCaption, vbNullChar) - 1)

こんなのでどうでしょう・・・

後のSetForegroundWindowでの処理を考えると
WindowText(strCaption)に対応するhWndが必要と思われますので
Collectionでなく2次元配列の方が都合が良さそうですね
    • good
    • 0

こんにちは


>それだとバックグラウンドで動いているものなども

やり方は色々ありそうですが
>一覧を表示
なのでキャプションの有無でWindowがあるか確認するのはどうでしょう

WindowsAPI Declare PtrSafe Function / Declare Function で
EnumWindows GetWindow GetWindowText 
最前面アクティブ (取得時hwndはリストボックスのカラムに入れておく)
SetForegroundWindow
こんな構成で出来るような気がします・・
    • good
    • 1
この回答へのお礼

ヒントを頂きありがとうございます。

頂いたヒントをもとにネットを徘徊していたら
下記のコードが見つかりました。

ですがこのコードですと、バックグランドの物を拾ってきてしまいます。

『ここをこうすれば』みたなものがありましたら
教えて頂けないでしょうか。
文字数の関係で64Bit/32Bitの処理分けコードを省いております

Option Explicit


Const GW_HWNDLAST = 1
Const GW_HWNDNEXT = 2
'-------------------------------------------------------------------------------------
Sub main()


Dim strCaption As String * 500

hwnd = FindWindow(vbNullString, vbNullString)

Dim caps As Collection
Set caps = New Collection
Dim cap 'As String
Do
If IsWindowVisible(hwnd) Then

GetWindowText hwnd, strCaption, Len(strCaption)

cap = Left(strCaption, InStr(strCaption, vbNullChar) - 1)
If cap <> "" Then
caps.Add cap
End If

End If

hwnd = GetNextWindow(hwnd, GW_HWNDNEXT)

Loop Until hwnd = GetNextWindow(hwnd, GW_HWNDLAST)

For Each cap In caps
Debug.Print cap
Next cap

End Sub

お礼日時:2022/12/28 15:06

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています


おすすめ情報

このQ&Aを見た人がよく見るQ&A