RichEdit20WPT window 的 wndProc 消息有什么特别之处吗?
Is there something special about the wndProc messages for a RichEdit20WPT window?
我目前正在尝试子class 一个编辑控件,特别是 Outlook 客户端中电子邮件的主题。此控件属于 class RichEdit20WPT。
我通过使用以下 WINAPI 方法获得了一个 wndProc。
<DllImport("ComCtl32.dll", CharSet:=CharSet.Auto)> _
Public Shared Function SetWindowSubclass(hWnd As IntPtr, newProc As Win32SubClassProc, uIdSubclass As IntPtr, dwRefData As IntPtr) As Integer
End Function
<DllImport("comctl32.dll", SetLastError:=True, CharSet:=CharSet.Auto)> _
Public Shared Function DefSubclassProc(ByVal hWnd As IntPtr, ByVal uMsg As IntPtr, ByVal wParam As IntPtr, ByVal lParam As IntPtr) As Integer
End Function
Public Delegate Function Win32SubClassProc(hWnd As IntPtr, Msg As IntPtr, wParam As IntPtr, lParam As IntPtr, uIdSubclass As IntPtr, dwRefData As IntPtr) As Integer
然后会有这样的 wndProc;
Private WM_CONTEXTMENU As IntPtr = &H7B
Private Function SubClassProc(hWnd As IntPtr, Msg As IntPtr, wParam As IntPtr, lParam As IntPtr, uIdSubclass As IntPtr, dwRefData As IntPtr) As Integer
Select Case Msg
Case WM_DESTROY
Case WM_NCDESTROY
Case WM_LBUTTONDOWN
Case WM_CONTEXTMENU 'NEVER HAPPENS
Case WM_RBUTTONDOWN
End Select
Return DefSubclassProc(hWnd, Msg, wParam, lParam)
End Function
我收到 L 和 R 按钮按下和向上的消息,但没有 WM_CONTEXTMENU。我目前的意图是向上下文菜单添加一个菜单项,因此我使用 WM_RBUTTONDOWN 消息作为替代方案。
此控件是否特殊且不显示 WM_CONTEXTMENU 消息?
我也很难找到在上下文菜单中选择某些内容后出现的消息。我的理解是,在上下文菜单中单击的菜单项的消息被提供给父级,在这种情况下是这个 RichEdit20WPT window。这个对吗?请注意,我不是在制作自己的上下文菜单,而是将其附加到现有菜单,因此我不会更改上下文菜单或类似内容的所有者。
感谢所有帮助我至少继续搜索答案或在本例中为消息的评论。对于来到这里并希望添加到 Outlook 菜单的上下文菜单的任何人。
首先,这里有两个很好的链接,它们大致说明了要做什么。
How to disable copy/paste commands in the Windows edit control context menu?
Modify right-click context menu in standard controls
阅读它们的任何人都可以假设一个标准的编辑控件,例如将发送消息的 windows 表单应用程序上的文本框。
对于 Outlook(至少 2007 / 2010)这是我找到的;
- 您需要为资源管理器和检查器查找的文本框是 RichEdit20WPT
- 但是 window 没有得到所需的两个关键信息。 (a) 在显示上下文菜单之前,它不会 WM_INITMENUPOPUP 知道;其次 (b) 当您在上下文菜单中选择 WM_COMMAND 中的内容时,它不会收到消息案例.
- 为了修改上下文菜单,您需要子class 主题文本框的 parent,它是 class #32770 的 window。
- 由于 parent 被子 classed 存在一些挑战。要知道我们的目标文本框何时从 #32770 window 中右键单击,您需要查找 WM_SETCURSOR.
类似这样,其中 wParam 将是文本框的 Hwnd,而 HiWord 将是鼠标消息;
Case NativeMethodsEX.WM_SETCURSOR
If wParam = subjectHwnd Then
Dim pMap As New NativeMethodsEX.LParamMap(lParam)
If pMap.hiword = NativeMethodsEX.WM_RBUTTONUP Then
rightClickOnSubject = True
Else
rightClickOnSubject = False
End If
End If
然后不久之后就会有这个消息
Case NativeMethodsEX.WM_INITMENUPOPUP
If rightClickOnSubject Then
'check here if you want to display something.
End If
了解了这一点后,您就可以实施其他论坛答案中的想法。
我目前正在尝试子class 一个编辑控件,特别是 Outlook 客户端中电子邮件的主题。此控件属于 class RichEdit20WPT。
我通过使用以下 WINAPI 方法获得了一个 wndProc。
<DllImport("ComCtl32.dll", CharSet:=CharSet.Auto)> _
Public Shared Function SetWindowSubclass(hWnd As IntPtr, newProc As Win32SubClassProc, uIdSubclass As IntPtr, dwRefData As IntPtr) As Integer
End Function
<DllImport("comctl32.dll", SetLastError:=True, CharSet:=CharSet.Auto)> _
Public Shared Function DefSubclassProc(ByVal hWnd As IntPtr, ByVal uMsg As IntPtr, ByVal wParam As IntPtr, ByVal lParam As IntPtr) As Integer
End Function
Public Delegate Function Win32SubClassProc(hWnd As IntPtr, Msg As IntPtr, wParam As IntPtr, lParam As IntPtr, uIdSubclass As IntPtr, dwRefData As IntPtr) As Integer
然后会有这样的 wndProc;
Private WM_CONTEXTMENU As IntPtr = &H7B
Private Function SubClassProc(hWnd As IntPtr, Msg As IntPtr, wParam As IntPtr, lParam As IntPtr, uIdSubclass As IntPtr, dwRefData As IntPtr) As Integer
Select Case Msg
Case WM_DESTROY
Case WM_NCDESTROY
Case WM_LBUTTONDOWN
Case WM_CONTEXTMENU 'NEVER HAPPENS
Case WM_RBUTTONDOWN
End Select
Return DefSubclassProc(hWnd, Msg, wParam, lParam)
End Function
我收到 L 和 R 按钮按下和向上的消息,但没有 WM_CONTEXTMENU。我目前的意图是向上下文菜单添加一个菜单项,因此我使用 WM_RBUTTONDOWN 消息作为替代方案。
此控件是否特殊且不显示 WM_CONTEXTMENU 消息?
我也很难找到在上下文菜单中选择某些内容后出现的消息。我的理解是,在上下文菜单中单击的菜单项的消息被提供给父级,在这种情况下是这个 RichEdit20WPT window。这个对吗?请注意,我不是在制作自己的上下文菜单,而是将其附加到现有菜单,因此我不会更改上下文菜单或类似内容的所有者。
感谢所有帮助我至少继续搜索答案或在本例中为消息的评论。对于来到这里并希望添加到 Outlook 菜单的上下文菜单的任何人。
首先,这里有两个很好的链接,它们大致说明了要做什么。 How to disable copy/paste commands in the Windows edit control context menu? Modify right-click context menu in standard controls 阅读它们的任何人都可以假设一个标准的编辑控件,例如将发送消息的 windows 表单应用程序上的文本框。
对于 Outlook(至少 2007 / 2010)这是我找到的;
- 您需要为资源管理器和检查器查找的文本框是 RichEdit20WPT
- 但是 window 没有得到所需的两个关键信息。 (a) 在显示上下文菜单之前,它不会 WM_INITMENUPOPUP 知道;其次 (b) 当您在上下文菜单中选择 WM_COMMAND 中的内容时,它不会收到消息案例.
- 为了修改上下文菜单,您需要子class 主题文本框的 parent,它是 class #32770 的 window。
- 由于 parent 被子 classed 存在一些挑战。要知道我们的目标文本框何时从 #32770 window 中右键单击,您需要查找 WM_SETCURSOR.
类似这样,其中 wParam 将是文本框的 Hwnd,而 HiWord 将是鼠标消息;
Case NativeMethodsEX.WM_SETCURSOR
If wParam = subjectHwnd Then
Dim pMap As New NativeMethodsEX.LParamMap(lParam)
If pMap.hiword = NativeMethodsEX.WM_RBUTTONUP Then
rightClickOnSubject = True
Else
rightClickOnSubject = False
End If
End If
然后不久之后就会有这个消息
Case NativeMethodsEX.WM_INITMENUPOPUP
If rightClickOnSubject Then
'check here if you want to display something.
End If
了解了这一点后,您就可以实施其他论坛答案中的想法。