delphi – 检测RichEdit中的点击URL

前端之家收集整理的这篇文章主要介绍了delphi – 检测RichEdit中的点击URL前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我正在尝试更新RichEdit,以便它检测URL并允许单击它以在浏览器中打开.检测URL很简单,我只使用 http://www.scalabium.com/faq/dct0146.htm中的以下代码
  1. mask := SendMessage(MNote.Handle,EM_GETEVENTMASK,0);
  2. SendMessage(MNote.Handle,EM_SETEVENTMASK,mask or ENM_LINK);
  3. SendMessage(MNote.Handle,EM_AUTOURLDETECT,Integer(True),0);

但第二部分对我不起作用.他们提供以下代码来捕获EN_LINK消息并对其进行处理:

  1. type
  2. TForm1 = class(TForm)
  3. protected
  4. procedure WndProc(var Message: TMessage); override;
  5. end;
  6. ...
  7.  
  8. procedure TForm1.WndProc(var Message: TMessage);
  9. var
  10. p: TENLink;
  11. strURL: string;
  12. begin
  13. if (Message.Msg = WM_NOTIFY) then
  14. begin
  15. if (PNMHDR(Message.LParam).code = EN_LINK) then
  16. begin
  17. p := TENLink(Pointer(TWMNotify(Message).NMHdr)^);
  18. if (p.msg = WM_LBUTTONDOWN) then
  19. begin
  20. SendMessage(RichEdit1.Handle,EM_EXSETSEL,LongInt(@(p.chrg)));
  21. strURL := RichEdit1.SelText;
  22. ShellExecute(Handle,'open',PChar(strURL),SW_SHOWNORMAL);
  23. end
  24. end
  25. end;
  26.  
  27. inherited;
  28. end;

当我运行程序时,检测到URL,但点击它不会做任何事情.使用调试我发现当我点击URL时,Message.Msg = WM_NOTIFY不成立.然后我试图覆盖TRichEdit的WndProc,但结果是一样的.有什么建议么?

解决方法

对RichEdit的WindowProc属性进行子类化并查找CN_NOTIFY消息,例如:
  1. type
  2. TForm1 = class(TForm)
  3. RichEdit1: TRichEdit;
  4. procedure FormCreate(Sender: TObject);
  5. private
  6. PrevRichEditWndProc: TWndMethod;
  7. procedure RichEditWndProc(var Message: TMessage);
  8. procedure SetRichEditMasks;
  9. end;
  10.  
  11. procedure TForm1.FormCreate(Sender: TObject);
  12. begin
  13. PrevRichEditWndProc := RichEdit1.WindowProc;
  14. RichEdit1.WindowProc := RichEditWndProc;
  15. SetRichEditMasks;
  16. end;
  17.  
  18. procedure TForm1.SetRichEditMasks;
  19. var
  20. mask: Longint;
  21. begin
  22. mask := SendMessage(RichEdit1.Handle,0);
  23. SendMessage(RichEdit1.Handle,mask or ENM_LINK);
  24. SendMessage(RichEdit1.Handle,1,0);
  25. end;
  26.  
  27. procedure TForm1.RichEditWndProc(var Message: TMessage);
  28. begin
  29. PrevRichEditWndProc(Message);
  30. case Message.Msg of
  31. CN_NOTIFY:
  32. begin
  33. if (TWMNotify(Message).NMHdr^.code = EN_LINK) then
  34. begin
  35. with PENLink(Message.LParam)^ do
  36. begin
  37. if (msg = WM_LBUTTONDOWN) then
  38. begin
  39. SendMessage(RichEdit1.Handle,LongInt(@chrg));
  40. ShellExecute(Handle,PChar(RichEdit1.SelText),SW_SHOWNORMAL);
  41. end;
  42. end;
  43. end;
  44. end;
  45. CM_RECREATEWND:
  46. begin
  47. SetRichEditMasks;
  48. end;
  49. end;
  50. end;

猜你在找的Delphi相关文章