エクセルVBA API FindWindowでハンドルを取得し、SetForegroundWindowで画面を最前面に表示する。

メモ帳を画面の最前面に表示する。

機能としては、「AppActivate」と全く同じですが、あえてAPIを使って処理をしてみました。
APIの理解の手助けになれば、幸いです。

1 環境

Windows10 home
Excel2019

2 得られる効果

メモ.txtを画面の最前面に表示する。

3 AppActivateの場合

まず、メモ.txtを開いておきます。その後、以下のモジュールが記載されているエクセルをActiveにして、モジュールを実行します。

Sub Sample2()
    AppActivate "メモ.txt - メモ帳", True
End Sub


構文

AppActivate title[,wait]

引数titleには、アクティブにするアプリケーションのタイトルを指定します。
引数waitは省略可能です。TrueまたはFalseを指定します。

title部分がどこかというと、黄色の蛍光ペン部分です。
以下↓↓(メモ帳が最前面になります。)
f:id:bimori466:20200922060046p:plain


AppActivateの使い方がわかったところで、次はAPIを使って同じことをやりましょう!

4 APIを使って、メモ帳を画面の最前面に!

まずは、ソースコードを記述します。

Declare Function FindWindow Lib "user32" Alias "FindWindowA" _
(ByVal lpClassName As String, ByVal lpWindowName As String) As Long

Declare Sub SetForegroundWindow Lib "user32" (ByVal hWnd As Long)

Sub キャプション名からウインドウハンドルを取得する()

Dim hWnd As Long
hWnd = FindWindow(vbNullString, "メモ.txt - メモ帳")    'caption名からハンドルを取得


SetForegroundWindow (hWnd)  '画面を最前列に表示する

End Sub

これだけです。Declare~はモジュールレベル部分(一番上)に記載します。
これで、「AppActivate "メモ.txt - メモ帳", True」と全く同じ処理が可能となります。

5 APIを使うメリット

AppAtivateメソッドをキャプション名を引数に入れて実行してもウインドウを最前面にすることはできますが、ウインドウハンドルを取得できれば、最前面に表示してアクティブにもできますし、キーボードやマウスでの操作も可能になります。

6 感想

ハンドルを取得する、ということに抵抗感があったのですが、AppActivateとの使い方と比較すると意外と簡単なことでした。あとはどう応用するか。