【HSP】タスクトレイにアイコン表示【Win32】
【HSP】タスクトレイにアイコン表示【Win32】
#include "kernel32.as"
#include "shell32.as"
#include "user32.as"//
// メイン
//
// 割り込み
RegisterWindowMessage "TaskbarCreated"
oncmd gosub *OnTaskbarCreated, stat // "TaskbarCreated"
oncmd gosub *OnClose, 0x0010 // WM_CLOSE
oncmd gosub *OnTrayIcon, 0x0401 // WM_TRAYICON// タスクトレイにアイコン表示
gosub *AddTaskbarIcon// テスト
/* ウィンドウ非表示 */
gsel 0, -1stop
//
// タスクトレイにアイコン表示
//
*AddTaskbarIcon// 自身のアイコン取得
sdim FileName, 260
GetModuleFileName hModule, varptr(FileName), 260
ExtractIconEx varptr(FileName), 0, 0, varptr(hIconSmall), 1
hIcon = hIconSmall(0)// 自身のウィンドウタイトル取得
GetWindowTextLength hwnd
sdim WindowTitle, stat + 1
GetWindowText hwnd, varptr(WindowTitle), stat + 1// NOTIFYICONDATA 構造体
dim IconData,22
IconData(0) = 88
IconData(1) = hwnd
IconData(2) = 1
IconData(3) = 0x0007 // NIF_MESSAGE | NIF_ICON | NIF_TIP
IconData(4) = 0x0401 // WM_TRAYICON
IconData(5) = hIcon
poke IconData, 4 * 6, WindowTitle// タスクバーにアイコン表示
Shell_NotifyIcon 0x00000000, varptr(IconData) // NIM_ADDreturn
//
// タスクトレイのイコン削除
//
*DeleteTaskbarIcon// NOTIFYICONDATA 構造体
dim IconData,22
IconData(0) = 88
IconData(1) = hwnd
IconData(2) = 1
IconData(3) = 0x0002 // NIF_ICON// タスクバーのアイコン削除
Shell_NotifyIcon 0x00000002, varptr(IconData) // NIM_DELETEreturn
//
// *OnTaskbarCreated
//
*OnTaskbarCreated// タスクトレイにアイコン表示
gosub *AddTaskbarIconreturn
//
// *OnClose
//
*OnClose// タスクバーのアイコン削除
gosub *DeleteTaskbarIconreturn
//
// *OnTrayIcon
//
*OnTrayIconif (wparam == 1) {
switch (lparam)
case 0x0201 // WM_LBUTTONDOWN// テスト
/* ウィンドウ表示 */
gsel 0, 2swbreak
swend
}return
※補足 (2014/08/27追記)
oncmd gosub *OnClose, 0x0010 // WM_CLOSE
↓
oncmd gosub *OnDestroy, 0x0002 // WM_DESTROY
//
// *OnClose
//
*OnClose// タスクバーのアイコン削除
gosub *DeleteTaskbarIconreturn
↓
//
// *OnDestroy
//
*OnDestroy// タスクバーのアイコン削除
gosub *DeleteTaskbarIconreturn
説明
- タスクトレイのアイコンとメッセージを自分で指定するのは面倒なので、自身の実行ファイルのアイコンと、ウィンヅタイトルを利用することに。
- タスクバーの強制終了、再起動時にアイコンを再生成。
- 「表示」でなく「格納」したい場合は、普通にアイコンの表示/非表示処理とウィンドウの表示/非表示処理を交互に入れればいいです。
- すべて関数でなく命令になってしまうものの、APIの関数の定義をズラッと書くと長くなるので、できるだけ既存のヘッダを使う。
- マクロ定義も長くなるので、定数を書き、その後ろにコメントで本来のマクロ名を書く。
- if文 は C っぽく カッコ をつける。中身は インデント 1
- switch, case, swend は同じ数のインデント、case の中身と swbreak はさらにもうひとつインデント (swbreak も中身と考えて)
- メインプログラム および サブルーチンは、ラベルはインデントなし、中身はインデント 1つ目 から。(メインプログラム も 1つ のルーチンであると考えて)。#deffunc #defcfunc も同様
- repeat (foreach) loop 内は インデント 1
参考
- 「タスクトレイにアイコン格納する」(「HSPサンプル蔵(システム操作編)」)
- 「WILL - タスクトレイに常駐するアプリを作る」