背景:標準 SideShow 裝置連接 PC 由管理中心添加 Gadget,裝置緩存至記憶體。斷電重啟後所有 Gadget 資訊遺失。本功能讓裝置重啟自動恢復原有 Gadget。

Message 組件接管 PC 通訊,新 Gadget 經此通道添加,畫面/狀態持續同步。Cache 取得介面元素。單純持久化 Cache 不足,因 Gadget 載入需 Message 組件觸發消息循環。最直接方式:**攔截並持久化關鍵消息**,啟動時(離線狀態)重播消息,模擬聯機交互流程,實現動態載入(資料非即時)。
| 序號 | 名稱 | 值 | 說明 |
|---|---|---|---|
| 1 | AddApp | 0x010D | 添加 Gadget |
| 2 | DeleteApp | 0x010E | 刪除指定 Gadget |
| 3 | DeleteAllApps | 0x010F | 刪除全部 Gadget |
| 4 | AddContentItem | 0x0114 | 添加 Gadget 內容項 |
| 5 | DeleteContentItem | 0x0115 | 刪除指定內容項(效能考量未處理) |
| 6 | DeleteAllContentItems | 0x0116 | 刪除 Gadget 所有內容項(效能考量未處理) |
ROOT\GADGET_CACHEindex.App(名稱/圖示)與 {ContentId}.Content(內容資料)GadgetCachepublic class GadgetCache {
public static bool OnlineFlag = false;
public static bool RunFlag = false;
public static int CheckCachedDirectory();
public static string[] EnumApps();
public static string[] EnumContentItems(string AppId);
public static int LoadApp(string AppId, out byte[] data);
public static int SaveApp(string AppId, byte[] data);
public static int DeleteApp(string AppId);
public static int DeleteAllApps();
public static int LoadContentItem(string AppId, string ContentId, out byte[] data);
public static int SaveContentItem(string AppId, string ContentId, byte[] data);
public static int DeleteContentItem(string AppId, string ContentId);
public static int DeleteAllContentItems(string AppId);
}
PcMessageHandler.cs)case PacketType.AddApp:
// ... shell.ConnectClient(...)
if (!GadgetCache.RunFlag) GadgetCache.SaveApp(appId.ToString(), msg.Payload);
break;
case PacketType.AddContentItem:
// ... cacheMgr.AddItem(...)
if (!GadgetCache.RunFlag) GadgetCache.SaveContentItem(appId.ToString(), contentId.ToString(), msg.Payload);
break;
// Delete 類似
PcMessageHandler.cs)new Thread(Load_Gadget).Start(); // 在 Initialize 中啟動
void Load_Gadget() {
Thread.Sleep(3000);
if (!GadgetCache.OnlineFlag) {
GadgetCache.RunFlag = true;
foreach (var appId in GadgetCache.EnumApps()) {
if (GadgetCache.OnlineFlag) { GadgetCache.RunFlag = false; return; }
GadgetCache.LoadApp(appId, out byte[] data);
ProcessMessage(GadgetCache.ToAuxMessage(269, data)); // AddApp
foreach (var cid in GadgetCache.EnumContentItems(appId)) {
if (GadgetCache.OnlineFlag) { GadgetCache.RunFlag = false; return; }
GadgetCache.LoadContentItem(appId, cid, out data);
ProcessMessage(GadgetCache.ToAuxMessage(276, data)); // AddContentItem
}
}
GadgetCache.RunFlag = false;
}
}
官方模擬器不支援檔案系統,自行擴展 MF 模擬器支援 SideShow,可模擬連線/離線切換(需 VS2008 管理員權限)。
