![]() |
SDK-MFC 備忘録 |
Windows SDKやMFCに関するメモです。
(記載内容について正しいことを保証するものではありません。MSDN等で確認してください)
2009/12/26 作成
Windows7ではタスクバーが一新され様々な新機能が盛り込まれています。そのなかにタスクバーのサムネイル画面にボタンが設定する機能があります。
このAPIを試してみます。
おおよその手順は、
1)タスクバーインタフェースのメッセージを取得する
2)タスクバーボタン生成メッセージをキャッチする。
3)ITaskbarList3のインスタンスを生成する
4)THUMBBUTTON構造体配列に必要な情報を設定する
5)ITaskbarList3クラスのメンバThumbBarAddButtons()でボタンを登録する。
6)ボタンを押されたときは,WM_COMMANDメッセージで通知される。
と、こんな感じです。
登録するボタンは、イメージリストのインタフェースとボタンアイコンとが使用できます。
とりあえずアイコンの方が簡単なのでアイコンで試してみます。
アイコンはVS2008付属のアイコンエディタで作成します。
下図のように青丸と赤丸のアイコンを作成します。
|
|
|
|
|
次にWM_COMMANDで通知してもらうIDを決めます。このIDは他のボタンコントロールのIDと重複しないように決めます。(もちろん狙って同じIDでボタン押下ハンドラ処理に直接飛ばすのもありと思います。むしろ、これを狙ってWM_COMMANDで通知するインタフェースにしているのだと思います。)
リソースシンボルの定義で、それぞれ4001,40002と定義します。
|
|
WindowProc()ハンドラ:
LRESULT CTaskBarDlg::WindowProc(UINT message, WPARAM wParam, LPARAM lParam)
{
// TODO: ここに特定なコードを追加するか、もしくは基本クラスを呼び出してください。
static UINT msgTBC = (UINT)-1;
static HICON hIcon1 = 0;
static HICON hIcon2 = 0;
switch(message){
case WM_CREATE:
msgTBC = RegisterWindowMessage(_T("TaskbarButtonCreated"));
hIcon1 = AfxGetApp()->LoadIcon(IDI_ICON1);
hIcon2 = AfxGetApp()->LoadIcon(IDI_ICON2);
//権限を昇格する場合を考慮するならメッセージフィルタにスルー指示を行う
//ChangeWindowMessageFilter(msgTBC , MSGFLT_ADD);
//ChangeWindowMessageFilter(WM_COMMAND, MSGFLT_ADD);
break;
case WM_COMMAND:
int const CtlId = LOWORD(wParam);
switch (CtlId){
case IDTB_BUTTON1://Thumbnail ボタン1が押された処理
{
WCHAR szMsg[100];
StringCchPrintf(szMsg, ARRAYSIZE(szMsg),
_T("Thumbnail toolbar button1 clicked, ID=%d"),
CtlId);
AfxMessageBox( szMsg);
}
return 0;
case IDTB_BUTTON2://Thumbnail ボタン2が押された処理
{
WCHAR szMsg[100];
StringCchPrintf(szMsg, ARRAYSIZE(szMsg),
_T("Thumbnail toolbar button2 clicked, ID=%d"),
CtlId);
AfxMessageBox( szMsg);
}
return 0;
}
break;
}
if(message == msgTBC){//The taskbar button has been created
THUMBBUTTON buttons[2];
buttons[0].dwMask = THB_ICON|THB_TOOLTIP|THB_FLAGS;
buttons[0].iId = IDTB_BUTTON1;
buttons[0].hIcon = hIcon1;
StringCchCopy(buttons[0].szTip, ARRAYSIZE(buttons[0].szTip),
_T("Button 1"));
buttons[0].dwFlags = THBF_ENABLED;
buttons[1].dwMask = THB_ICON|THB_TOOLTIP|THB_FLAGS;
buttons[1].iId = IDTB_BUTTON1;
buttons[1].hIcon = hIcon2;
StringCchCopy(buttons[1].szTip, ARRAYSIZE(buttons[1].szTip),
_T("Button 2"));
buttons[1].dwFlags = THBF_ENABLED;
// Create an instance of ITaskbarList3
ITaskbarList3 *ptbl;
HRESULT hr = CoCreateInstance(CLSID_TaskbarList, NULL,
CLSCTX_INPROC_SERVER, IID_PPV_ARGS(&ptbl));
if (SUCCEEDED(hr)){
// Attach the toolbar to the thumbnail.
hr = ptbl->ThumbBarAddButtons(this->m_hWnd,
ARRAYSIZE(buttons), buttons);
}
else{
//error !comインスタンス生成失敗
}
ptbl->Release();
}
return CDialog::WindowProc(message, wParam, lParam);
}
追加のインクルードは、
#include "strsafe.h"
※strsafe.hはStringCchPrintf()を使用しているためです。(タスクバーとは関係ありません)
WindowProc()内にすべて入れるためにメッセージ変数やアイコンハンドラ変数をstaticにしています。適宜クラス変数にするなど読み替えてください。
実行すると、以下のようにタスクバーのThumbnailにボタンが表示されます。
![]() |
このサンプルでは、ボタンを押すとそれぞれメッセージダイアログを表示します。
※アプリケーションが権限昇格を考慮する必要がある場合は、WM_CREATEでメッセージをスルーしてもらうためにChangeWindowMessageFilter()で指示する必要があります。(コメントアウト参照)
※Windows7の新機能のAPIをプログラムするには、事前に7用のSDKをインストールする必要がありますのでご注意ください。