0

フォームがあり、ツリービューが含まれています。マウスがフォームの外でクリックされたときにメッセージを取得するにはどうすればよいですか (フォームを閉じることができます)? CaptureMouse を試しましたが、マウスがツリー内で動作しなくなりました。また、フォームの外側をクリックしても、MouseDown メッセージが表示されませんでした。

WM_NCACTIVATE の WndProc チェックを使用できません。これは、Excel アドイン内からこれを表示しているためです。Excel をクリックすると、Excel がこのメッセージの送信を停止します。

How do I ...の他の解決策は機能しません。私は試してみましたが、他の人も試したコメントから-そしてそれらは機能しません(回答としてマークされた回答を含む)。

ありがとう - デイブ

4

1 に答える 1

0

作業する Excel プラグイン コードがないため、これはテスト用の単なる例です。

私の考えは、タイマーを使用して、フォーム コントロールのいずれかにフォーカスがあるかどうかを確認することです。フォーカスがない場合は、フォームを閉じます。

最初にフォームでタイマーを宣言し、その間隔を 1 秒 (またはそれ以下) に設定して、このコードを追加します。

private void timer1_Tick(object sender, EventArgs e)
{
    if (this.Focused == true) return;
    if (AnyFocused(this) == false)
    {
        this.timer1.Stop();
        this.Close();
        // Application.Exit(); -- not recommended but...
    }
}

private bool AnyFocused(Control c)
{
    if (c.Focused == true) return true;
    foreach (Control x in c.Controls)
    {
        if (x.Focused == true) return true;
        if (x.Controls != null && x.Controls.Count > 0)
            return AnyFocused(x);
    }
    return false;
}

単純な winform アプリケーションで少しテストを行いましたが、動作しますが、条件 (Excel プラグイン) は大きく異なる可能性があります。お知らせ下さい。

于 2012-11-19T22:11:21.810 に答える