发信人: daji(妲姬) 
整理人: teleme(2001-06-15 17:46:58), 站内信件
 | 
 
 
Windows的桌面向来如此,2000/XP做出的改动又有盗取MAC之嫌,为使桌面更具各人特色也成了风尚,THEME,墙纸,图标!更何况许多地方要求外壳有特别功能,如公共场所如网吧,安全场所如银行。作为SHELL的替换品也有很多东西,如LITESTEP,可惜外国人的东西始终没有中国特色,我在使用过程中发现的最大问题莫过于对INTERNAT.EXE的处理,即输入法状态显示图标,我还没找到一个解决该问题的替代品。更为没事闲的,就想自己编一个SHELL,DELPHI自然是非常好的工具,可借签的东西也很多,相关的源程序也有不少,虽然没动手做,也有一些想法。在这里和大家讨论(也许最终我也做不出一个SHELL,如果我的这篇东西能让某些人编出类似的东西,也算是有所得吧)
 =====================================================================
 外壳是用户和所有程序之间的接口,就像操作系统是应用程序和硬件之间的接口一样
 通常的工作内容是:
 初始化应用环境——加载初始化应用程序,如开始菜单中“启动”目录下的程序
 提供快捷方式  ——快捷键、链接图标、菜单……
 提供交互环境  ——任务栏、系统托盘、任务列表……
 
 我们要编SHELL的话,简单的来说,要处理下面的事项:
 加载一开始就要运行的程序:
 ·加始注册表中指定要运行的程序,这里又有两个目录项,一是HKEY_CURRENT_USER
   另一个是HKEY_LOCAL_MACHINE,二者之间的不同和前者相似。
   下面是实现该功能的一个解决方案:
 procedure RunReg(Key: integer);
 { Key = HKEY_CURRENT_USER 或 HKEY_LOCAL_MACHINE }
 var
   RunList: TStringList;
   i: integer;
 begin
   Reg.RootKey := Key;
   Reg.OpenKey(RegRoot,True);
   RunList := TStringList.Create;
   Reg.GetKeyNames(RunList);
   Reg.CloseKey;
   i := 0;
   while i < RunList.Count do
     if UpperCase(Copy(RunList.Strings[i],1,3)) = 'RUN' then
       i := i + 1
     else
       RunList.Delete(i);
   for i := 0 to (RunList.Count - 1) do begin
     ExecKey(RegRoot + '\' + RunList.Strings[i]);
     { 对于是需要运行一次的加载项就得在运行过后将其删除 }
     if Pos('ONCE',UpperCase(RunList.Strings[i])) <> 0 then
       Reg.DeleteKey(RegRoot + '\' + RunList.Strings[i]);
     end;
   RunList.Free;
 end;
 ·开始菜单中的程序(分本用户和系统级的,NT用户对此明白这两者之间的不同)
   实现方法是找到该目录,依次取出相应内容并执行它,可以使用ShellExecute
   需要处理的有一点,根据以往的习惯,如果用户按下SHIFT,那么这些东西可以
   略过,只需要判断一下就可以
   if GetKeyState(VK_SHIFT) >=0 then 加载程序;
 
 
 初始化完成后就得提供菜单和桌面,可以将开始菜单中的各项内容加载,用POPMENU
 提供给用户,可以在用户点击桌面时弹出,或是提供一个按钮,如WINDOWS的开始按
 钮,或是按在某个键后弹出,如[WIN]键,这一部分我还没有示范代码。
 
 再有对键盘的一系列HOTKEY处理一下,如CTRL+ESC,CTRAL+ALT+DEL等。
 
 然后只需要进入消息循环就算完成了基本的任务。
 
 然后就如LITESTEP、CLOUD9INE等完成一些小程序的加载,如时钟、CPU负载、内存
 任务栏、系统托盘等多个程序的加载。
 
 可参考资源:litestep.net, cloud9ine.com
 
  ---- ===========================================================
 汝奈我何?         妲姬 [email protected], daji.yeah.net | 
 
 
 |