CnOuterControls.pas 7.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230
  1. {******************************************************************************}
  2. { CnPack For Delphi/C++Builder }
  3. { 中国人自己的开放源码第三方开发包 }
  4. { (C)Copyright 2001-2006 CnPack 开发组 }
  5. { ------------------------------------ }
  6. { }
  7. { 本开发包是开源的自由软件,您可以遵照 CnPack 的发布协议来修 }
  8. { 改和重新发布这一程序。 }
  9. { }
  10. { 发布这一开发包的目的是希望它有用,但没有任何担保。甚至没有 }
  11. { 适合特定目的而隐含的担保。更详细的情况请参阅 CnPack 发布协议。 }
  12. { }
  13. { 您应该已经和开发包一起收到一份 CnPack 发布协议的副本。如果 }
  14. { 还没有,可访问我们的网站: }
  15. { }
  16. { 网站地址:http://www.cnpack.org }
  17. { 电子邮件:master@cnpack.org }
  18. { }
  19. {******************************************************************************}
  20. unit CnOuterControls;
  21. {* |<PRE>
  22. ================================================================================
  23. * 软件名称:系统功能组件包
  24. * 单元名称:实现对外部程序控制单元
  25. * 单元作者:rarnu(rarnu@cnpack.org)
  26. * 备 注:
  27. * 开发平台:Windows2003 Server + Delphi2007 up2
  28. * 兼容测试:Windows2000/XP/2003/Vista + Delphi 7/2006/2007/2009
  29. * 本 地 化:该单元中的字符串均符合本地化处理方式
  30. * 单元标识:$Id$
  31. * 修改记录:2008.08.14 V1.0
  32. * 创建单元
  33. ================================================================================
  34. |</PRE>}
  35. interface
  36. {$I CnPack.inc}
  37. uses
  38. SysUtils, Classes, Windows, TlHelp32;
  39. type
  40. TProcessInfo = record
  41. pHandle: Cardinal;
  42. pClassName: string;
  43. pText: string;
  44. end;
  45. type
  46. TOnSendMessage = procedure(Sender: TObject; SndMsgResult: Cardinal) of object;
  47. TOnWindowChange = procedure(Sender: TObject) of object;
  48. type
  49. TCnOuterControls = class(TComponent)
  50. private
  51. fProcessHandle: THandle;
  52. fTextList: TStringList;
  53. fHandleList: TStringList;
  54. fClassList: TStringList;
  55. fWindowCaption: string;
  56. fSM: Cardinal;
  57. fSLP: Cardinal;
  58. fSWP: Cardinal;
  59. fSMH: THandle;
  60. fOnSendMessage: TOnSendMessage;
  61. fOnWindowChange: TOnWindowChange;
  62. fPossibleWindow: TStringList;
  63. procedure SetProcessHandle(const Value: THandle);
  64. procedure SetWindowCaption(const Value: string);
  65. public
  66. constructor Create(AOwner: TComponent); override;
  67. {* 获取可用的窗口 }
  68. function GetPossibleWindows: TStringList;
  69. {* 获取指定 index 的组件信息 }
  70. function GetProcessControlInfo(index: Integer): TProcessInfo;
  71. {* 向指定组件发送消息 }
  72. procedure SendMessageToControl; overload;
  73. procedure SendMessageToControl(hWnd: THandle; Msg: Cardinal; WParam: Cardinal; LParam: Cardinal); overload;
  74. published
  75. {* 可用的窗口列表 }
  76. property PossibleWindows: TStringList read fPossibleWindow write fPossibleWindow;
  77. {* 发送消息时触发事件 }
  78. property OnSendMessage: TOnSendMessage read fOnSendMessage write fOnSendMessage;
  79. {* 窗口有改动时触发事件 }
  80. property OnWindowChange: TOnWindowChange read fOnWindowChange write fOnWindowChange;
  81. property SndMsgHandle: THandle read fSMH write fSMH;
  82. property SndMessage: Cardinal read fSM write fSM;
  83. property SndLParam: Cardinal read fSLP write fSLP;
  84. property SndWParam: Cardinal read fSWP write fSWP;
  85. property ProcessHandle: THandle read fProcessHandle write SetProcessHandle;
  86. {* 可用的句柄列表 }
  87. property HandleList: TStringList read fHandleList;
  88. {* 可用的类列表 }
  89. property ClassList: TStringList read fClassList;
  90. {* 可用的界面文本列表 }
  91. property TextList: TStringList read fTextList;
  92. {* 窗口标题 }
  93. property WindowCaption: string read fWindowCaption write SetWindowCaption;
  94. end;
  95. var
  96. IHandleList: TStringList;
  97. IClassList: TStringList;
  98. ITextList: TStringList;
  99. {* 此处使用回调函数来完成窗口的遍历与取值 }
  100. function EnumChildWndProc(AhWnd: LongInt; AlParam: LParam): boolean; stdcall;
  101. function EnumWindowsFunc(Handle: THandle; List: TStringList): boolean; stdcall;
  102. implementation
  103. function EnumChildWndProc(AhWnd: LongInt; AlParam: LParam): boolean; stdcall;
  104. var
  105. WndClassName: array[0..511] of Char;
  106. WndCaption: array[0..511] of Char;
  107. begin
  108. GetClassName(AhWnd, WndClassName, 512); //获取控件名称
  109. GetWindowText(AhWnd, WndCaption, 512); //获取控件标题
  110. IHandleList.Add(IntToStr(AhWnd));
  111. IClassList.Add(string(WndClassName));
  112. ITextList.Add(string(WndCaption));
  113. result := true;
  114. end;
  115. function EnumWindowsFunc(Handle: THandle; List: TStringList): boolean; stdcall;
  116. var
  117. Caption: array[0..511] of Char;
  118. begin
  119. if GetWindowText(Handle, Caption, 512) <> 0 then
  120. begin
  121. if List.IndexOf(Caption) = -1 then
  122. List.Add(Caption);
  123. end;
  124. result := true;
  125. end;
  126. { TCnOuterControls }
  127. constructor TCnOuterControls.Create(AOwner: TComponent);
  128. begin
  129. inherited Create(AOwner);
  130. fTextList := TStringList.Create;
  131. fTextList.Clear;
  132. fHandleList := TStringList.Create;
  133. fHandleList.Clear;
  134. fClassList := TStringList.Create;
  135. fClassList.Clear;
  136. IHandleList := TStringList.Create;
  137. IHandleList.Clear;
  138. IClassList := TStringList.Create;
  139. IClassList.Clear;
  140. ITextList := TStringList.Create;
  141. ITextList.Clear;
  142. fPossibleWindow := TStringList.Create;
  143. fPossibleWindow.Clear;
  144. GetPossibleWindows;
  145. end;
  146. function TCnOuterControls.GetPossibleWindows: TStringList;
  147. begin
  148. fPossibleWindow.Clear;
  149. EnumWindows(@EnumWindowsFunc, LParam(fPossibleWindow));
  150. result := fPossibleWindow;
  151. end;
  152. function TCnOuterControls.GetProcessControlInfo(
  153. index: Integer): TProcessInfo;
  154. var
  155. piInfo: TProcessInfo;
  156. begin
  157. piInfo.pHandle := 0;
  158. piInfo.pClassName := '';
  159. piInfo.pText := '';
  160. if fHandleList.Count - 1 < index then
  161. begin
  162. result := piInfo;
  163. Exit;
  164. end;
  165. piInfo.pHandle := StrToInt(fHandleList.Strings[index]);
  166. piInfo.pClassName := fClassList.Strings[index];
  167. piInfo.pText := fTextList.Strings[index];
  168. result := piInfo;
  169. end;
  170. procedure TCnOuterControls.SendMessageToControl;
  171. var
  172. SndResult: Cardinal;
  173. begin
  174. SndResult := SendMessage(fSMH, fSM, fSWP, fSLP);
  175. if Assigned(OnSendMessage) then
  176. OnSendMessage(self, SndResult);
  177. end;
  178. procedure TCnOuterControls.SendMessageToControl(hWnd: THandle; Msg, WParam,
  179. LParam: Cardinal);
  180. var
  181. SndResult: Cardinal;
  182. begin
  183. SndResult := SendMessage(hWnd, Msg, WParam, LParam);
  184. if Assigned(OnSendMessage) then
  185. OnSendMessage(self, SndResult);
  186. end;
  187. procedure TCnOuterControls.SetProcessHandle(const Value: THandle);
  188. begin
  189. fProcessHandle := Value;
  190. IHandleList.Clear;
  191. IClassList.Clear;
  192. ITextList.Clear;
  193. if fProcessHandle <> 0 then EnumChildWindows(fProcessHandle, @EnumChildWndProc, 0);
  194. fTextList := ITextList;
  195. fHandleList := IHandleList;
  196. fClassList := IClassList;
  197. if Assigned(OnWindowChange) then
  198. OnWindowChange(self);
  199. end;
  200. procedure TCnOuterControls.SetWindowCaption(const Value: string);
  201. begin
  202. fWindowCaption := Value;
  203. ProcessHandle := FindWindow(nil, PChar(fWindowCaption));
  204. end;
  205. end.