如何使Outlook成为焦点并在C#中发送键击?

时间:2012-02-16 00:44:22

标签: c# .net

在我的应用程序中,我正在尝试将Outlook 2010置于焦点并向其发送CTRL-N(新电子邮件)。

我已经尝试了很多不同的ShowWindow,FindWindow,SetFocus,SetForegroundWindow和SendMessage迭代,但似乎无法使它们中的任何一个工作。

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

    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集中精力来获得击键......

我哪里错了?

此致 迪安

3 个答案:

答案 0 :(得分:1)

查看this问题,了解实现相同结果的不同方法。您还应该熟悉Outlook PIA

答案 1 :(得分:1)

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

对于Outlook,您可以使用COM interop

快速指南:

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

    var application = new Application();
    var mail = (_MailItem) application.CreateItem(OlItemType.olMailItem);
    
    mail.To = "anonymous@somedomain.com";
    // ... other mail properties ...
    
    mail.Display(true);
    

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

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

    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);
        //...
    }
    

    我们将收到我们在收件箱中找到的第一封邮件:

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

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

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

    正如您所看到的,这与创建新电子邮件非常相似。

    回复一切都同样简单:

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

答案 2 :(得分:-1)

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