VBA环境,想要创建一个窗口和控件,发现Edit编辑框创建后无法接收键盘事件,输入的字符会传到Excel的ActiveCell中。如何才能让自己创建的窗口接收到键盘消息呀
'1.创建主窗口
Public Sub CreateDataQuery1()
#If VBA7 And Win64 Then
DQP.Hint = Application.HinstancePtr
#Else
DQP.Hint = Application.hInstance
#End If
If IsWindow(DQP.Form) Then DestroyDataQuery1
Dim DstyleS&: DstyleS = WS_OVERLAPPED Or WS_THICKFRAME Or WS_SYSMENU Or WS_CAPTION Or WS_VISIBLE
Dim DstyleE&: DstyleE = WS_EX_DLGMODALFRAME
DQP.Form = CreateWindowEx(DstyleE, "#32770", "我的窗口", DstyleS, 0, 0, 330, 430, Application.hwnd, Nuptr, DQP.Hint, ByVal Nuptr)
Dim Cret As RECT: GetClientRect DQP.Form, Cret
DstyleS = WS_CHILD Or WS_VISIBLE Or WS_BORDER Or ES_LEFT Or ES_AUTOHSCROLL
DQP.Edit = CreateWindowEx(0, "Edit", "", DstyleS, 10, 20, Cret.Right - Cret.Left - 20, 20, DQP.Form, 100, DQP.Hint, ByVal Nuptr)
DQP.Font = CreateFont(12, 0, 0, 0, 0, 0, 0, 0, 1, 7, 0, 0, 0, "SimSun")
SendMessage DQP.Edit, WM_SETFONT, DQP.Font, True
SubClassingDqUsFr1
End Sub
'2.销毁主窗口
Public Sub DestroyDataQuery1()
UnSubClassingDqUsFr1
DestroyWindow DQP.Edit: DestroyWindow DQP.Form
Dim EDQP As DataQueryPtr: DQP = EDQP
End Sub
'4.子类化
Private Sub SubClassingDqUsFr1()
DQP.Proc = SetWindowLongPtr(DQP.Form, GWL_WNDPROC, AddressOf WindowProcDqUsFr)
End Sub
Private Sub UnSubClassingDqUsFr1()
If DQP.Proc Then SetWindowLongPtr DQP.Form, GWL_WNDPROC, DQP.Proc
End Sub
#If VBA7 And Win64 Then
Private Function WindowProcDqUsFr(ByVal hwnd As LongPtr, ByVal msg As Long, ByVal wParam As LongPtr, ByVal lParam As LongPtr) As LongPtr
#Else
Private Function WindowProcDqUsFr(ByVal hwnd As Long, ByVal msg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
#End If
Select Case msg
Case WM_CLOSE
DestroyDataQuery1
WindowProcDqUsFr = Nuptr
Exit Function
End Select
WindowProcDqUsFr = CallWindowProc(DQP.Proc, hwnd, msg, wParam, lParam)
End Function
相似问题