如何使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 PIA。
不要像模拟真实用户一样通过向Outlook(或任何其他外部应用程序)发送按键来控制它。
对于Outlook,您可以使用COM互操作。
快速指南:
- 启动一个新项目,例如控制台应用程序
- 打开"添加引用"对话框并选择"COM"选项卡
- 搜索Microsoft Outlook X对象库(其中X是版本)
- 添加对它的引用
- 将命名空间"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)在您打开顶部的窗口后