>source

하이퍼 링크 상황에 맞는 메뉴에 단추를 추가하는 Outlook VSTO 추가 기능이 있습니다. idMso="ContextMenuReadOnlyMailHyperlink" ) 클릭 한 하이퍼 링크를 받고 싶습니다.

게시물 덕분에Outlook 2010의 이메일에서 하이퍼 링크의 상황에 맞는 메뉴에 새 옵션을 추가하는 방법은 무엇입니까?, 메일이 새 창에서 열릴 때 클릭 된 하이퍼 링크를 얻을 수있었습니다. 사용 제안 게시물 ActiveInlineResponseWordEditor 읽기 창 내의 메일에 대한 것이지만 항상 그렇기 때문에 저에게는 작동하지 않았습니다. null .

게시물에 따르면Outlook 하이퍼 링크 상황에 맞는 메뉴, ActiveInlineResponseWordEditor 이 컨텍스트에서 사용할 수 없으며 Explorer.Selection 대신 사용해야합니다. 나는 그 방향을 따르려고 시도했지만 클릭 한 하이퍼 링크를 얻는 데 운이 없습니다. 그만큼 Word.Selection 클릭 한 하이퍼 링크를 가리키는 대신 메일의 첫 글자로 돌아 가기 때문에 메일의 시작 부분을 가리키는 것처럼 보입니다.

읽기 창에서 클릭 한 하이퍼 링크를 가져 오려면 어떻게해야합니까?

// mail in new window
if (control.Context is Inspector inspector)
{
    Document document = inspector.WordEditor;
    if (document != null && document.Windows != null && document.Windows.Count > 0)
    {
        Microsoft.Office.Interop.Word.Selection word = document.Windows[1].Selection;
        if (word != null && word.Hyperlinks != null && word.Hyperlinks.Count > 0)
        {
            Hyperlink hyperlink = word.Hyperlinks[1];
            MessageBox.Show(hyperlink.Address); // output: the clicked hyperlink
        }
    }
}
// mail in reading pane
else if (control.Context is Explorer explorer)
{
    Microsoft.Office.Interop.Outlook.Selection selection = explorer.Selection;
    if (selection[1] is MailItem mailItem)
    {
        Inspector inspector = mailItem.GetInspector;
        Document document = inspector.WordEditor;
        if (document != null && document.Windows != null && document.Windows.Count > 0)
        {
            Microsoft.Office.Interop.Word.Selection word = document.Windows[1].Selection;
            if (word != null && word.Hyperlinks != null)
            {
                MessageBox.Show(word.Hyperlinks.Count.ToString()); // output: 0
                MessageBox.Show(word.Text); // output: the first letter of the mail
            }
        }
    }
}

  • 답변 # 1

    알고리즘은 다음과 같아야합니다.

    확인하십시오 Application.ActiveWindow 이다 Inspector . 사용하다 Application.ActiveWindow.WordEditor 그렇다면.

    그렇지 않으면 캐스트 Application.ActiveWindow ...에 Explorer

    확인하십시오 Explorer.ActiveInlineResponseWordEditor null이 아닙니다. 그걸 써.

    그렇지 않으면 Explorer.PreviewPane.WordEditor

  • 답변 # 2

    하나는 Redemption 's와 함께 클릭 된 하이퍼 링크를 얻을 수 있습니다 ReadingPane 또는 Outlook 2016 PreviewPane . 나는 ~와 갔다 PreviewPane 그러나 Outlook 2016 이상 버전에서만 사용할 수 있습니다.

    어려운 부분은 다음을 포함하는 올바른 interop 참조를 가져 오는 것이 었습니다. PreviewPane 특성. 일반적인 방법은 이전 어셈블리 참조를 제거하고 COM 탭에서 개체 라이브러리를 추가하는 것이지만 GAC 때문에 작동하지 않았고 GAC를 성공적으로 우회하는 방법을 찾을 수 없었습니다. 나는 재산에 접근하기 위해 후기 바인딩을 사용하게되었다.

    아래에 전체 코드를 게시하면 온라인에서 찾은 다른 모든 답변이 구식이거나 이해/복제하기에 충분한 정보가 없기 때문에 동일한 문제를 가진 다른 사람에게 도움이되기를 바랍니다.

    public void GetSelected(Office.IRibbonControl control)
    {
        Document document = null;
        // mail in new window
        if (control.Context is Inspector inspector)
        {
            document = inspector.WordEditor;
        }
        // mail in reading pane
        else if (control.Context is Explorer explorer)
        {
            try
            {
                // late binding for Explorer.PreviewPane.WordEditor
                Type eType = explorer.GetType();
                var pane = eType.InvokeMember(
                    "PreviewPane",
                    BindingFlags.GetProperty,
                    null, explorer, new object[] { });
                Type pType = pane.GetType();
                document = pType.InvokeMember(
                    "WordEditor",
                    BindingFlags.GetProperty,
                    null, pane, new object[] { }) as Document;
            }
            catch
            {
                MessageBox.Show("Require Outlook 2016 or newer");
                return;
            }
        }
        // get right clicked hyperlink from document
        if (document != null && document.Windows != null && document.Windows.Count > 0)
        {
            Microsoft.Office.Interop.Word.Selection selection = document.Windows[1].Selection;
            if (selection != null && selection.Hyperlinks != null && selection.Hyperlinks.Count > 0)
            {
                Hyperlink hyperlink = selection.Hyperlinks[1];
                // the right clicked hyperlink
                MessageBox.Show(hyperlink.Address);
            }
            else
            {
                MessageBox.Show("No selection or hyperlink");
            }
        } 
        else
        {
            MessageBox.Show("No document");
        }
    }
    
    

    참고로이 솔루션에 도달하기 위해 시도한 내용에 대한 자세한 정보가있는 MSDN에 대한 또 다른 게시물이 있습니다.

  • 이전 perl - @INC에서 URI/Encodepm을 찾을 수 없습니다Centreon
  • 다음 swagger - 자바 스프링 부트 openapi 3 - requestbody에 대한 설명을 추가하는 방법은 무엇입니까?