在程序中实现网站链接和发送邮件(zz)

来源:互联网 发布:csgo网络参数位置 编辑:程序博客网 时间:2024/04/28 02:41
        越来越多的程序员喜欢在自己编写的程序中加上网站或电子信箱的链接。用户只需点击鼠标,即可自动打开浏览器并链接到指定的URL地址,或是打开邮件客户程序的“新建窗口”,甚至连收件人、邮件主题、邮件正文都可以替用户填好。
  如果希望用户能够从网站下载升级、补丁程序,或向用户介绍产品的最新情况,那么可以在程序中加上到网站的链接,这无疑比让用户自己打开浏览器,再输入网址要便捷得多,也更能激发用户的兴趣。如果再在程序中加上电子信箱的链接,那么用户就可以直接给程序研制者发信,这不但可以为用户提供更好的技术支持和售后服务,而且也便于开展用户调查之类的活动。
  本文以Delphi为例,介绍这种用户可以直接从应用程序中链接到指定站点或发送电子邮件的做法的工作原理及实现方法。

工作原理

  很多程序员都知道Windows API函数ShellExecute可以用来执行程序、打开文件或文件夹,但用该函数浏览URL地址或发送新邮件,恐怕了解者就不是很多了。因为Windows帮助文档WIN32.HLP中没有提到这种用法。
 
  1.标准用法

  ShellExecute函数原型及参数含义如下:

  function ShellExecute(hWnd: HWND; Operation, FileName, Parameters,Directory: PChar; ShowCmd: Integer): HINST; stdcall;  

  ●hWnd:用于指定父窗口句柄。当函数调用过程出现错误时,它将作为Windows消息窗口的父窗口。例如,可以将其设置为应用程序主窗口句柄,即Application.Handle,也可以将其设置为桌面窗口句柄(用GetDesktopWindow函数获得)。
  ●Operation:用于指定要进行的操作。其中“open”操作表示执行由FileName参数指定的程序,或打开由FileName参数指定的文件或文件夹;“print”操作表示打印由FileName参数指定的文件;“explore”操作表示浏览由FileName参数指定的文件夹。当参数设为nil时,表示执行默认操作“open”。
  ●FileName:用于指定要打开的文件名、要执行的程序文件名或要浏览的文件夹名。
  ●Parameters:若FileName参数是一个可执行程序,则此参数指定命令行参数,否则此参数应为nil或PChar(0)。
  ●Directory:用于指定默认目录。
  ●ShowCmd:若FileName参数是一个可执行程序,则此参数指定程序窗口的初始显示方式,否则此参数应设置为0。
  若ShellExecute函数调用成功,则返回值为被执行程序的实例句柄。若返回值小于32,则表示出现错误。
  上述仅仅是ShellExecute函数的标准用法,下面将介绍它的特殊用法。

  2.特殊用法

  如果将FileName参数设置为“http:”协议格式,那么该函数将打开默认浏览器并链接到指定的URL地址。若用户机器中安装了多个浏览器,则该函数将根据Windows 9x/NT注册表中http协议处理程序(Protocols Handler)的设置确定启动哪个浏览器。

  格式一:http://网站域名。如:
                ShellExecute(handle, ‘open’, ‘http://www.neu.edu.cn’, nil, nil, SW_SHOWNORMAL);

  格式二:http://网站域名/网页文件名。如:
                ShellExecute(handle, ‘open’, ‘http://www.neu.edu.cn/default.htm’,nil,nil, SW_SHOWNORMAL);



  如果将FileName参数设置为“mailto:”协议格式,那么该函数将启动默认邮件客户程序,如Microsoft Outlook(也包括Microsoft Outlook Express)或Netscape Messanger。若用户机器中安装了多个邮件客户程序,则该函数将根据Windows 9x/NT注册表中mailto协议处理程序的设置确定启动哪个邮件客户程序。

  格式一:mailto: 如:
                ShellExecute(handle,'open','mailto:', nil, nil, SW_SHOWNORMAL);
                效果:打开新邮件窗口。

  格式二:mailto:用户账号@邮件服务器地址 如:
                ShellExecute(handle,'open','mailto:who@mail.neu.edu.cn', nil, nil, SW_SHOWNORMAL);
                效果:打开新邮件窗口,并自动填入收件人地址。若指定多个收件人地址,则收件人地址之间必须
                            用分号或逗号分隔开(下同)。

  格式三:mailto:用户账号@邮件服务器地址?subject=邮件主题&body=邮件正文 如:
                ShellExecute(handle,'open',' mailto:who@mail.neu.edu.cn?subject=Hello&Body=This is a test', nil, nil, SW_SHOWNORMAL);
                效果:打开新邮件窗口,并自动填入收件人地址、邮件主题和邮件正文
                            若邮件正文包括多行文本,则必须在每行文本之间加入换行转义字符%0a。

 实现方法

        新建一个Delphi工程,并在主窗体中加入两个标签控件HTTPLabel和MailToLabel。将标签控件的Font.Color属性设置为clBlue,Font.Style属性设置为空白,Cursor属性设置为crHandPoint,Caption属性分别设置为“欢迎惠顾我们的网站”和“给我们写信”。
  为模拟超链接效果,首先,在标签控件的MouseMove事件中将标签控件的Font.Color属性设置为clRed,Style属性设置为fsUnderline。

 procedure TForm1.HTTPLabelMouseMove(Sender: TObject; Shift: TShiftState; X,Y: Integer);
  begin
   HTTPLabel.Font.Color := clRed;
   HTTPLabel.Font.Style := [fsUnderline];
  end;
  procedure TForm1.MailToLabelMouseMove(Sender: TObject; Shift: TShiftState;X, Y: Integer);
  begin
   MailToLabel.Font.Color := clRed;
   MailToLabel.Font.Style := [fsUnderline];
  end;

  然后,在主窗体的MouseMove事件中将标签控件的Font.Color属性设置为clBlue,Font.Style属性设置为空白,以便鼠标离开标签控件时标签控件能够恢复原始显示状态。
 
  procedure TForm1.FormMouseMove(Sender: TObject; Shift: TShiftState; X,Y: Integer);
  begin
   HTTPLabel.Font.Color := clBlue;
   HTTPLabel.Font.Style := [];
   MailToLabel.Font.Color := clBlue;
   MailToLabel.Font.Style := [];
  end;

  最后,分别在两个标签控件的OnClick事件中加入网站链接或者发送邮件的程序代码即可。

  procedure TForm1.HTTPLabelClick(Sender: TObject);
  begin
   if ShellExecute(Handle,
   ‘open’,
   ‘http://www.neu.edu.cn’,
   nil,
   nil,
   SW_SHOWNORMAL) <= 32 then
   ShowMessage(‘发生网络错误!’);
  end;
  procedure TForm1.MailToLabelClick(Sender: TObject);
  begin
   if ShellExecute(Handle,
   ‘open’,
   ‘mailto:who@mail.neu.edu.cn’,
   nil,
   nil,
   SW_SHOWNORMAL) <= 32 then
   ShowMessage(‘发生邮递错误!’);
  end;

  注意:由于ShellExecute函数是在shellapi.pas单元中声明的,因此必须加入对shellapi.pas单元的引用:
  uses ShellAPI;

        当然,读者还可以自行尝试将其制作成超链接控件以便使用。
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 空腹彩超喝水了怎么办 鱼把厕.所堵了怎么办 螃蟹爬进厕所里怎么办 抄作业被老师发现怎么办 鱼把厕所堵了怎么办 刚憋尿上完厕所之后腹部很疼怎么办 小孩被老师投诉了家长怎么办 家长投诉被老师知道了怎么办 孩子上课不敢回答问题怎么办 孩子犯了错家长怎么办 错了不该错的题怎么办 不该错的题错了怎么办 小学生不爱写课堂作业怎么办 手被老师打肿了怎么办 老师反应孩子学习退步了怎么办 学护理的打屁股针怎么办 教师被投诉打学生怎么办 遇到内向的学生教师应该怎么办 教师遇到顽劣的学生怎么办 家长质疑老师的能力怎么办 和领导有冲突该怎么办 孩子叫也不听特别叛逆怎么办 孩子叛逆期不听妈妈的话怎么办 学生和老师反嘴怎么办? 两个月的宝宝不拉屎怎么办 老师受家长的气怎么办 家长故意在班级群里气老师怎么办 幼儿园阿姨体罚孩子家长该怎么办 学生钱丢了老师怎么办 胸肌一边大一边小怎么办 被爱的人抛弃了怎么办 深蹲以后腿疼怎么办 做完蹲起大腿疼怎么办 练腿之后腿疼怎么办 深蹲做完后腿疼怎么办 做完上下蹲腿疼怎么办 钓鱼子线长了怎么办 烤箱烤红薯没有锡纸怎么办 烤箱烤羊肉串滴油怎么办 黄金虎嘴脱臼了怎么办 孕妇吃了马头鱼怎么办