在我的应用程序中,我正在尝试将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集中精力来获得击键......
我哪里错了?
此致 迪安
答案 0 :(得分:1)
查看this问题,了解实现相同结果的不同方法。您还应该熟悉Outlook PIA。
答案 1 :(得分:1)
不要试图通过发送击键来控制Outlook(或任何其他外部应用程序),就像模拟真实用户一样。
对于Outlook,您可以使用COM interop。
快速指南:
然后,您可以执行以下代码:
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)