C# と VB.NET の質問掲示板

わんくま同盟

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト


(過去ログ 111 を表示中)
■65844 / )  Re[1]: Excel 2010 で WndProc が機能しない
□投稿者/ 魔界の仮面弁士 (177回)-(2013/03/20(Wed) 19:09:17)
No65841 (doragora さん) に返信
> またMSDNでは GetWindowLongPtr を推奨となっていますが、Excelが落ちます。

Initialize の最中ではなく、「Initialize が終わった後」でサブクラス化してみては如何でしょう。


Option Explicit

Private hwnd As LongPtr

Private Sub UserForm_Initialize()
    hwnd = Module1.FindWindow(StrPtr(vbNullString), StrPtr(Me.Caption))
End Sub

Private Sub UserForm_Activate()
#If Win64 Then
    If Module1.PrevWndProc <> 0^ Then
        Exit Sub
    End If
    Module1.PrevWndProc = Module1.SetWindowLongPtrW(hwnd, GWLP_WNDPROC, AddressOf Module1.WndProc)
#Else
    If Module1.PrevWndProc <> 0& Then
        Exit Sub
    End If
    Module1.PrevWndProc = Module1.SetWindowLongW(hwnd, GWL_WNDPROC, AddressOf Module1.WndProc)
#End If

'    MsgBox CStr(Err.Number) & vbNewLine & _
'           CStr(Err.LastDllError) & vbNewLine & _
'           Err.Description, vbInformation, _
'           CStr(Module1.PrevWndProc)
End Sub

Private Sub UserForm_Terminate()
    Dim ret As LongPtr
#If Win64 Then
    If Module1.PrevWndProc <> 0^ Then
        ret = Module1.SetWindowLongPtrW(hwnd, GWL_WNDPROC, Module1.PrevWndProc)
        Module1.PrevWndProc = 0^
    End If
#Else
    If Module1.PrevWndProc <> 0& Then
        ret = Module1.SetWindowLongW(hwnd, GWL_WNDPROC, Module1.PrevWndProc)
        Module1.PrevWndProc = 0&
    End If
#End If
'    MsgBox "Done:" & CStr(ret), vbInformation, CStr(Module1.PrevWndProc)
End Sub

返信 編集キー/


管理者用

- Child Tree -