読者です 読者をやめる 読者になる 読者になる

tmytのらくがき

個人の日記レベルです

ver,1.2.2.8

細々とした変更

  • フィードの並べ替えを実装。フィード設定でドラッグ&ドロップ。
  • 記事一覧に未読/既読アイコン追加
  • HTTPのバッファ周りを少し変更
  • 2行表示の時アイコンの下まで文字が流れるよう変更
  • 記事一覧での左右キーをページスクロールに変更
  • 速報みたいの実装
  • ひどすぎた表示周りのコードを少し整理

速報みたいのはSendNews.exeから書き込めます。
RSSより優先してTodayに表示されます。指定時間経過、もしくは既読状態になることで削除されます。
複数の速報みたいのを保持することができます。表示順序は送信された順番です。

※00:59: 不具合があったので差し替えました
Download: SetupRssTicker1228.CAB

以下リファレンス的なもの。

速報みたいなの リファレンス

SendNewsflash.exe、Win32APIどちらを使用する場合もタイトルは必須パラメタです。指定されていない場合、メッセージは無視されます。

SendNews.exe

コマンドラインから送信する内容を決定できます。引数は以下の通り

/title

フィード名に対応します。2行表示の1行目にも使用されます

/subtitle

エントリ名に対応します。

/description

RSSの詳細に対応します。

/expire

表示可能時間です。ミリ秒で指定します。Today本体がメッセージ受信した時刻からの経過ミリ秒で計測しています。

使用例

SendNewsflash.exe /title 新着メールあり /subtitle Re: /本文... /expire 60000

それぞれに半角スペースを含むことはできません。"で囲んでもだめです。気が向いたらもう少しまともにコマンドライン解析します。

Win32API

Win32APIを使用して送信も可能です。送信する場合は次の仕様で送信してください。

// 送信に使用する構造体など
// #define MAX_PATH 260
#define RSSTICKER_HWND _TEXT("RSSTICKER_HWND")
#define ID_NEWSFLASH 7499
struct tagNEWSFLASHDATA {
	wchar_t lpTitle[64];
	wchar_t lpSubTitle[64];
	wchar_t lpDescription[512];
	wchar_t lpExeName[MAX_PATH];
	wchar_t lpParameter[MAX_PATH];
	unsigned long ulExpire;
};
// 送信サンプル
// 前項のものが宣言されてることとします。
// ファイルマッピングオブジェクトの作成
// RSSTICKER_HWND でファイルマッピングオブジェクトを作成すると
// RSS Ticker Today本体のウィンドウハンドルを取得することができます
HANDLE hMapping = CreateFileMapping(INVALID_HANDLE_VALUE, NULL, PAGE_READONLY, 0, sizeof(HWND), RSSTICKER_HWND);

// GetLastError() が ERROR_ALREADY_EXISTS を返さない場合
// Todayはロードされていないので直ちにハンドルを解放しなければなりません
if (GetLastError() != ERROR_ALREADY_EXISTS) {
	CloseHandle(hMapping);
	return 0;
}

// 次にファイルマッピングオブジェクトを実際のメモリに割り当てます。
HWND* lpHWND = (HWND*)MapViewOfFile(hMapping, FILE_MAP_READ, 0, 0, 0);
HWND hWnd = *lpHWND;
UnmapViewOfFile(lpHWND);
CloseHandle(hMapping);

// 送信するデータを構造体に用意します
struct tagNEWSFLASHDATA nfd = {0};
wcsncpy(nfd.lpTitle, _TEXT("新着メールあり"), 64);
wcsncpy(nfd.lpSubTitle, _TEXT("Re: <hogehoge@example.com>"), 64);
wcsncpy(nfd.lpDescription, _TEXT("ここには<b>HTML</b>を記述することも可能です"), 512);
nfd.ulExpire = 60000;

// WM_COPYDATAで使用する構造体に先に設定した構造体をセットし
// WM_COPYDATAで送信します。
COPYDATASTRUCT cds;
cds.dwData = ID_NEWSFLASH;
cds.cbData = sizeof(tagNEWSFLASHDATA);
cds.lpData = &nfd;
SendMessage(hWnd, WM_COPYDATA, NULL, (LPARAM)&cds);

現状lpExeName, lpParameterは無視されます。
こんな感じです。あとでシェル通知を流すようなのも作ってみます。