2012-02-16 4 views
1

私のアプリケーションでは、Outlook 2010にフォーカスを合わせて、CTRL-N(新しい電子メール)を送信しようとしています。どのようにOutlookにフォーカスを合わせ、C#でキーストロークを送信しますか?

私は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

あなたは、ウイルスのいくつかの並べ替えを書いていますか? – BoltBait

+3

私はこのコードがうまくいかないかもしれないという私の頭の上から5つの理由を考えることができます。したがって、その他の理由から、これは実際に.NETアプリケーションから電子メールを送信する最良の方法ではありません。 'System.Net.Mail'名前空間を調査し、より良い選択肢が見つからないかどうか確認してください。 –

+0

私は実際に電子メールを送信したくない、単に新しい電子メールウィンドウを開く。私はいくつかの音声認識のものに取り組んでいますし、アプリケーションが他の多くのことをやりたい、新しい電子メールウィンドウを開くことは一つの例にすぎません。 –

答えて

1

は、同じ結果を達成するための異なるアプローチのためのthis質問を見てください。 Outlook PIAにも慣れておく必要があります。あなたが実際のユーザーをシミュレートしているかのように

+0

私はそれを以前から見てきましたが、新しいメッセージを送信するためにはおそらく動作しますが、それは私がやろうとしていることの始まりに過ぎず、返信、返信、転送などもしたい 私はIPAのおかげで読んだことありがとう:) –

-1

あなたがトップ

+0

問題は窓を上に持ってきている...私はそれを働かせることができない。 –

+0

これを見てください: '[DllImport(" User32.dll "、EntryPoint =" SetForegroundWindow ")] public static extern bool SetForegroundWindow(IntPtr hWnd); ' – trebor

+0

はい、私はそれを見て、それは正常に動作しますメモ帳、電卓、その他のほとんどのプログラムはOutlook用ではありません...私は子供のウィンドウと何か関係があると思われ始めています... –

1

にあなたの窓を持った後、それを送信して、Outlook(または他の外部アプリケーション)を制御しようとしないでくださいSendKeys.Send(^ N)を使用してみてくださいキーストローク。

Outlookの場合、COM interopを使用できます。

クイックガイド:

    は、新しいプロジェクト、例えばコンソールアプリケーションを起動し
  1. オープン[参照の追加]ダイアログおよびCOMタブに(Xはバージョン)Microsoft OutlookのXオブジェクトライブラリの
  2. 検索]を選択
  3. はそれへの参照を追加します。
  4. using節に "Microsoft.Office.Interop.Outlook"という名前空間を追加します。

あなたは、次のコードを実行することができます。

var application = new Application(); 
var mail = (_MailItem) application.CreateItem(OlItemType.olMailItem); 

mail.To = "[email protected]"; 
// ... other mail properties ... 

mail.Display(true); 

まずあなたは新しいOutlookアプリケーションを起動します。次に、新しいメールアイテム(_MailItem)を作成します。このオブジェクトを使用して、送信する電子メール(送信先、送信先、送信先など)を設定し、その表示(...)メソッドを呼び出して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); 

ご覧のとおり、これは新しい Eメール。

Aは、すべてが同じように簡単です返信:

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

ありがとうクリストフ、それは新しいメッセージのために働く...あなたは知っていますか?このライブラリを使用して、返信や返信のようなイベントを呼び出すことができますか? –

+0

はい問題ありません。私は私の答えを更新し、いくつかのサンプルコードが含まれています。 –

関連する問題