Office関連

[Win32 API]PowerPointマクロにショートカットキーを割り当てる。

数日前、“PowerPointだとマクロにショートカットキーを割り当てるのが難しい”というツイートが流れてきました。

たしかに、PowerPointではExcelやWordと違って、OnKeyメソッドやマクロのオプションによるキー割り当てができないため、ショートカットキーからマクロを実行することは難しいです。

そこで、当ブログでも数年前にツールを使った方法やクイック アクセス ツール バーを使った方法について記事を書きました。

これらとは別に、RegisterHotKey関数を使ったマクロも書いていた記憶があったので、PCの中を漁ったところ、当時のコードが出てきました。

'標準モジュール
'※64ビット版PowerPointで実行する場合はコード要変更
Option Explicit

Private Declare Function CallWindowProc Lib "user32" Alias "CallWindowProcA" (ByVal lpPrevWndFunc As Long, ByVal hWnd As Long, ByVal Msg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
Private Declare Function FindWindowEx Lib "user32.dll" Alias "FindWindowExA" (ByVal hwndParent As Long, ByVal hwndChildAfter As Long, ByVal lpszClass As String, ByVal lpszWindow As String) As Long
Private Declare Function GlobalAddAtom Lib "kernel32" Alias "GlobalAddAtomA" (ByVal lpString As String) As Integer
Private Declare Function GlobalDeleteAtom Lib "kernel32" (ByVal nAtom As Integer) As Integer
Private Declare Function RegisterHotKey Lib "user32" (ByVal hWnd As Long, ByVal id As Long, ByVal fsModifiers As Long, ByVal vk As Long) As Long
Private Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA" (ByVal hWnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long
Private Declare Function UnregisterHotKey Lib "user32" (ByVal hWnd As Long, ByVal id As Long) As Long

Private Const GWL_WNDPROC = (-4)

'WM_HOTKEY Message
'https://docs.microsoft.com/ja-jp/windows/desktop/inputdev/wm-hotkey
Private Const WM_HOTKEY = &H312
Private Const MOD_ALT = &H1
Private Const MOD_CONTROL = &H2
Private Const MOD_SHIFT = &H4
Private Const MOD_WIN = &H8

Private hApp As Long
Private hWndProc As Long
Private iAtom1 As Integer
Private iAtom2 As Integer

Private Sub Macro1()
'ホットキーで実行するマクロ1
  MsgBox "【Macro1】が実行されました。", vbExclamation + vbSystemModal
End Sub

Private Sub Macro2()
'ホットキーで実行するマクロ2
  MsgBox "【Macro2】が実行されました。", vbInformation + vbSystemModal
End Sub

Public Sub StartHook()
'ホットキー設定
  If hWndProc <> 0 Then Exit Sub
  'PowerPointのハンドル取得 ※バージョンによっては要修正
  hApp = FindWindowEx(0, 0, "PPTFrameClass", vbNullString)
  If hApp = 0 Then Exit Sub
  'アトム取得
  'https://msdn.microsoft.com/ja-jp/library/cc429867.aspx
  iAtom1 = GlobalAddAtom("HOTKEY1")
  iAtom2 = GlobalAddAtom("HOTKEY2")
  'ホットキー登録
  'https://msdn.microsoft.com/ja-jp/library/cc411006.aspx
  RegisterHotKey hApp, iAtom1, MOD_ALT, vbKeyF8 'Alt + F8キー設定
  RegisterHotKey hApp, iAtom2, MOD_ALT, vbKeyF11 'Alt + F11キー設定
  hWndProc = SetWindowLong(hApp, GWL_WNDPROC, AddressOf WndProc)
  Debug.Print "--- ホットキー設定開始 --- (" & Hex(hWndProc) & ")"
End Sub

Public Sub EndHook()
'ホットキー解除 ※必ず実行
  If hWndProc = 0 Then Exit Sub
  SetWindowLong hApp, GWL_WNDPROC, hWndProc
  'ホットキー削除
  'https://msdn.microsoft.com/ja-jp/library/cc364856.aspx
  UnregisterHotKey hApp, iAtom1
  UnregisterHotKey hApp, iAtom2
  'アトム削除
  'https://msdn.microsoft.com/ja-jp/library/cc429847.aspx
  GlobalDeleteAtom iAtom1
  GlobalDeleteAtom iAtom2
  hWndProc = 0
  Debug.Print "--- ホットキー解除 ---"
End Sub

Private Function WndProc(ByVal hWnd As Long, ByVal uMsg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
  If uMsg = WM_HOTKEY Then
    Select Case wParam
      Case iAtom1: Macro1
      Case iAtom2: Macro2
    End Select
  End If
  WndProc = CallWindowProc(hWndProc, hWnd, uMsg, wParam, lParam)
End Function

「StartHook」を実行すると、Alt + F8キーを押すと「Macro1」が、Alt + F11キーを押すと「Macro2」が実行されるようになります。
※ファイルを閉じる前に必ず「EndHook」を実行する必要があります。

上記コードで、一応マクロにショートカットキーを割り当てることができますが、フック処理を伴うコードなので、正直お薦めはしません。

記事を書いておいて何ですが、「こういった方法もあるんだ!」程度に留めておいていただければと思います。

実際にショートカットキーからPowerPointマクロを実行する場合は、クイック アクセス ツール バーを経由する、あるいはユーザーフォームを活用する、といった方法をお薦めします。

選択中の図形の文字列を蛍光ペンでハイライトするPowerPointマクロ前のページ

[Google Apps Script]Google スライドでスクリプトを実行する次のページ

関連記事

  1. Office関連

    格子状にガイドを追加するPowerPointマクロ

    前回の記事で、PowerPoint 2013で追加されたGuide、G…

  2. Office関連

    RSSの日付を変換するVBAマクロ

    RSSから取得した日付(「Wed, 20 Dec 2017 00:02…

  3. Office関連

    関数一覧(Excel 2013 Customer Preview)

    関数の挿入ダイアログから抽出したExcel 2013 Customer…

  4. Office関連

    PowerPointのマクロを共有化して使う方法

    記事のタイトルだけ見るとちょっと分かりづらいですが、要するにWordの…

  5. Office関連

    「Excel VBAでラクラク Win64 APIプログラミング」(大村あつし著)レビュー

    当ブログでも以前書評を書いた「Excel VBAの神様 ボクの人生を変…

コメント

  • コメント (0)

  • トラックバックは利用できません。

  1. この記事へのコメントはありません。

Time limit is exhausted. Please reload CAPTCHA.

※本ページはプロモーションが含まれています。

Translate

最近の記事

アーカイブ

PAGE TOP