首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >VB .NET Outlook 2016加载项主题行

VB .NET Outlook 2016加载项主题行
EN

Stack Overflow用户
提问于 2017-07-20 22:41:07
回答 1查看 600关注 0票数 0

我正在使用Visual Studio 2015为Outlook 2016编写一个外接程序。我在内置的New Mail选项卡中添加了一个按钮。当点击时,它会在主题行的末尾添加"unencrypt“一词,然后发送电子邮件。

只要用户在输入主题后跳出了主题行字段,这就可以很好地工作。但如果你输入主题,然后立即点击按钮,它会清除主题行,并将其替换为"unencrypt“。

但是,当我单步执行debug时,它工作得很好-即使我没有跳出主题行,它也会保留现有的文本。我认为在更新邮件项的Subject属性时会有一些延迟,但我手动输入了20秒的延迟,如果我没有在调试中单步执行,它仍然会清除主题行。

我现在有点不知所措。有没有办法检查主题行文本框本身?或者其他一些方法来抓取文本,即使用户还没有退出?

任何帮助都将不胜感激!

代码语言:javascript
复制
Private Sub Button1_Click(sender As Object, e As RibbonControlEventArgs) Handles Button1.Click
    ' Get the Application object
    Dim application As Outlook.Application = Globals.ThisAddIn.Application

    ' Get the active Inspector object and check if is type of MailItem
    Dim inspector As Outlook.Inspector = application.ActiveInspector()
    Dim mailItem As Outlook.MailItem = TryCast(inspector.CurrentItem, Outlook.MailItem)
    If mailItem IsNot Nothing Then
        If mailItem.EntryID Is Nothing Then
            If Not IsNothing(mailItem.Subject) AndAlso ((mailItem.Subject.Contains(" unencrypt")) OrElse (mailItem.Subject.Contains("unencrypt "))) Then
                mailItem.Subject = mailItem.Subject
            'ElseIf IsNothing(mailItem.Subject) Then
                'System.Threading.Thread.Sleep(20000)
                'mailItem.Subject = mailItem.Subject + " unencrypt"
            Else
                mailItem.Subject = mailItem.Subject + " unencrypt"
            End If
            If Not IsNothing(mailItem.To) AndAlso mailItem.To.ToString().Trim <> "" Then
                mailItem.Send()
            Else
                MessageBox.Show("We need to know who to send this to. Make sure you enter at least one name.", "Microsoft Outlook", MessageBoxButtons.OK, MessageBoxIcon.Exclamation, MessageBoxDefaultButton.Button1)
            End If
        End If
    End If
End Sub

编辑:Dmitry的回答满足了我的需求,但对于其他不熟悉Windows API的人,我添加了下面的代码,然后简单地从我的原始代码调用GetSubject函数,而不是使用mailItem.Subject属性。

代码语言:javascript
复制
<DllImport("user32.dll", SetLastError:=True, CharSet:=CharSet.Auto)> _
Private Shared Function FindWindowEx(ByVal parentHandle As IntPtr, _
                                        ByVal childAfter As IntPtr, _
                                        ByVal lclassName As String, _
                                        ByVal windowTitle As String) As IntPtr
End Function
<DllImport("user32.dll", SetLastError:=True, CharSet:=CharSet.Auto)> _
Private Shared Function FindWindow(ByVal lclassName As String, _
                                    ByVal lWindowName As String) As IntPtr
End Function
<DllImport("user32.dll", SetLastError:=True, CharSet:=CharSet.Auto)> _
Private Shared Function GetWindowText(ByVal hWnd As IntPtr, _
                                        ByVal lpString As StringBuilder, _
                                        ByVal nMaxCount As Integer) As Integer
End Function
<DllImport("user32.dll", SetLastError:=True, CharSet:=CharSet.Auto)> _
Private Shared Function GetWindowTextLength(ByVal hwnd As IntPtr) As Integer
End Function

Private Function GetSubject(inspector As Outlook.Inspector) As String
    Try
        Dim inspectorHandle As IntPtr = FindWindow("rctrl_renwnd32", inspector.Caption)
        Dim windowLevel2Handle As IntPtr = FindWindowEx(inspectorHandle, IntPtr.Zero, "AfxWndW", "")
        Dim windowLevel3Handle As IntPtr = FindWindowEx(windowLevel2Handle, IntPtr.Zero, "AfxWndW", "")
        Dim windowLevel4Handle As IntPtr = FindWindowEx(windowLevel3Handle, IntPtr.Zero, "#32770", "")
        Dim SubjectHandle As IntPtr = FindWindowEx(windowLevel4Handle, IntPtr.Zero, "Static", "S&ubject")
        Dim SubjectTextBoxHandle As IntPtr = FindWindowEx(windowLevel4Handle, SubjectHandle, "RichEdit20WPT", "")
        Dim length As Integer = GetWindowTextLength(SubjectTextBoxHandle)
        Dim sb As New StringBuilder(length + 1)
        GetWindowText(SubjectTextBoxHandle, sb, sb.Capacity)

        Return sb.ToString()
    Catch
        Return ""
    End Try

End Function
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-07-20 23:59:29

重要的部分是,主题编辑框需要失去焦点,以便OOM能够意识到更改。

您可以使用辅助功能API或原始Windows API来访问编辑框的内容,也可以尝试将焦点放在某些其他检查器控件上,如邮件正文编辑器。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45217924

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档