2016-12-08 24 views
0

現在、編集コントロール、特にOutlookクライアントの電子メールの件名をサブクラス化しようとしています。このコントロールはRichEdit20WPTクラスです。RichEdit20WPTウィンドウのwndProcメッセージに特別なものはありますか?

次の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ウィンドウです。これは正しいです?注:私は自分のコンテキストメニューを作成していないので、既存のコンテキストメニューに追加していますので、コンテキストメニューの所有者などを変更していません。

+1

あなたは何か特別なことがあるでしょうか?これは標準のWindowsコントロールではありません。標準のリッチテキストボックスコントロールには、クラス名が「RichEdit20」です。 'WPT'サフィックスは、カスタム実装を示すためにOutlookチームによって追加されたものです。 –

+0

私の前提は、マウスの右クリックメッセージの後にコンテキストメニューが現れることです。それがWM_CONTEXTMENUメッセージではないという事実以外は、この仮定は私にとっては大丈夫です。 – darbid

+0

ウィンドウを作成したプロセスでコードが実行されますか? –

答えて

0

少なくとも回答やこのメッセージの検索を続けてくれたすべてのコメントありがとうございます。誰でもここに来て、Outlookメニューのコンテキストメニューに追加したい人のために。

ここには、一般的に何をすべきかを説明する2つの良いリンクがあります。 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. エクスプローラとインスペクタの両方のために見つける必要があるテキストボックスは
  2. このウィンドウには、しかし、必要なキーメッセージのうちの2つを取得していないRichEdit20WPTです。 (a)コンテキストメニューが表示される前にWM_INITMENUPOPUPを知ることができず、(b)この場合WM_COMMANDであるコンテキストメニューで何かを選択するとメッセージが表示されません。
  3. コンテキストメニューを修正するには、クラス#32770のウィンドウであるサブジェクトテキストボックスの親をサブクラス化する必要があります。
  4. 親がサブクラス化されているので、いくつかの課題があります。 #32770ウィンドウからターゲットテキストボックスが右クリックされたときを知るには、WM_SETCURSORを探す必要があります。

wParamがテキストボックスのHwndになり、HiWordがマウスメッセージになります。

あなたがこれを知ったら、あなたは他のフォーラムの回答からアイデアを実装することができ、このメッセージ

Case NativeMethodsEX.WM_INITMENUPOPUP 
    If rightClickOnSubject Then 
     'check here if you want to display something. 
    End If 

があるでしょう直後に続いて

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 

関連する問題