vbaでmsgboxの位置を指定
http://okwave.jp/qa/q5253604.html
を参考に、http://homepage1.nifty.com/rucio/main/technique/MsgBox.htmをやってみたのですが
うまくいきません。
検証はエクセル・アクセス2007で行いました。
//////////////////////////////////////////////////////////////////
Option Explicit
Dim App As Object
Private Declare Function SetWindowsHookEx Lib "user32" Alias "SetWindowsHookExA" _
(ByVal idHook As Long, _
ByVal lpfn As Long, _
ByVal hmod As Long, _
ByVal dwThreadId As Long) As Long
Private Declare Function UnhookWindowsHookEx Lib "user32" _
(ByVal hHook As Long) As Long
Private Declare Function SetWindowPos Lib "user32" _
(ByVal hwnd As Long, _
ByVal hWndInsertAfter As Long, _
ByVal x As Long, _
ByVal y As Long, _
ByVal cx As Long, _
ByVal cy As Long, _
ByVal wFlags As Long) As Long
Const WH_CBT = 5
Const HCBT_ACTIVATE = 5
Public Const SWP_NOSIZE = &H1 '「サイズを指定しない」オプション
Public Const SWP_NOZORDER = &H4 '「Zオーダーを指定しない」オプション
Public Const SWP_NOACTIVATE = &H10
Dim HookHandle As Long '元のCBTProcプロシージャへのハンドル
Dim m_Left As Long 'メッセージボックスのX座標
Dim m_Top As Long 'メッセージボックスのY座標
Public Sub SetMsgBox(Left As Long, Top As Long)
m_Left = Left
m_Top = Top
HookHandle = SetWindowsHookEx(WH_CBT, AddressOf CBTProc, App.Hinstance, App.ThreadID)
End Sub
Private Function CBTProc(ByVal nCode As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
Dim Ret As Long
If nCode = HCBT_ACTIVATE Then
Ret = SetWindowPos(wParam, 0, m_Left, m_Top, 0, 0, SWP_NOSIZE Or SWP_NOZORDER Or SWP_NOACTIVATE)
Ret = UnhookWindowsHookEx(HookHandle)
End If
CBTProc = Ret
End Function
//////////////////////////////////////////////////////////////////
を標準モジュールに貼りつけました。
Dim App As Objectについては、参考のページにはありませんでしたが
エラーになるので勝手にObjectにしました。
そしてこのコードを書いた標準モジュールに
Sub test()
SetMsgBox 0, 0
MsgBox "この例では左上に表示されます。"
End Sub
を足しました。
そして実行すると、
HookHandle = SetWindowsHookEx(WH_CBT, AddressOf CBTProc, App.Hinstance, App.ThreadID)
の部分で
オブジェクト変数または With ブロック変数が設定されていません。(Error 91)
になります。
VBAでの位置の指定方法を教えてください!!!
お礼
毎度、ご回答してくださってありがとうございます。 おっしゃる通り、GetKeyboardState()を用いてできそうです♪ またよろしくお願いします。