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

本文关键字:Outlook 何使 焦点 | 更新日期: 2023-09-27 18:24:51

在我的应用程序中,我试图让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关注按键。。。

我哪里错了?

谨致问候,Dean

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

看看这个问题,找到实现相同结果的不同方法。您还应该熟悉Outlook PIA。

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

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

快速指南:

  1. 启动一个新项目,例如控制台应用程序
  2. 打开"添加引用"对话框并选择"COM"选项卡
  3. 搜索Microsoft Outlook X对象库(其中X是版本)
  4. 添加对它的引用
  5. 将命名空间"Microsoft.Office.Interop.Outlook"添加到using子句中

然后您可以执行以下代码:

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);

尝试使用SendKeys.Send(^N)在您打开顶部的窗口后