アクティブなウィンドウだけをタスクバーに表示
                                                         玄関へお回り下さい。
アクティブなウィンドウだけをタスクバーに表示する(2方法)      (195) (196)
Form1・Form2・Form3とNo.195のサンプルは Module1 を用意しておいて下さい。
  Module1に記入して下さい。

Option Explicit  
'SampleNo=195 WindowsXP VB6.0(SP5) 2002.08.26
'ウィンドウに関するデータを取得する(P59)
Private Declare Function GetWindowLong Lib "user32" _
  Alias "GetWindowLongA" (ByVal hwnd As Long, _
  ByVal nIndex As Long) As Long
'ウィンドウに関する属性を変更する(P60)
Private Declare Function SetWindowLong Lib "user32" _
  Alias "SetWindowLongA" (ByVal hwnd As Long, _
  ByVal nIndex As Long, ByVal dwNewLong As Long) As Long
'指定のウィンドウのサイズ、位置、Zオーダーを設定する(P100)
Private Declare Function SetWindowPos Lib "user32" _
  (ByVal hwnd As Long, ByVal hWndInsertAfter As Long, _
   ByVal x As Long, ByVal y As Long, ByVal cx As Long, _
   ByVal cy As Long, ByVal wFlags As Long) As Long

Private Const GWL_EXSTYLE = (-20)  '拡張ウィンドウスタイル(P61)
Private Const HWND_TOP = 0     'Zオーダーのトップに置く(P100)

Private Const SWP_NOMOVE = &H2   'サイズだけを変える(XとYは無視)(P101)
Private Const SWP_NOSIZE = &H1   'サイズを変えない(CXとCYは無視)(P101)
Private Const SWP_NOACTIVATE = &H10 'アクティブにしない(P101)
Private Const SWP_HIDEWINDOW = &H80 '再描画のとき、非表示に(P101)
Private Const SWP_SHOWWINDOW = &H40 '再描画のとき、再表示に(P101)

Private Const WS_EX_APPWINDOW = &H40000 'アイコン化時タスクバーに表示する(P50)

Public Sub DelTasklist(myForm As Form)
'タスクバーに表示しない
  Dim WStyle As Long
  Dim Result As Long
  '現在のスタイルを取得
  WStyle = GetWindowLong(myForm.hwnd, GWL_EXSTYLE)
  'それに拡張スタイルを付加する
  WStyle = WStyle And Not (WS_EX_APPWINDOW)
  'ウィンドウを非表示に
  Result = SetWindowPos(myForm.hwnd, HWND_TOP, 0, 0, 0, 0, _
       SWP_NOMOVE Or SWP_NOSIZE Or SWP_NOACTIVATE Or SWP_HIDEWINDOW)
  '新しいスタイルを設定
  Result = SetWindowLong(myForm.hwnd, GWL_EXSTYLE, WStyle)
  'ウィンドウを再描画
  Result = SetWindowPos(myForm.hwnd, HWND_TOP, 0, 0, 0, 0, _
       SWP_NOMOVE Or SWP_NOSIZE Or SWP_NOACTIVATE Or SWP_SHOWWINDOW)
End Sub

Public Sub AppTasklist(myForm As Form)
'タスクバーに表示する
  Dim WStyle As Long
  Dim Result As Long
  '現在のスタイルを取得
  WStyle = GetWindowLong(myForm.hwnd, GWL_EXSTYLE)
  'それに拡張スタイルを付加する
  WStyle = WStyle Or WS_EX_APPWINDOW
  'ウィンドウを非表示に
  Result = SetWindowPos(myForm.hwnd, HWND_TOP, 0, 0, 0, 0, _
       SWP_NOMOVE Or SWP_NOSIZE Or SWP_NOACTIVATE Or SWP_HIDEWINDOW)
  '新しいスタイルを設定
  Result = SetWindowLong(myForm.hwnd, GWL_EXSTYLE, WStyle)
  'ウィンドウを再描画
  Result = SetWindowPos(myForm.hwnd, HWND_TOP, 0, 0, 0, 0, _
       SWP_NOMOVE Or SWP_NOSIZE Or SWP_NOACTIVATE Or SWP_SHOWWINDOW)
End Sub

Public Sub
AppTasklist2(myForm As Form)
'タスクバーに表示する
  Dim WStyle As Long
  Dim Result As Long
  '現在のスタイルを取得
  WStyle = GetWindowLong(myForm.hwnd, GWL_EXSTYLE)
  'それに拡張スタイルを付加する
  WStyle = WStyle Or WS_EX_APPWINDOW
  'ウィンドウを非表示に
  myForm.Hide
  '新しいスタイルを設定
  Result = SetWindowLong(myForm.hwnd, GWL_EXSTYLE, WStyle)
  'ウィンドウを再描画
  myForm.Show
End Sub


Form1に記入して下さい。
Option Explicit   'SampleNo=195 WindowsXP VB6.0(SP5) 2002.08.25
Private Sub Form_Activate()
  AppTasklist Me
End Sub

Private Sub Form_Deactivate()
'最小化した場合どのようにするか設定
  If Me.WindowState <> vbMinimized Then
    DelTasklist Me 'タスクバーに表示する
  Else
   'Me.WindowState = vbNormal '最小にしない
   'AppTasklist2 Me '最小化したのを元に戻さないと他をアクティブに出来ない
  End If
End Sub

Private Sub Form_Load()
  Form2.Show
  Form3.Show
End Sub

Private Sub Form_Unload(Cancel As Integer)
  Dim myObject As Object
  For Each myObject In Forms
    Unload myObject
    Set myObject = Nothing
  Next
  Unload Me
End Sub


Form2・Form3に記入して下さい。
Option Explicit

Private Sub Form_Activate()
  AppTasklist Me
End Sub

Private Sub Form_Deactivate()
'最小化した場合どのようにするか設定
  If Me.WindowState <> vbMinimized Then
    DelTasklist Me 'タスクバーに表示する
  Else
   'Me.WindowState = vbNormal '最小にしない
   'AppTasklist2 Me '最小化したのを元に戻さないと他をアクティブに出来ない
  End If
End Sub

 
上記方法は、最小化した場合、元に戻せません。従って最小化した場合どのようにするかで設定を
上記のようにする必要があります。
   ITaskbarListを使う方法
'別途 プロジェクト→参照設定→ITaskbarList.tlb に参照設定して下さい 
 TaskbarList.tlbは下記アドレスからDLして下さい。
 http://www.msjogren.net/dotnet/eng/samples/vb6_taskbarlist.asp
  taskbarlist.zip 
の中に入ってます。

Option Explicit  
'SampleNo=196 WindowsXP VB6.0(SP5) 2002.08.27
Private Sub Form_Activate()
  Dim objTaskbar As New TaskbarList
  'タスクバー・リスト・オブジェクトを初期化します
  objTaskbar.HrInit
  'タスクバー上のアイテムを表示します(ウィンドウはアクティブになりません)
  objTaskbar.AddTab Me.hWnd
  objTaskbar.ActivateTab Me.hWnd 'ウィンドウをアクティブにします。
  Set objTaskbar = Nothing    '参照を解放
End Sub

Private Sub
Form_Deactivate()
  Dim objTaskbar As New TaskbarList
  objTaskbar.HrInit
  objTaskbar.DeleteTab Me.hWnd  'タスクバーから削除
  Set objTaskbar = Nothing
End Sub

Private Sub Form_Load()
  '別途 プロジェクト→参照設定→ITaskbarList.tlb に参照設定して下さい
  Form2.Show
  Form3.Show
End Sub


Form2とForm3の両方に記入して下さい。
Option Explicit
Private Sub Form_Activate()
  Dim objTaskbar As New TaskbarList
  objTaskbar.HrInit
  objTaskbar.AddTab Me.hWnd
  objTaskbar.ActivateTab Me.hWnd
  Set objTaskbar = Nothing
End Sub

Private Sub Form_Deactivate()
  Dim objTaskbar As New TaskbarList
  objTaskbar.HrInit
  objTaskbar.DeleteTab Me.hWnd
  Set objTaskbar = Nothing
End Sub

ITaskbarListを使う方法で実現 サンプルを見た時には、これは複雑と思い、手を付けなかったが
MS さんにアドバイスを受けながら解析してみると、なんと簡単に実現できました。
(掲示板のログNo.211〜225にかけてを参照)
   





2003/05/11