2016-12-08 4 views
0

В настоящее время я пытаюсь подклассифицировать элемент управления Edit, в частности тему электронной почты в Outlook Client. Этот элемент управления имеет класс RichEdit20WPT.Есть ли что-то особенное в сообщениях wndProc для окна RichEdit20WPT?

Я получаю wndProc с помощью следующих методов WINAPI.

<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. Это верно? Примечание. Я не создаю свое собственное контекстное меню, которое я добавляю к существующему, поэтому я не изменяю владельца контекстного меню или что-то в этом роде.

+1

Вы ставите, что есть что-то особенное! Это не стандартный элемент управления Windows.Стандартный элемент управления текстовым полем имеет имя класса 'RichEdit20'. Суффикс 'WPT' - это что-то добавленное командой Outlook для обозначения их пользовательской реализации. –

+0

Мое предположение тогда будет означать, что контекстное меню появится после сообщения правой кнопки мыши. Кроме того, что это не сообщение WM_CONTEXTMENU, это предположение кажется мне подходящим. – darbid

+0

Выполняется ли ваш код в процессе создания окна. –

ответ

0

Спасибо всем комментариям, которые помогли мне хотя бы продолжить поиск ответов или сообщений в этом случае. Для тех, кто придет сюда и хочет добавить в контекстное меню 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) это то, что я нашел;

  1. В текстовом поле вы должны найти как для Проводника и инспектор RichEdit20WPT
  2. Это окно, однако не получает два ключевых сообщений, необходимых. (a) он не получает WM_INITMENUPOPUP, чтобы знать, прежде чем контекстное меню будет показано, а во-вторых (b) оно не получит сообщение, когда вы выберете что-то в контекстном меню, которое является WM_COMMAND в этом случае.
  3. Чтобы изменить контекстное меню, вам необходимо подклассифицировать родительский объект текстового поля, который является окном класса # 32770.
  4. Поскольку родительский объект является подклассом, существует несколько проблем. Чтобы узнать, когда наше целевое текстовое поле было нажато правой кнопкой мыши из окна # 32770, вам нужно искать 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 

После того, как вы это знаете, вы можете реализовать идеи из других ответов на форуме.

 Смежные вопросы

  • Нет связанных вопросов^_^