SSブログ

モーダルで表示したフォームをタスクバーに表示する TaskBarList.Lib [program]

VB6ではモーダルで表示したフォームはタスクバーに表示されません。

外部プログラムから起動されるプログラムをVBで作成する場合、
引数を処理する関係で、
スタートアップをMain関数にして、フォームをモーダルで表示することがあります。

以前、その様なコーディングを行ったところ、
フォームが表示されているのに、タスクバーに表示されない事が問題になりました。
フォームが別のプログラムのフォームの裏に隠れてしまうと、
タスクバーで切り替えできないからです。

このような事例は多かったはずなのですが、今まで対応した記録がなく、
私が対応方法を調べる事になりました。

比較的容易にITaskBarListインターフェイスを使用すれば実現できる事が分かり、
そのためのタイプライブラリがネットで無償公開されている事が分かりましたが、
仕事で使用するには、由来がはっきりしないモジュールは使用できません。

そこで、タイプライブラリを作成することにしました。

海外のサイトで公開されていたODL関係のサンプルソースを参考に、
ソースを作成したのだったと思います。
当時はODL言語についても調べたのですが、
時間がたっていることと、
何しろ突貫工事だったので、記憶もあいまいで、記録もまとまっていません。

それでも、今のところ動いています。

もし誤り等がありましたら、ご指摘ください。



TaskBarList.odl(ソース)
タイプライブラリ自身のUIDをGUIDGen.EXE等で作成して設定してください。

[
   uuid(タイプライブラリ自身のUID),
   helpstring("LibTaskbarList"),
   version(1.00)
]
library LibTaskbarList {
	importlib("stdole2.tlb");
	
	interface ITaskbarList;

	
	[
		odl,
		uuid(56FDF342-FD6D-11d0-958A-006097C9A090),
		helpstring("ITaskbarList interface")
	]
	
	interface ITaskbarList : IUnknown {
		
		HRESULT HrInit();
		
		HRESULT AddTab([in] LONG hwnd);
		
		HRESULT DeleteTab([in] LONG hwnd);
		
		HRESULT ActivateTab([in] LONG hwnd);
		
		HRESULT SetActiveAlt([in] LONG hwnd);
	};
	
	[
		uuid(56FDF344-FD6D-11D0-958A-006097C9A090),
		helpstring("TaskbarList class")
	]
		coclass TaskbarList {
		[default] interface ITaskbarList;
	};

};


MKtyplib.exeでタイプライブラリを作成します。
MKtyplib.exeはVisual StudioのVCフォルダのBinフォルダにあるはずです。

MKTYPLIB.EXE TaskBarList.odl /nocpp /tlb TaskBarList.tlb


VBからTaskBarList.tlbを参照設定すれば使用できます。

リファレンス
HrInit()
	クラスの初期化を行う。
	TaskBarListクラスのインスタンスを作成した後、一度だけ行ってください。

AddTab(hWnd)
	hWnd・・・ウインドウハンドル
	指定したウインドウをタスクバーに追加する

DeleteTab(hWnd)	
	hWnd・・・ウインドウハンドル
	指定したウインドウをタスクバーから削除する

ActivateTab(hWnd)	
	hWnd・・・ウインドウハンドル
	指定したウインドウをアクティブにするタブもアクティブになる




サンプル
'--Module1
Sub Main()
	Dim frm1 as Form1
	Set frm1 = New Form1
	frm1.Show vbModel
End Sub

'--Form1
Private TaskBarList As TaskBarList

Private Sub Form_Load()
	Set TaskBarList = New TaskBarList
	'初期化
	TaskBarList.HrInit
	'タスクバーに追加
	TaskBarList.AddTab Me.hWnd
End Sub

Private Sub Form_QueryUnload(Cancel As Integer, UnloadMode As Integer)
    	'タスクバーから削除
	TaskBarList.DeleteTab Me.hWnd
	Set TaskBarList = Nothing
End Sub


※プログラム関係の記事がたまったら別ブログにしようと思います。
nice!(4)  コメント(6)  トラックバック(0) 

nice! 4

コメント 6

おつみーこ

まだブログがない時代、
ありんこぶたちゃんと一緒に本に関する個人のHP作ろうと思って、
ソフト利用はなんかゆるせなかったので、HTMLやJavaを勉強したけど、
挫折したよ(´ε`@)

evergreenさんはいつからこんな勉強してたの?
文系だと思っていたけど・・(笑)
by おつみーこ (2011-04-07 13:17) 

evergreen

javaまでやろうとしたなら本格的だね、
あなたたちが仲が良かったということも驚きだけど。

僕の場合は、話せば長い事だけど、
始めの測量会社で一人で始めて、
小さなソフト屋さんに転職して経験を積んだ感じ。
全部独学だよ。


by evergreen (2011-04-08 01:33) 

おつみーこ

ありんこぶたちゃんとは、学生時代はそうでもなかったけど、
社会人になってから、海外旅行にも一緒に行ったのだよ!

近年は年賀状だけだったけど、
mixiやっていると聞いて、
また交流復活という感じです^^

全部独学はすごいね!
頭良かったもんねb
話せば長いお話し、お暇な時にでも聞かせてねー/
by おつみーこ (2011-04-08 17:01) 

evergreen

そういえば、そんな話、誰かに会った時に聞いたことがあるな、
だれだったかな、話した方も意外だと言ってたよ。

数学で散々アカ点とっているんだから、頭が言い訳ないでしょ(^^;

話せば長い話なんだけど、まとめると二行で終わっている(爆
人生なんてそんなものかな。
by evergreen (2011-04-08 19:14) 

おつみーこ

赤点は・・
弓道に没頭しすぎだったんじゃない^^?

ワタシはevergreen さんはもともと頭が良い人(勉強じゃなくて・・←ゴメン)と
にらんでる( ̄ー ̄)b

↑これほめ言葉~(笑)
by おつみーこ (2011-04-09 08:58) 

evergreen

確かに勉強は出来なかったけど(^^;
by evergreen (2011-04-14 13:32) 

コメントを書く

お名前:
URL:
コメント:
画像認証:
下の画像に表示されている文字を入力してください。

Facebook コメント

トラックバック 0