VSTOでOutlookのアドインを作成しています。
Outlookのシステムメニューへ項目("About...")を追加しましたがそれをクリックしてもイベントを受け取れません。
具体的には、以下のGetWindowLongのリターン値が0になります。
lngWnP = GetWindowLong(hwnd, GWL_WNDPROC)
もし、SetWindowsHookExを使用すれば可能であれば具体的にどのようにすれば良いのか教えてください。
VB.net
1Public Class OutlookMenu 2 ' メッセージ処理関数用デリゲート 3 Private Delegate Function D_MyWndProc( 4 ByVal hwnd As Integer, ByVal msg As Integer, 5 ByVal wParam As Integer, ByVal lParam As Integer) As Integer 6 7 ' ウィンドウをサブクラス化するAPI 8 Private Const WM_SYSCOMMAND = &H112 9 Private Const GWL_WNDPROC = -4 10 Private Const MF_SEPARATOR = &H800& 11 Private Const MF_STRING = &H0& 12 Private Const IDM_CUSTOM As Integer = 1010 13 14 Private Declare Function FindWindow Lib "user32.dll" Alias "FindWindowA" _ 15 (ByVal lpClassName As String, ByVal lpWindowName As String) As Integer 16 Private Declare Function GetSystemMenu Lib "user32" _ 17 (ByVal hWnd As Integer, ByVal bRevert As Integer) As Integer 18 Private Declare Function AppendMenu Lib "user32" Alias "AppendMenuA" _ 19 (ByVal hMenu As Integer, ByVal wFlags As Integer, ByVal wIDNewItem As Integer, ByVal lpNewItem As String) As Integer 20 Private Declare Function GetWindowLong Lib "user32.dll" Alias "GetWindowLongA" _ 21 (ByVal hwnd As Integer, ByVal nIndex As Integer) As Integer 22 Private Declare Function SetWindowLong Lib "user32.dll" Alias "SetWindowLongA" _ 23 (ByVal hwnd As Integer, ByVal nIndex As Integer, ByVal dwNewInteger As Integer) As Integer 24 Private Declare Function SetWindowLong Lib "user32.dll" Alias "SetWindowLongA" _ 25 (ByVal hwnd As Integer, ByVal nIndex As Integer, ByVal dwNewInteger As D_MyWndProc) As Integer 26 Private Declare Function CallWindowProc Lib "user32.dll" Alias "CallWindowProcA" _ 27 (ByVal lpPrevWndFunc As Integer, ByVal hwnd As Integer, ByVal msg As Integer, 28 ByVal wParam As Integer, ByVal lParam As Integer) As Integer 29 30 ' デフォルトのメッセージ処理関数 31 Private Shared lngWnP As Integer 32 33 ' 独自メッセージの処理を開始 34 Public Shared Sub Start_MyWndProc(ByVal hwnd As Integer) 35 lngWnP = GetWindowLong(hwnd, GWL_WNDPROC) 36 Call SetWindowLong(hwnd, GWL_WNDPROC, AddressOf MyWndProc) 37 End Sub 38 39 ' 独自メッセージの処理を終了 40 Public Shared Sub End_MyWndProc(ByVal hwnd As Integer) 41 Call SetWindowLong(hwnd, GWL_WNDPROC, lngWnP) 42 End Sub 43 44 ' ウィンドウに来たメッセージを振り分ける関数 45 Private Shared Function MyWndProc( 46 ByVal hwnd As Integer, ByVal msg As Integer, 47 ByVal wParam As Integer, ByVal lParam As Integer) As Integer 48 If msg = WM_SYSCOMMAND Then 49 If wParam = IDM_CUSTOM Then 50 ' 独自メニューの処理 51 MsgBox("VB Web About...", vbInformation, "About") 52 Return 0 53 End If 54 End If 55 ' デフォルトのメッセージ処理 56 Return CallWindowProc(lngWnP, hwnd, msg, wParam, lParam) 57 End Function 58 ' ============================================================================================ 59 Public Shared Sub customMenu() 60 Dim hwnd As Integer 61 Dim lhSysMenu As Integer, lRet As Integer 62 63 hwnd = FindWindow("rctrl_renwnd32", vbNullString) 'Outlook本体 64 lhSysMenu = GetSystemMenu(hwnd, 0&) 65 'Add seperator 66 lRet = AppendMenu(lhSysMenu, MF_SEPARATOR, 0&, vbNullString) 67 'Add new menu item 68 lRet = AppendMenu(lhSysMenu, MF_STRING, IDM_CUSTOM, "About...") 69 70 Call Start_MyWndProc(hwnd) 71 End Sub 72End Class 73--
あなたの回答
tips
プレビュー