INASOFT 管理人のひとこと


フリーソフトダウンロードサイト「INASOFT」の管理人 矢吹拓也 が日々の「ひとこと」を語るページです。
2021年1月1日より、旧ブログ(blog.inasoft.org)からお引越ししました。
・INASOFT Webサイト: https://www.inasoft.org/
・管理人のふたこと(長文記事/寄稿文): https://www.inasoft.org/talk/
2022年7月下旬より再び本業多忙化してきているため、更新頻度は落ちます。 [2022/7/24 19:32]

目次 | ←前へ / 2010-10-17 02:29 / 次へ→ / 最新へ⇒

■はてな引用記法テスト兼Windows 7のタスクバーを進捗バーに

2010年10月17日(日) 2:29:09 [はてなダイアリーから転記]



RSSRSS配信中
https://www.inasoft.org/



はてなの引用記法を試してみるってのもありますが

http://hatenadiary.g.hatena.ne.jp/keyword/%E5%BC%95%E7%94%A8%E3%83%96%E3%83%AD%E3%83%83%E3%82%AF%E3%82%92%E4%BD%9C%E3%82%8B%EF%BC%88%E5%BC%95%E7%94%A8%E8%A8%98%E6%B3%95%EF%BC%89

先日書いた、Windows 7用のタスクバーを進捗バーにするというものを書いてみようかと。

なお、Windows 7用のタスクバーを進捗バーにする方法は、上のリンクでも書いてあるとおり、単純に DLL を直接呼ぶことにより実現するようなことができません。

そのため、どうしても、最新の開発環境を用いる必要が出てきます。

しかし、いじくるつくーるは、Windows 98以降に対応するツールです。

そのため、安易にVisual Studio 2010を使おうってわけにもいきません。というのも、Visual Studio 2010でビルドすると、Windows XP以降でしか実行できないバイナリが生成されてしまうので。

というわけで今回は、Visual Studio 2005にWindows SDK 7.1を導入することにより、Windows 7の機能を使ってみたいと思います。

で、これをライブラリ(libファイル)として準備しておき、本体のビルドはデフォルトのSDKを使ってビルドしようというわけ。

#include "stdafx.h"   ← windows.hとShObjIdl.hをインクルード。_WIN32_WINNTは0x0601以上にしておく必要があるかも

// Windows 7から新しく追加された機能を代理で呼び出すためのライブラリ。

// このプログラムをコンパイルするためには、Windows SDK 7.1 が必要です。
// ライブラリをリンクするときには不要です。
// しかしながら、IID_ITaskbarList3を使うには、リンク時にWindows SDK 6.1が使用されていないといけません。
// そこで…

// このプログラムでは、下記の宣言を使う代わりに、以下のIIDを宣言します。
//EXTERN_C const IID IID_ITaskbarList3;
static const GUID  IID_ITaskbarList3A =
    {0xea1afb91,0x9e28,0x4b86,{0x90,0xe9,0x9e,0x9f,0x8a,0x5e,0xef,0xaf}}; /* IID   */

// このライブラリを使う前に、CoInitialize を必ず呼び出してください。
// また、プログラム終了前には CoUninitialize を必ず呼び出してください。

LibExport BOOL w7tbProgress(HWND hWnd, DWORD dwTbpFlag, DWORD dwValue, DWORD dwMax) // LibExport = Extern "C" (C++の場合)
{
	static ITaskbarList3* ptl; // インタフェース

	if (hWnd == NULL) {
		// 解放
		if (ptl != NULL) {
			ptl->Release();
			ptl = NULL;
			return TRUE;
		}
		else {
			return FALSE;
		}
	}

	if (ptl == NULL) {
		if (S_OK != CoCreateInstance(CLSID_TaskbarList, NULL, CLSCTX_ALL, IID_ITaskbarList3A, (void**)&ptl)) {
			return FALSE; // 失敗
		}

		// ptlに値が入れば、以後はCoCreateInstanceは呼び出されない
	}

	if (ptl) {
		ptl->SetProgressState(hWnd, (TBPFLAG)dwTbpFlag);
		if (dwTbpFlag == TBPF_NORMAL) {
			ptl->SetProgressValue(hWnd, (ULONGLONG)dwValue, (ULONGLONG)dwMax);
		}
		return TRUE;
	}
	else {
		return FALSE;
	}
}

まぁ実験的なプログラムではありますが、

w7tbProgress の引数dwTbpFlagmへは、以下のフラグが入ります

	TBPF_NOPROGRESS	= 0,
	TBPF_INDETERMINATE	= 0x1,
	TBPF_NORMAL	= 0x2,
	TBPF_ERROR	= 0x4,
	TBPF_PAUSED	= 0x8

hWndパラメタがNULLの場合は、ITaskbarList3.Releaseメソッドが呼ばれて解放です。

dwTbpFlagに入れたフラグが 0x2 だった場合、dwValue と dwMax が有効になります。dwMaxを最大とした場合の dwValue が、進捗バーの進捗度を示すことになります。

dwTbpFlagが0の場合は進捗バーなし、0x1の場合は最大が未定の場合に、あいまいに進捗バーを動かします。

0x4はエラー発生時、0x8は一時停止中(ユーザーに質問中など)の状態を意味します。あ、この場合も、dwValue と dwMax が有効になりますかね。





目次 | ←前へ / 2010-10-17 02:29 / 次へ→ / 最新へ⇒


目次の表示:


ブログではないので、コメント機能とトラックバック機能は提供していません。ご質問・ご意見等はメールフィードバックまたはTwitter等からお願いします。いただいたご質問・ご意見などは、この「管理人のひとこと」の記事に追加、あるいは新規の記事にする形で一部または全文をそのまま、あるいは加工させていただいた上で、ご紹介させていただく場合があります。
当サイトでは掲載内容による不具合等に関する責任を持ちません。また、内容の正確性についての保証もありませんので、情報をご利用の際は、利用者の自己責任で確認をお願いします。本ページは公開から1年半後の任意のタイミングで削除される予定です。


- 最近の更新 -



3129796 (+0258)[+0470]

Copyright© 2010-2024 INASOFT