[リストへもどる]
一括表示

投稿時間:2004/08/07(Sat) 14:49
投稿者名:とも
Eメール:
URL :
タイトル:
タスクバーに消したはずのアイコンが残る

初めて投稿させていただきます。
vb6(sp5) Xp homeにて開発しています。
うまくいかない原因がつかめず困っています。なんでもよいのでご意見いただけたら助かります。

フォームを5つ持ち、フォーム1から5、5から1へ遷移可能な画面を作成しています。
各フォームはvbmodalでshowしています。
フォーム1から5へ遷移する場合、移動元を非表示にしています。
(例えば、フォーム2から3へ遷移するとき、フォーム2および、フォーム2のタスクバーのアイコンを非表示にしています。
つまり、ウィンドウズ上にはひとつのフォームおよびタスクバーにひとつのアイコンのみ表示ということです。
フォーム3から2へ遷移する場合は、フォーム3をunloadしています。)

現状、フォーム2から3へ遷移する場合に10回に1回ぐらい(出る頻度ばらばら)で、
フォーム2のアイコンがタスクバーに残ってしまう現象が出ています。

この現象を解消しようと、ログをとってイベントの発生順序が狂っていないかどうか調べたのですが、
問題なさそうでした。また、タスクバーのアイコン表示非表示はこちらの過去ログ
「アクティブなウィンドウだけをタスクバーに表示」を参考にしているので、
この問題に対する実装の方向性はまちがっていないと思っているのですが、うまくいっていません。

具体的には以下のような実装をしています。

フォーム1から5のForm_Activateイベントにて下記関数(AppTasklistA)呼び出し(フォーム起動時1回のみ)

フォーム2から3を呼び出す場合
'自分自身のフォーム2非表示+タスクバーアイコン削除
call DelTasklistA Me
'フォーム3呼び出し
form3.show vbmodal
'自分自身のフォーム2表示+タスクバーアイコン追加
call AppTasklistA Me

Public Sub DelTasklistA(ByRef p_frmForm As Form)
    'ウィンドウ非表示
    Call ShowWindow(p_frmForm.hWnd, CST_SW_HIDE)
    
    '以下過去ログのサンプル流用
    Dim objTaskbar As New TaskbarList
    objTaskbar.HrInit
    objTaskbar.DeleteTab p_frmForm.hWnd
    Set objTaskbar = Nothing
Exit Sub

Public Sub AppTasklistA(ByRef p_frmForm As Form)
    'alt+tabにて表示される切り替えダイアログにアイコンが表示されるようウィンドウスタイルにWS_EX_APPWINDOWを追加
    Call SetWindowLong(p_frmForm.hWnd, GWL_EXSTYLE, GetWindowLong(p_frmForm.hWnd, GWL_EXSTYLE) Or WS_EX_APPWINDOW)
    
    'ウィンドウ表示
    Call ShowWindow(p_frmForm.hWnd, CST_SW_SHOW)
    
    '以下過去ログのサンプル流用
    Dim objTaskbar As New TaskbarList
    objTaskbar.HrInit
    objTaskbar.AddTab p_frmForm.hWnd
    objTaskbar.ActivateTab p_frmForm.hWnd
    Set objTaskbar = Nothing
Exit Sub

気づいた点等ありましたらご意見いただけたら助かります。
よろしくお願いいたします。

投稿時間:2004/08/07(Sat) 16:05
投稿者名:花ちゃん
Eメール:
URL :
タイトル:
Re: タスクバーに消したはずのアイコンが残る
逆引きヘルプの方に2サンプル、アップしてありますのでそちらを
試して見てください。
(改造せずにそのままで)

又は、貴方のコードで確認しろと言われるなら事象を再現できるコードに
して頂かないとなかなか他の人は試す気になれないでしょう。
ましてや10回に1回程度しか発生しないとなれば、投稿されたコードを見た位で
解る人は早々いないかと思います。

たとへば、今使っておられるコードをフォームを表示するだけのコードにしても
(不要な部分を削除して)現象はおきるのでしょうか?
SetWindowLong 等のAPI関数を使用しない状態で試してみた場合とか。


# コードを投稿される場合、図表モードで投稿して頂くと「タブ」が保持されるので
 見易くなります。(下記の修正からも修正できたかと思います)

投稿時間:2004/08/08(Sun) 00:25
投稿者名:とも
Eメール:
URL :
タイトル:
Re^2: タスクバーに消したはずのアイコンが残る
> 逆引きヘルプの方に2サンプル、アップしてありますのでそちらを
> 試して見てください。
> (改造せずにそのままで)
>
> 又は、貴方のコードで確認しろと言われるなら事象を再現できるコードに
> して頂かないとなかなか他の人は試す気になれないでしょう。
> ましてや10回に1回程度しか発生しないとなれば、投稿されたコードを見た位で
> 解る人は早々いないかと思います。

おっしゃるとおり、投稿後、自分の投稿内容を読み返してみて、
返事をもらえないなこれは、と思っていました。
返事がもらえてとても感謝しています。

> たとへば、今使っておられるコードをフォームを表示するだけのコードにしても
> (不要な部分を削除して)現象はおきるのでしょうか?
> SetWindowLong 等のAPI関数を使用しない状態で試してみた場合とか。
>

ご指摘のAPI関数(SetWindowLong)を使用しない状態で試すと、現象はおきませんでした。

あとは、alt+tabにて表示される切り替えダイアログにアイコンが表示されれば、
実現したい機能を全て満たすのですが、
いまのところ、SetWindowLong関数以外でアイコンを表示する方法が分かっていません。

もしSetWindowLong関数を使用する以外の方法にて、切り替えダイアログにアイコン表示する方法を
ご存知の方があれば、おしえていただけませんか?

投稿時間:2004/08/08(Sun) 00:52
投稿者名:花ちゃん
Eメール:
URL :
タイトル:
Re^3: タスクバーに消したはずのアイコンが残る
> もしSetWindowLong関数を使用する以外の方法にて、切り替えダイアログにアイコン表示する方法を
> ご存知の方があれば、おしえていただけませんか?

SetWindowLong関数 の使い方に問題があるように思ったので、外して見て下さいと言った
のですが、やはりここに原因があったのなら使い方を色々試してみたらどうでしょうか?

まず、GetWindowLong で現在のスタイルを先に取得しておく
次に、SetWindowLong でスタイルを設定
SetWindowPos で再描画 (※ ShowWindow は使用しない)

のような方法や私の No.195 のサンプルで使っている方法等。


>あとは、alt+tabにて表示される切り替えダイアログにアイコンが表示されれば、
>実現したい機能を全て満たすのですが、

私のサンプルでは表示していますが、それとも何か意味が違うのでしょうか?

再現できるコードを投稿して貰った方が解決が早いと思うのですが。

投稿時間:2004/08/10(Tue) 09:52
投稿者名:とも
Eメール:
URL :
タイトル:
Re^4: 原因わかりました。
> SetWindowLong関数 の使い方に問題があるように思ったので、外して見て下さいと言った
> のですが、やはりここに原因があったのなら使い方を色々試してみたらどうでしょうか?
>
> まず、GetWindowLong で現在のスタイルを先に取得しておく
> 次に、SetWindowLong でスタイルを設定
> SetWindowPos で再描画 (※ ShowWindow は使用しない)
>
> のような方法や私の No.195 のサンプルで使っている方法等。
>
> 再現できるコードを投稿して貰った方が解決が早いと思うのですが。

原因わかりました。

再現できるコードを投稿させてもらおうと思い、実現したい機能だけの
サンプルプログラムを作成していろいろ試したところ、原因つかめました。

理由はわからないのですが、原因は
フォームを最大化するのに
フォームのHeight、Width、Top、Leftプロパティを使用していたのがまずかったようです。

現在は、
No.195のサンプルを流用させてもらって、
フォームの最大化を、AppTasklist関数のAPI関数(SetWindowPos)で行うようにしています。

第三者に確認作業をしてもらっていたので、返事おくれました。
助かりました。ありがとうございました。