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

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

ログ内検索
  • キーワードを複数指定する場合は 半角スペース で区切ってください。
  • 検索条件は、(AND)=[A かつ B] (OR)=[A または B] となっています。
  • [返信]をクリックすると返信ページへ移動します。
キーワード/ 検索条件 /
検索範囲/ 強調表示/ ON (自動リンクOFF)
結果表示件数/ 記事No検索/ ON
大文字と小文字を区別する

No.47870 の関連記事表示

<< 0 >>
■47870  Ownerを設定したときのタスクバー表示の挙動について
□投稿者/ tako -(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プロパティを正しく使っていないことは分かっているのですが、この方法しか思いつかないもので・・・。


    はじめての質問で、至らない点もあると思いますがどうぞよろしくお願いします。
親記事 /過去ログ81より / 関連記事表示
削除チェック/

■47873  Re[1]: Ownerを設定したときのタスクバー表示の挙動について
□投稿者/ とっちゃん -(2010/03/16(Tue) 22:36:06)
>
    No47870 (tako さん) に返信

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

    要件満たせるのか?はわかりませんが。
記事No.47870 のレス /過去ログ81より / 関連記事表示
削除チェック/

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


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

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

    後ろに配置したフォームはタスクバーに表示させたくなく、前面のメインフォームのみタスクバーに表示させたいのですが・・・。良い方法はありませんでしょうか?
記事No.47870 のレス /過去ログ81より / 関連記事表示
削除チェック/

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

    力技なので、良い方法とは言えないかも知れませんが、
    ITaskbarList の AddTab / DeleteTab メソッドを使うことで、
    任意のウィンドウをタスクバーに表示/削除できます。
    http://msdn.microsoft.com/en-us/library/bb774652.aspx
記事No.47870 のレス /過去ログ81より / 関連記事表示
削除チェック/

■47879  Re[4]: Ownerを設定したときのタスクバー表示の挙動について
□投稿者/ 魔界の仮面弁士 -(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
記事No.47870 のレス /過去ログ81より / 関連記事表示
削除チェック/

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

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

    ITaskbarListの使い方を自分なりに調べたのですが、まだまだ未熟なので使い方がよくわかりません。使用例を挙げてもらって恐縮ですが、それでもわかりません・・・。
    もしよかったら、もう少しわかりやすく説明していただけると非常に助かるのですが・・・
記事No.47870 のレス /過去ログ81より / 関連記事表示
削除チェック/

■47894  Re[6]: Ownerを設定したときのタスクバー表示の挙動について
□投稿者/ tako -(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>
記事No.47870 のレス /過去ログ81より / 関連記事表示
削除チェック/

■47876  Re[1]: Ownerを設定したときのタスクバー表示の挙動について
□投稿者/ 魔界の仮面弁士 -(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 は表示されない」という状態になりましたが、
    それでは不味いのでしょうか?
記事No.47870 のレス /過去ログ81より / 関連記事表示
削除チェック/

■47909  Re[2]: Ownerを設定したときのタスクバー表示の挙動について
□投稿者/ tako -(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にしても問題なくできました。
    もしわかる方がいましたら、コメントお願いします。
記事No.47870 のレス / END /過去ログ81より / 関連記事表示
削除チェック/



<< 0 >>

パスワード/

- Child Tree -