关于.net:如何使Outlook成为焦点并以C#发送它的击键?

How do you bring Outlook into focus and send it keystrokes in C#?

在我的应用程序中,我试图使Outlook 2010成为焦点,并向其发送CTRL-N(新电子邮件)。

我尝试了ShowWindow,FindWindow,SetFocus,SetForegroundWindow和SendMessage的许多不同迭代,但似乎无法使它们工作。

它适用于记事本,但不适用于Outlook ...我的代码是:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
    using System.Runtime.InteropServices;
    using System.Diagnostics;

    const int kKeyDown = 0x0100;
    const int kKeyUp = 0x0101;
    const int kCtrl = 0x11;
    const int kN = 0x4e;

    Process[] prcOutlook = System.Diagnostics.Process.GetProcesses();
      foreach (System.Diagnostics.Process prcTempProc in prcOutlook)
      {
          if (prcTempProc.ProcessName =="OUTLOOK")
          {
              IntPtr windowToFind = prcTempProc.MainWindowHandle;
              if (ShowWindow(windowToFind, 1))
              {
                  SetFocus(wHndle);
                  int result = SendMessage(windowToFind, kKeyDown, kCtrl, 0);
                  result = SendMessage(windowToFind, kKeyDown, kN, 0);
                  result = SendMessage(windowToFind, kKeyUp, kCtrl, 0);
                  result = SendMessage(windowToFind, kKeyUp, kN, 0);
              }
          }
      }

    [DllImport("user32.dll")]
    [return: MarshalAs(UnmanagedType.Bool)]
    static extern bool ShowWindow(IntPtr hWnd, int nCmdShow);

代码运行良好,它从未使Outlook专注于获得击键...

我要去哪里错了?

关于,
院长


不要像发送模拟用户一样尝试通过发送击键来控制Outlook(或任何其他外部应用程序)。

对于Outlook,您可以使用COM互操作。

快速指南:

  • 启动一个新项目,例如一个控制台应用程序。
  • 打开"添加引用"对话框,然后选择" COM"选项卡
  • 搜索Microsoft Outlook X对象库(其中X是版本)
  • 添加对其的引用。
  • 将名称空间" Microsoft.Office.Interop.Outlook"添加到您的using子句。
  • 然后您可以执行以下代码:

    1
    2
    3
    4
    5
    6
    7
    var application = new Application();
    var mail = (_MailItem) application.CreateItem(OlItemType.olMailItem);

    mail.To ="[email protected]";
    // ... other mail properties ...

    mail.Display(true);

    首先,您启动一??个新的Outlook应用程序。然后,您创建一个新的邮件项目(_MailItem)。使用此对象可以配置要发送(到,从,主题等)的电子邮件,然后调用其Display(...)方法以显示Outlook新邮件编辑器窗口。

    如果要从收件箱中检索电子邮件,请执行以下代码:

    1
    2
    3
    4
    5
    6
    7
    8
    var ns = application.GetNamespace("MAPI");
    MAPIFolder inbox = ns.GetDefaultFolder(OlDefaultFolders.olFolderInbox);
    for (int i = 1; i <= inbox.Items.Count; i++)
    {
        var item = (MailItem) inbox.Items[i];
        Console.WriteLine("Subject: {0}", item.Subject);
        //...
    }

    让我们来看看我们在收件箱中找到的第一封邮件:

    1
    var mailItem = (MailItem) inbox.Items[1];

    然后您可以按以下方式回复发件人:

    1
    2
    var reply = mailItem.Reply();
    reply.Display(true);

    如您所见,这与创建新电子邮件非常相似。

    全部答复同样简单:

    1
    2
    var replyAll = mailItem.ReplyAll();
    replyAll.Display(true);


    看看这个问题,寻找获得相同结果的另一种方法。您还应该熟悉Outlook PIA。


    将窗口置于顶部后,尝试使用SendKeys.Send(^ N)