C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[2]: Ownerを設定したときのタスクバー表示の挙動について


(過去ログ 81 を表示中)

[トピック内 9 記事 (1 - 9 表示)]  << 0 >>

■47870 / inTopicNo.1)  Ownerを設定したときのタスクバー表示の挙動について
  
□投稿者/ tako (1回)-(2010/03/16(Tue) 21:41:55)

分類:[C#] 

開発環境 [Vista, VS2008, C#]

初めて質問をさせていただきます。よろしくお願いします。

現在Windowsフォームでアプリケーションを作っているのですが、あるフォーム(メインのフォーム)の後ろに常にもう一つのフォームを表示させたいので、Ownerプロパティを使ってそれを実現しています。後ろに表示されるフォームは、メインフォームより全面に出てほしくないのです。そこで、所有されるフォームのShowInTaskbarプロパティがtrueであっても、オーナーフォームの同プロパティがfalseであると、所有されるフォームがタスクバーに表示されなくて困っています。
たとえば、
FormA A = new FormA();
FormB B = new FormB();
B.AddOwnedForm(A);

として、BのShowInTaskbarをfalseにしたとき、AのShowInTaskbarがtrueであるにもかかわらず、Aはタスクバーに表示されない。

Bはタスクバーに表示されないようにしたく、Aはタスクバーに表示させたいのですが、それができなくて困っています。
オーナーを解除すれば表示されるのですが、それだとBが常にAの後ろに表示させることができなくなってしまいます。

この問題は、XPで確認しました。Vistaでは、このようなことは起こりませんでした。7や、XPより前のOSでは確認していません。


@オーナーが設定された状態でAのみタスクバーを表示させる
Aオーナーを設定しない状態で、Aの後ろに常にBを表示させる(そうすれば、Aだけをタスクバーに表示できるため)

このどちらかが満たせれば、良いと思っています。
Ownerプロパティを正しく使っていないことは分かっているのですが、この方法しか思いつかないもので・・・。


はじめての質問で、至らない点もあると思いますがどうぞよろしくお願いします。
引用返信 編集キー/
■47873 / inTopicNo.2)  Re[1]: Ownerを設定したときのタスクバー表示の挙動について
□投稿者/ とっちゃん (488回)-(2010/03/16(Tue) 22:36:06)
とっちゃん さんの Web サイト
No47870 (tako さん) に返信

オーナーウィンドウの後ろに配置したいのでしょうか?
であれば、難しいことをするよりも、後ろに配置したいウィンドウをオーナーウィンドウにしてしまえばいいのではないでしょうか?

要件満たせるのか?はわかりませんが。
引用返信 編集キー/
■47875 / inTopicNo.3)  Re[2]: Ownerを設定したときのタスクバー表示の挙動について
□投稿者/ tako (3回)-(2010/03/16(Tue) 22:57:43)
No47873 (とっちゃん さん) に返信
>
> オーナーウィンドウの後ろに配置したいのでしょうか?
> であれば、難しいことをするよりも、後ろに配置したいウィンドウをオーナーウィンドウにしてしまえばいいのではないでしょうか?


返信ありがとうございます。

説明が悪かったでしょうか。とっちゃん さんの言うとおり、後ろに配置したいウィンドウをオーナーにしています。そのとき、後ろのフォームのShowInTaskbarをfalseにしたとき、前面にあるメインフォーム(所有されるフォーム)のShowInTaskbarをtrueにしても、前面のフォームがタスクバーに表示されなくて困っています。

後ろに配置したフォームはタスクバーに表示させたくなく、前面のメインフォームのみタスクバーに表示させたいのですが・・・。良い方法はありませんでしょうか?
引用返信 編集キー/
■47876 / inTopicNo.4)  Re[1]: Ownerを設定したときのタスクバー表示の挙動について
□投稿者/ 魔界の仮面弁士 (1561回)-(2010/03/16(Tue) 23:18:16)
No47870 (tako さん) に返信
> FormA A = new FormA();
> FormB B = new FormB();
> B.AddOwnedForm(A);
> Bはタスクバーに表示されないようにしたく、Aはタスクバーに表示させたいのですが、それができなくて困っています。
(中略)
> この問題は、XPで確認しました。Vistaでは、このようなことは起こりませんでした。

手元の XP 環境で
  private void button1_Click(object sender, EventArgs e)
  {
      Form A = new Form() { Text = "A", ShowInTaskbar = true };
      Form B = new Form() { Text = "B", ShowInTaskbar = false };
      B.AddOwnedForm(A);

      A.Show();
      B.Show();
  }
というコードを実行したところ、「A はタスクバーに表示され、B は表示されない」という状態になりましたが、
それでは不味いのでしょうか?

引用返信 編集キー/
■47877 / inTopicNo.5)  Re[3]: Ownerを設定したときのタスクバー表示の挙動について
□投稿者/ 魔界の仮面弁士 (1562回)-(2010/03/16(Tue) 23:24:21)
No47875 (tako さん) に返信
> 良い方法はありませんでしょうか?

力技なので、良い方法とは言えないかも知れませんが、
ITaskbarList の AddTab / DeleteTab メソッドを使うことで、
任意のウィンドウをタスクバーに表示/削除できます。
http://msdn.microsoft.com/en-us/library/bb774652.aspx
引用返信 編集キー/
■47879 / inTopicNo.6)  Re[4]: Ownerを設定したときのタスクバー表示の挙動について
□投稿者/ 魔界の仮面弁士 (1563回)-(2010/03/16(Tue) 23:58:27)
No47877 (魔界の仮面弁士) に追記
> ITaskbarList の AddTab / DeleteTab メソッドを使うことで、
> 任意のウィンドウをタスクバーに表示 / 削除できます。

実装テスト。

  [ComImport]
  [InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
  [Guid("56FDF342-FD6D-11D0-958A-006097C9A090")]
  interface ITaskbarList
  {
      void HrInit();
      void AddTab([In] IntPtr hwnd);
      void DeleteTab([In] IntPtr hwnd);
      void ActivateTab([In] IntPtr hwnd);
      void SetActivateAlt([In] IntPtr hwnd);
  }

  [Guid("56FDF344-FD6D-11d0-958A-006097C9A090")]
  [ClassInterface(ClassInterfaceType.None)]
  [ComImport]
  internal class CTaskbarList { }


  private void button1_Click(object sender, EventArgs e)
  {
      // TextBox には、処理対象フォームの .Handle.ToInt32() を記述しておく。
      IntPtr hwnd = (IntPtr)Convert.ToInt32(textBox1.Text);

      ITaskbarList tl = (ITaskbarList)new CTaskbarList();
      tl.HrInit();

      if (checkBox1.Checked)
      {
          MessageBox.Show("タスクバーに追加します。");
          tl.AddTab(hwnd);
      }
      else
      {
          MessageBox.Show("タスクバーから削除します。");
          tl.DeleteTab(hwnd);
      }
      Marshal.ReleaseComObject(tl);
  }

http://msdn.microsoft.com/en-us/library/bb774652.aspx
http://msdn.microsoft.com/en-us/library/bb774638.aspx
http://msdn.microsoft.com/en-us/library/dd391692.aspx
http://msdn.microsoft.com/en-us/library/dd562040.aspx

引用返信 編集キー/
■47880 / inTopicNo.7)  Re[5]: Ownerを設定したときのタスクバー表示の挙動について
□投稿者/ tako (5回)-(2010/03/17(Wed) 00:30:42)
No47879 (魔界の仮面弁士 さん) に返信
> ■No47877 (魔界の仮面弁士) に追記
>>ITaskbarList の AddTab / DeleteTab メソッドを使うことで、
>>任意のウィンドウをタスクバーに表示 / 削除できます。
>
> 実装テスト。

返信ありがとうございます。
No47876 のようにやってみた結果、想定したとおりにできました。しかし、わたしの作っているアプリケーションでも同じようにしているはずなんですがなぜかできません。所有されるフォームを、Form1(プロジェクトがつかられるときに生成される最初のフォーム)にしているからでしょうか・・・?

ITaskbarListの使い方を自分なりに調べたのですが、まだまだ未熟なので使い方がよくわかりません。使用例を挙げてもらって恐縮ですが、それでもわかりません・・・。
もしよかったら、もう少しわかりやすく説明していただけると非常に助かるのですが・・・
引用返信 編集キー/
■47894 / inTopicNo.8)  Re[6]: Ownerを設定したときのタスクバー表示の挙動について
□投稿者/ tako (6回)-(2010/03/17(Wed) 15:47:06)
2010/03/17(Wed) 17:02:45 編集(投稿者)
2010/03/17(Wed) 17:02:35 編集(投稿者)

<pre><pre>■No47880 (tako さん) に追記
> No47876 のようにやってみた結果、想定したとおりにできました。しかし、わたしの作っているアプリケーションでも同じようにしているはずなんですがなぜかできません。所有されるフォームを、Form1(プロジェクトがつかられるときに生成される最初のフォーム)にしているからでしょうか・・・?
>
> ITaskbarListの使い方を自分なりに調べたのですが、まだまだ未熟なので使い方がよくわかりません。使用例を挙げてもらって恐縮ですが、それでもわかりません・・・。
> もしよかったら、もう少しわかりやすく説明していただけると非常に助かるのですが・・・


確かめたところ、Form1(プロジェクトが作られるときに生成される最初のフォーム)を所有されるフォームにすると、Form1が表示されなくなるようです。(XPで確認)

public partial class Form1 : Form
{
//コンストラクタは省略

private void buton1_Click(object sender, EventArgs e)
{
Form B = new Form() { Text = "B", ShowInTaskbar = false };
B.AddOwnedForm(this);

B.Show();
}
}


このようにすると、Form1のShowInTaskbarがtrueでもタスクバーに表示されなくなってしまいます。</pre></pre>
引用返信 編集キー/
■47909 / inTopicNo.9)  Re[2]: Ownerを設定したときのタスクバー表示の挙動について
□投稿者/ tako (7回)-(2010/03/17(Wed) 18:21:56)
2010/03/17(Wed) 18:22:41 編集(投稿者)
すみません。自己解決しました。とはいっても、いじっていたら偶然できたのですが。

public partial class FormB : Form
    {
        public FormB()
        {
            InitializeComponent();
        }

        protected override CreateParams CreateParams
        {
            get
            {
                CreateParams cp = base.CreateParams;
                cp.ExStyle = 0x80;
                return cp;
            }
        }
    }


---------------------

public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {            

            FormB B = new FormB() { Text = "B", ShowInTaskbar = true };
            B.AddOwnedForm(this);

            B.Show();

            this.Focus();

        }
    }



このようにしたら、ちゃんとForm1のみタスクバーに表示されました。
問題が解決したので万々歳なのですが、なぜこれで解決したのかすっきりしません。ウィンドウの拡張スタイルをWS_EX_TOOLWINDOW にしていることはわかるのですが・・・。  ちなみに、FormBのFormBorderStyleをNoneにしても問題なくできました。
もしわかる方がいましたら、コメントお願いします。

解決済み
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -