精华区 [关闭][返回]

当前位置:网易精华区>>讨论区精华>>编程开发>>● Delphi>>Object Pascal语言>>编制一个SHELL要处理的事项(欢迎讨论)

主题:编制一个SHELL要处理的事项(欢迎讨论)
发信人: 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

[关闭][返回]