DOBON.NET DOBON.NETプログラミング掲示板過去ログ

Alt+Tabで選択不可のフォームの作成

環境/言語:[VB2005]
分類:[.NET]

いつも参考にさせていただいております。
すみませんが教えていただきたいことがあります。

現在画面に複数のフォームを表示するアプリを作成しております。
スタートアップフォーム(Form1)のButton1をクリックすると
Form2が表示されるようにしているのですが、エクスプローラーの
Alt+TabでFrom1もFrom2もリストに出てきています。

Form2のプロパティは
ShowInTaskbar=False
ShowIcon=False
以外は規定値です。

Form2の表示は
Dim fm as New Form2
fm.Show()
で行っております。

Alt+Tabを押してもリストにForm2を表示しないようにするには
どのようにすれば良いか ご教授お願いいたします。
■No15021に返信(ぷっぷさんの記事)
> Alt+Tabを押してもリストにForm2を表示しないようにするには
> どのようにすれば良いか ご教授お願いいたします。

Owner を Form1 のインスタンスに指定すれば Form1 のみが表示されます。

................................................................................................................
じゃんぬ - Microsoft MVP for Visual Developer C#
  C#, VB.NET 入門  http://jeanne.wankuma.com/
  じゃんぬねっと日誌 http://blogs.wankuma.com/jeanne/
2006/03/26(Sun) 03:07:30 編集(投稿者)

■No15022に返信(じゃんぬねっとさんの記事)
> ■No15021に返信(ぷっぷさんの記事)
>>Alt+Tabを押してもリストにForm2を表示しないようにするには
>>どのようにすれば良いか ご教授お願いいたします。
>
> Owner を Form1 のインスタンスに指定すれば Form1 のみが表示されます。
>

ありがとうございます。

Dim fm As New Form2
fm.Show(Me)

としてAlt+Tabではアクティブなフォームしか表示されないようになりました。
常にForm2は10〜20ほど開いているのでAlt+Tabにアクティブなフォームしか
でなくなったので大変助かりました。
もしかして私のしたことはじゃんぬさんのおっしゃっていることと違いますか?
常にForm1しか(たとえForm2がアクティブでも)表示されないようになるのですか?

追記です><

Form1のShowInTaskbarをFalseにしたとたんに10個ひらいていたForm2がAlt+Tabの
リストに現れました><。
できればForm1もForm2もShowInTaskbar=Falseにしたいです。

私の作成中のアプリはデスクトップに付箋を貼るものでして、Form1が通知領域に常駐、Form2が付箋にあたります。Form1は設定などのフォームなのでタスクバーに
常にあっても邪魔だと思いShowInTaskbar=Falseとしています。
いつも参考にさせていただいております。

私なりに調べた結果をご報告させていただきます。
【やりたいこと】
1)Alt+Tab(タスクの切り替え)にForm2を表示したくない
2)Form2はForm1から複数作成される
3)Form2のFormBorderStyleはWindows.Forms.FormBorderStyle.Noneとしたい。
4)Form1、Form2のShowInTaskbarはFalseとしたい。

ここでじゃんぬねっとさんにアドバイスいただきForm2のOwnerをForm1にしてみました
私が上記3)と4)をお伝えしていなかったので、4)をした場合にAlt+Tabで
タスク切り替えリストに表示されてしまいました。
そこでいろいろ試してみまして、
Form2のFormBorderStyleをWindows.Forms.FormBorderStyle.SizableToolWindowと
するとタスク切り替えリストには表示されないことが分かりました。
1)、2)、4)は実現できましたが、3)を実現しながらは無理かと調べてみまして
Forms.CreateParamsをオーバーライドするかWin32APIのSetWindowLongを使用することで
なんとかなりそうだと分かりました。
しかし、Win32APIのウィンドウのボーダーを表示しない定数が分かりませんでした。
さらにオーバーライドはまだまだ未熟で使ったことがありません。
今後のことも考えオーバーライドを勉強しようと思いますが上記以外に良い方法が
ありましたらご教授お願いいたします。


■No15023に返信(ぷっぷさんの記事)
> 2006/03/26(Sun) 03:07:30 編集(投稿者)
>
> ■No15022に返信(じゃんぬねっとさんの記事)
>>■No15021に返信(ぷっぷさんの記事)
> >>Alt+Tabを押してもリストにForm2を表示しないようにするには
> >>どのようにすれば良いか ご教授お願いいたします。
>>
>>Owner を Form1 のインスタンスに指定すれば Form1 のみが表示されます。
>>
>
> ありがとうございます。
>
> Dim fm As New Form2
> fm.Show(Me)
>
> としてAlt+Tabではアクティブなフォームしか表示されないようになりました。
> 常にForm2は10〜20ほど開いているのでAlt+Tabにアクティブなフォームしか
> でなくなったので大変助かりました。
> もしかして私のしたことはじゃんぬさんのおっしゃっていることと違いますか?
> 常にForm1しか(たとえForm2がアクティブでも)表示されないようになるのですか?
>
> 追記です><
>
> Form1のShowInTaskbarをFalseにしたとたんに10個ひらいていたForm2がAlt+Tabの
> リストに現れました><。
> できればForm1もForm2もShowInTaskbar=Falseにしたいです。
>
> 私の作成中のアプリはデスクトップに付箋を貼るものでして、Form1が通知領域に常駐、Form2が付箋にあたります。Form1は設定などのフォームなのでタスクバーに
> 常にあっても邪魔だと思いShowInTaskbar=Falseとしています。
2006/03/27(Mon) 01:25:03 編集(投稿者)
自己レスです。

Form2にて

Protected Overrides ReadOnly Property CreateParams() As CreateParams
Get
Dim cp As CreateParams = MyBase.CreateParams
cp.ExStyle = &H80
Return cp
End Get
End Property

Private Sub Form2_Load(ByVal sender As Object, _
ByVal e As System.EventArgs) Handles Me.Load
Me.FormBorderStyle = Windows.Forms.FormBorderStyle.None
End Sub

上記のようにして何とか思いのようにできました。
しかし、cp.ExStyle = &H80と設定しているからかForm2のOpacityを変更しようと
すると例外がおきてしまいます。
cp.ExStyle = &H80のあたりをなんとかすればできるような気がしますので
がんばってみます。
ありがとうございました。

■No15027に返信(ぷっぷさんの記事)
> いつも参考にさせていただいております。
>
> 私なりに調べた結果をご報告させていただきます。
> 【やりたいこと】
> 1)Alt+Tab(タスクの切り替え)にForm2を表示したくない
> 2)Form2はForm1から複数作成される
> 3)Form2のFormBorderStyleはWindows.Forms.FormBorderStyle.Noneとしたい。
> 4)Form1、Form2のShowInTaskbarはFalseとしたい。
>
> ここでじゃんぬねっとさんにアドバイスいただきForm2のOwnerをForm1にしてみました
> 私が上記3)と4)をお伝えしていなかったので、4)をした場合にAlt+Tabで
> タスク切り替えリストに表示されてしまいました。
> そこでいろいろ試してみまして、
> Form2のFormBorderStyleをWindows.Forms.FormBorderStyle.SizableToolWindowと
> するとタスク切り替えリストには表示されないことが分かりました。
> 1)、2)、4)は実現できましたが、3)を実現しながらは無理かと調べてみまして
> Forms.CreateParamsをオーバーライドするかWin32APIのSetWindowLongを使用することで
> なんとかなりそうだと分かりました。
> しかし、Win32APIのウィンドウのボーダーを表示しない定数が分かりませんでした。
> さらにオーバーライドはまだまだ未熟で使ったことがありません。
> 今後のことも考えオーバーライドを勉強しようと思いますが上記以外に良い方法が
> ありましたらご教授お願いいたします。
>
>
> ■No15023に返信(ぷっぷさんの記事)
>>2006/03/26(Sun) 03:07:30 編集(投稿者)
>>
>>■No15022に返信(じゃんぬねっとさんの記事)
> >>■No15021に返信(ぷっぷさんの記事)
>>>>Alt+Tabを押してもリストにForm2を表示しないようにするには
>>>>どのようにすれば良いか ご教授お願いいたします。
> >>
> >>Owner を Form1 のインスタンスに指定すれば Form1 のみが表示されます。
> >>
>>
>>ありがとうございます。
>>
>>Dim fm As New Form2
>> fm.Show(Me)
>>
>>としてAlt+Tabではアクティブなフォームしか表示されないようになりました。
>>常にForm2は10〜20ほど開いているのでAlt+Tabにアクティブなフォームしか
>>でなくなったので大変助かりました。
>>もしかして私のしたことはじゃんぬさんのおっしゃっていることと違いますか?
>>常にForm1しか(たとえForm2がアクティブでも)表示されないようになるのですか?
>>
>>追記です><
>>
>>Form1のShowInTaskbarをFalseにしたとたんに10個ひらいていたForm2がAlt+Tabの
>>リストに現れました><。
>>できればForm1もForm2もShowInTaskbar=Falseにしたいです。
>>
>>私の作成中のアプリはデスクトップに付箋を貼るものでして、Form1が通知領域に常駐、Form2が付箋にあたります。Form1は設定などのフォームなのでタスクバーに
>>常にあっても邪魔だと思いShowInTaskbar=Falseとしています。
解決済み!

DOBON.NET | プログラミング道 | プログラミング掲示板