【入門編】【プロフェッショナル】Application.HWNDを利用し、PowerPointがスライドショー(SlideShowWindows)を実行している最中に、Windows APIでタスクバーを完全に非表示にし、キオスク端末のような完全フルスクリーン表示を強制するシステム制御 – PowerPoint VBA解析バイブル

スポンサーリンク

こんにちは、未来のチーフアーキテクトの皆さん。

PowerPoint VBAの世界へようこそ。マクロの記録を卒業し、「もっと自由自在に、OSの挙動すらも支配したい」と願い始めた皆さんは、今、最高にエキサイティングな扉の前に立っています。

今日私たちが挑むのは、「PowerPointを究極のキオスク端末に変える」というミッションです。

展示会や店舗のディスプレイで、スライドショーの背後にタスクバーが見えてしまったり、通知がひょっこり顔を出したりして、せっかくの世界観が台無しになった経験はありませんか?標準機能の「スライドショー」だけでは、実はWindowsという巨大なOSを完全には抑え込めません。

今回は、PowerPointの「外側」にあるWindowsの仕組みを、VBAから直接操作する「Windows API」という魔法を使って、プロフェッショナルな完全フルスクリーンを実現する方法を伝授しましょう。

—

1. なぜ「Application.HWND」が必要なのか?

まず、基本となるオブジェクトの考え方から整理しましょう。

PowerPoint VBAの世界には、`Application`(アプリ全体)、`Presentation`(ファイル)、`Slide`(ページ)といった階層構造があります。しかし、これらはあくまで「PowerPointという箱の中」の話です。

WindowsというOSから見れば、PowerPointも一つの「ウィンドウ」に過ぎません。そのウィンドウにOSレベルで命令を送るための「背番号」がHWND(ウィンドウハンドル)です。

  • Application.HWND: PowerPointのメインウィンドウを識別する固有のID。

これを利用することで、PowerPointとWindows OSの境界線を越え、タスクバーを隠したり、ウィンドウを最前面に固定したりといった「OSレベルの制御」が可能になります。

—

2. Windows APIという「禁断の果実」を扱う準備

VBAからOSを操作するには、Windows APIを呼び出します。これはVBAの標準機能ではなく、Windows(C++などで書かれたシステム)の機能を直接借りてくる手法です。

今回使うのは、以下の2つの関数です。

1. FindWindow: 指定した名前のウィンドウ(今回はタスクバー)を探し出す。
2. ShowWindow: そのウィンドウを表示したり、隠したりする。

注意点:64bit版と32bit版の壁

現代のOfficeは64bit版が主流ですが、古いコードをコピペすると動かないことがあります。プロのコードには必ず`PtrSafe`という記述を加え、どちらの環境でも動くように配慮します。

—

3. 【実践】タスクバーを消し去る究極のコード

それでは、コードを見ていきましょう。このコードは、スライドショーを開始すると同時にタスクバーを完全に消去し、終了と同時に元に戻すという「マナー」を備えたプロ仕様です。

標準モジュールを作成し、以下のコードを貼り付けてください。

Option Explicit

‘ — Windows APIの宣言 (64bit/32bit両対応) —
‘ タスクバーのウィンドウハンドルを取得するための関数
If VBA7 Then
Declare PtrSafe Function FindWindow Lib “user32” Alias “FindWindowA” (ByVal lpClassName As String, ByVal lpWindowName As String) As LongPtr
Declare PtrSafe Function ShowWindow Lib “user32” (ByVal hwnd As LongPtr, ByVal nCmdShow As Long) As Long
Else
Declare PtrSafe Function FindWindow Lib “user32” Alias “FindWindowA” (ByVal lpClassName As String, ByVal lpWindowName As String) As Long
Declare PtrSafe Function ShowWindow Lib “user32” (ByVal hwnd As Long, ByVal nCmdShow As Long) As Long
End If

‘ ウィンドウを表示・非表示にするための定数
Private Const SW_HIDE = 0
Private Const SW_SHOW = 5

‘ —————————————————————-
‘ メイン処理:キオスクモード開始
‘ —————————————————————-
Sub StartKioskMode()
On Error GoTo ErrorHandler

‘ 1. タスクバーを隠す
‘ Windowsのタスクバーは “Shell_TrayWnd” というクラス名を持っています
Dim taskbarHandle As LongPtr
taskbarHandle = FindWindow(“Shell_TrayWnd”, vbNullString)

If taskbarHandle <> 0 Then
ShowWindow taskbarHandle, SW_HIDE
End If

‘ 2. スライドショーを開始する
‘ 最初のプレゼンテーションの、最初のスライドショー設定を実行
With ActivePresentation.SlideShowSettings
.ShowType = ppShowTypeKiosk ‘ ユーザー操作を制限するキオスクモード
.Run
End With

Debug.Print “キオスクモードを開始しました。タスクバーを隠蔽しています。”
Exit Sub

ErrorHandler:
MsgBox “エラーが発生しました: ” & Err.Description, vbCritical
Call RestoreTaskbar ‘ エラーが起きてもタスクバーは戻すのがプロの鉄則
End Sub

‘ —————————————————————-
‘ 終了処理:タスクバーを元に戻す
‘ —————————————————————-
Sub RestoreTaskbar()
Dim taskbarHandle As LongPtr
taskbarHandle = FindWindow(“Shell_TrayWnd”, vbNullString)

If taskbarHandle <> 0 Then
ShowWindow taskbarHandle, SW_SHOW
End If

Debug.Print “タスクバーを復元しました。”
End Sub

—

4. コードの深層解説:ここがプロの視点

クラス名 “Shell_TrayWnd” の正体

Windows上のあらゆる要素には「クラス名」があります。タスクバーは`Shell_TrayWnd`という名前で登録されています。これを`FindWindow`で探すことで、世界に一つだけのタスクバーの「ハンドル(操作権)」を掴み取ることができるのです。

ppShowTypeKiosk の活用

スライドショーの設定で `.ShowType = ppShowTypeKiosk` を指定しています。これは、Escキー以外のキーボード操作(矢印キーでの進む・戻るなど)を制限し、画面上のボタン(アクション設定)のみで操作させるモードです。APIによるタスクバー隠蔽と組み合わせることで、「PowerPoint以外の操作を許さない鉄壁のシステム」が完成します。

ライフサイクル管理(エラーハンドリング)

ここが最も重要です。もしAPIでタスクバーを隠したままマクロが異常終了したらどうなるでしょうか?
ユーザーの画面からタスクバーが消えたままになり、PCの再起動を余儀なくされます。
これはエンジニアとして絶対に避けるべき事態です。`On Error GoTo ErrorHandler` を使い、何が起きても最後に必ず `RestoreTaskbar` を呼び出す。この「後始末」の精神こそが、プロフェッショナルとアマチュアを分ける境界線です。

—

5. ステップアップ:イベントによる自動制御

さらに上を目指すなら、スライドショーが終わった瞬間に自動でタスクバーを戻したいですよね。そのためには「クラスモジュール」を使って、PowerPointのイベント(`SlideShowEnd`)を監視する必要があります。

1. クラスモジュールを作成し、名前を `AppEventClass` にします。
2. 以下のコードを書きます。

Public WithEvents App As Application

Private Sub App_SlideShowEnd(ByVal Pres As Presentation)
‘ スライドショーが終わったら自動でタスクバーを出す
Call RestoreTaskbar
MsgBox “展示モードを終了し、システムを安全に復元しました。”
End Sub

これを標準モジュールでインスタンス化(実体化)すれば、手動で戻す手間すら省けます。

—

終わりに:技術は「おもてなし」のために

いかがでしたか?`Application.HWND` と Windows API。一見難しそうに見えるこれらの技術は、突き詰めれば「利用者に最高の体験を届け、余計なノイズを排除する」という、究極のおもてなしを実現するための道具です。

「マクロの記録」では絶対に到達できない、このOSとアプリが融合する領域。ここを自由に歩けるようになれば、あなたの作るツールは単なる「便利機能」を超え、一つの「完成されたシステム」へと昇華します。

まずはこのコードを動かし、タスクバーが消える瞬間の「自分がシステムを支配している感覚」を味わってみてください。それが、さらなる高みへ進むための原動力になるはずです。

分からないことがあれば、いつでも聞いてくださいね。皆さんの挑戦を応援しています!

タイトルとURLをコピーしました