今日插件,可以看成一个DLL 的应用程序(对,应用程序!可以有界面,可以干任何事)。
只是系统规定了两个接口(240和241),必须带240这个接口就OK了。
今日插件完全依靠注册表活动。如果你的今日插件写成死循环了(我真的写死过,不停的蹦框。。。 最后我恢复出厂设置了。),可以修改注册表键值(HKEY_LOCAL_MACHINE/Software/Microsoft/Today/Items// 你自己的插件DLL )来干掉它。
微软给了例子! 自己找一下MyToday。
微软的注册方法:
1.拷贝到系统目录: WINDOWS//... ::CopyFile(lpszTodayFilePath, ... , FALSE);
2.安装 “今日插件”: ::RegCreateKeyEx();
// 注册插件
iTemp = 0;
::RegSetValueEx(hOpenKey, _T("Flags"), 0, REG_DWORD, (BYTE*)&iTemp, sizeof(iTemp));
::RegSetValueEx(hOpenKey, _T("Options"), 0, REG_DWORD, (BYTE*)&iTemp, sizeof(iTemp));
iTemp = 1;
::RegSetValueEx(hOpenKey, _T("Enabled"), 0, REG_DWORD, (BYTE*)&iTemp, sizeof(iTemp));
::RegSetValueEx(hOpenKey, _T("Order"), 0, REG_DWORD, (BYTE*)&iTemp, sizeof(iTemp));
iTemp = 2;
::RegSetValueEx(hOpenKey, _T("Selectability"), 0, REG_DWORD, (BYTE*)&iTemp, sizeof(iTemp));
iTemp = 4;
::RegSetValueEx(hOpenKey, _T("Type"), 0, REG_DWORD, (BYTE*)&iTemp, sizeof(iTemp));
::RegSetValueEx(hOpenKey, _T("DLL"), 0, REG_SZ, (BYTE*)HANDMAP_TODAY_COPY, sizeof(TCHAR) * _tcslen(lpszTodayFilePath));
3.给今日发送系统消息注册运行: ::SendMessage(HWND_BROADCAST, WM_WININICHANGE, (WPARAM)0xF2, 0);
说一下今日插件的几个注册表键值:
1. Enabled : 负责显示,还是不显示,不显示的话可以去今日里添加项。
2. Order:在今日里的顺序。
3.Selectability:这个有意思分为:0,1,2。1是系统托管,但收不到外部手动点击的消息. 2是消息下放到控件。推荐使用2,因为自己清楚该干什么。
卸载很简单: 只要删除DLL,注册表删掉就可以了。
关于插件的消息驱动:
自己用远程SPY看一下消息的流程吧。
选中的时候: WM_USER + 244 -> WM_PAINT ->WM_ERASEBKGND
选别的的时候: WM_USER + 246 -> WM_USER + 245 -> WM_PAINT ->WM_ERASEBKGND
其中:
WM_TODAYCUSTOM_RECEIVEDSELECTION: // 选择进入 WM_USER + 244
WM_TODAYCUSTOM_LOSTSELECTION: // 退出 WM_USER + 245
WM_TODAYCUSTOM_QUERYREFRESHCACHE // 这个东西一直在跑,应该几秒钟一次 WM_USER + 243
WM_LBUTTONDOWN: // 鼠标按下 这里可以发送::PostMessage(::GetParent(hWnd), TODAYM_TOOKSELECTION, (WPARAM)hWnd, 0); 来控制绘制界面-这个很重要!
绘制靠自己,想怎么干就怎么干
g_bSelecte 可以控制选中和为选中的状态。
获得高亮色:
DWORD bkcr = SendMessage(g_hWndParent, TODAYM_GETCOLOR, (WPARAM)TODAYCOLOR_HIGHLIGHT, NULL);
就这样吧!忘东西太快自己做个记录。
.
.
.
.
PS:火爆大头菜的秘诀就是不洗菜