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互操作。
快速指南:
然后您可以执行以下代码:
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)