2011-11-11 9 views
1

私のアプリケーションにはメインフォームがありません。初期化はProgram.Main()で行われ、Application.Run()が呼び出されます。ダイアログを表示して閉じると、Win32 GetForegroundWindow()はそのウィンドウを返します。

ユーザーは、彼らが自分のアプリケーションで次のようにトリガーキーボードショートカットを押して別のアプリケーションである:

  1. は私のフォームをインスタンス化します。
  2. フォームを表示します。
  3. win32 API GetForegroundWindow()を呼び出して、どのウィンドウがアクティブであるかを調べます。
  4. いくつかのことをしてください。
  5. コールform.Close()
  6. 設定フォーム= nullを

私は数回の上に実行することができ、すべてが順調です。しかし、私のアプリケーションがいつでもMessageBox()を呼び出すと、その後のすべてのGetForegroundWindow()の呼び出しは、現在のフォーカスが別のアプリケーションにある場合でも閉じられたフォームを返します。これは、CredUIPromptForCredentials()がユーザーにログインとパスワードの入力を求めた場合にも発生します。 ProcessInfo.GetActiveProcess()の呼び出しは、フォーカスを持つ他のアプリではなく、自分のプロセスを返します。

私は間違っていると思いますか?私のアプリからフォーカスを削除するために呼び出すことができるものがありますか? SetForeGroundWindowの逆の種類ですか?

EDIT 1

それは実際に非モーダルフォーム、ないダイアログです。私はフォームを表示する引数なしでShow()を使用しています。 Close()の後にDispose()を呼び出してみましたが、動作は同じです。私は自分のフォームにShow()を呼び出さないと、このアプリケーションが正しく動作することを確認しました。フォームには、タイトルを変更する以外はVS2010で作成したときのデフォルト値がすべてあります。フォームにはラベルが1つしかありません。 Form.Closeからドキュメント当たり

+0

これは何が起こっているのですか? – user957902

+0

Windows 7 64ビット –

答えて

0

:(1)それがマルチドキュメントインターフェイス(MDI)アプリケーションの一部であり、フォームがある場合

フォームを閉じる上に配置されていない2つの条件があります目に見えない; (2)ShowDialogを使用してフォームを表示したこと。このような場合、ガベージコレクションのためにフォームのすべてのコントロールをマークするには、Disposeを手動で呼び出す必要があります。

私はあなたのフォームがタイトルで言及されているので、ダイアログであると推測しています。 Win32リソースの割り当てを解除するために、Disposeを明示的に呼び出す必要があるようです。

+0

答えをありがとう。あなたの提案を試した結果は私の質問です。 –

+0

モーダルダイアログではないので、これは当然適用されません。 – user957902

関連する問題