3

私は何日も解決しようとしてきた問題を抱えていますが、うまくいきません!

私の Windows フォーム アプリケーションには、グリッドがあります。1 つの列には電子メール アドレスが含まれます。ユーザーがこの列をダブルクリックしたときに、Outlook オートメーションを介して新しい電子メール ウィンドウを開きたいと考えています。このウィンドウにはフォーカスがあり、ユーザーがすぐに入力できるようにする必要があります。

次の場合、すべてが正常に機能します。

  • Visual Studio からアプリを実行しています。
  • または、私のアプリにフォーカスがあります。

ただし、.exe を実行、列をダブルクリックしたときに Outlook にフォーカスがあると、次のようになります。

  • 新しいメールウィンドウが期待どおりに開きます
  • 新着メールウィンドウでカーソルが点滅する(予想通り)
  • ユーザーが入力を開始すると、カーソルは引き続き Outlook で点滅します、入力したテキストは Outlook ではなくアプリケーションのグリッドに表示されます。

テキストボックスがある単純なフォームで問題を再現できました。

次のコードを使用します。

private void textBox1_MouseDoubleClick(object sender, MouseEventArgs e)
{
 OpenOutlookMail(textBox1.Text);
}

private void OpenOutlookMail(string to)
{
  MailItem item = OutlookApp.CreateItem(OlItemType.olMailItem) as MailItem;
  item.To = to;
  item.Subject = string.Empty;
  item.Body = string.Empty;

  item.Display();
}

protected Application OutlookApp
{
    get
    {
        if (mOutlookApp == null)
        {
            mOutlookApp = new Application();

        }
        return mOutlookApp;
     }
  }

私がすでに試したことは

  • OpenOutlookMail を呼び出す前に、this.Activate() を介して現在のフォームをアクティブ化します。
  • MailItem Inspector オブジェクトをアクティブ化する
  • オートメーションを介して Outlook の ActiveWindow と ActiveExplorer をアクティブ化する
  • ここで説明されている AutoIt の使用MSDN フォーラムの MS Word に関する同様の問題

どんな助けでも大歓迎です!

4

3 に答える 3

3

textBox1_MouseDoubleClick(...)メソッドで優先度の低いDispatcher.BeginInvoke(...)を使用して、OpenOutlookMail()を呼び出すことができます。多くの場合、このようなフォーカス管理の問題を回避するのに役立ちます。

于 2013-02-21T12:01:46.310 に答える
3

少し前に、バックグラウンド ウィンドウのフォーカスについて書きました。

http://blog.sebastianbrand.com/2010/02/activate-form-in-background.html

private void label1_Click(object sender, EventArgs e)
{
  // mainform.BringToFront(); // doesn't work
  BeginInvoke(new VoidHandler(OtherFormToFront));
}

delegate void VoidHandler();

private void OtherFormToFront()
{
  mainform.BringToFront(); // works
}

不良ウィンドウのハンドルがある場合は、試してみてください。

于 2013-02-26T07:58:00.190 に答える
1

あなたのコードで問題を再現できませんでした。私は Microsoft.Office.Interop.Outlook バージョン 14.0.0.0 を使用しており、実行したすべてのテストでメール ウィンドウがフォーカスされます。

あなたが述べているように、

次の場合、すべて正常に動作します。 • Visual Studio からアプリを実行しています。•<strong>または、アプリにフォーカスがあります。

メールウィンドウを開く前に、フォームにフォーカスしたり、アプリケーションをスリープ状態にしたりすることでうまくいくかもしれません。

private void textBox1_MouseDoubleClick(object sender, MouseEventArgs e)
{
    this.Focus();
    System.Threading.Thread.Sleep(500);
    OpenOutlookMail(textBox1.Text);
}

相互運用性はしばしば奇妙な動作をします。:s

于 2013-02-21T15:11:51.430 に答える