CnTaskBar.pas 23 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679
  1. {******************************************************************************}
  2. { CnPack For Delphi/C++Builder }
  3. { 中国人自己的开放源码第三方开发包 }
  4. { (C)Copyright 2001-2018 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 CnTaskBar;
  21. {* |<PRE>
  22. ================================================================================
  23. * 软件名称:不可视组件包
  24. * 单元名称:任务栏控制组件实现单元
  25. * 单元作者:不得闲
  26. * 移 植:Childe Ng
  27. * 备 注:
  28. * 开发平台:PWinXpPro + Delphi 5.01
  29. * 兼容测试:PWin9X/2000/XP + Delphi 5/6/7 + C++Builder 5/6
  30. * 本 地 化:该单元中的字符串均符合本地化处理方式
  31. * 单元标识:$Id$
  32. * 修改记录:2008.08.28 V1.0
  33. * 创建单元
  34. ================================================================================
  35. |</PRE>}
  36. interface
  37. {$I CnPack.inc}
  38. uses
  39. Windows, Classes, Messages, SysUtils, Forms, ShellAPI, CommCtrl, Graphics,
  40. CnNativeDecl;
  41. type
  42. TCnSysToolBarBtn = class(TPersistent)
  43. {* 任务栏按钮描述}
  44. private
  45. FBtnInfo: TTBButton;
  46. FBtnIndex: Integer;
  47. FBtnCaption: string;
  48. FIsSysHide: Boolean;//是否为系统隐藏图标
  49. FHandle: THandle; //事件处理句柄
  50. FPicture: TBitmap; //图标
  51. FBtnRect: TRect; //区域
  52. FVisible: Boolean;
  53. FEnabled: Boolean;
  54. FIsTrayBtn: Boolean;
  55. procedure SetVisible(const Value: Boolean);
  56. Constructor Create;
  57. procedure SetEnabled(const Value: Boolean);
  58. public
  59. Destructor Destroy;override;
  60. property BtnInfo: TTBButton read FBtnInfo;
  61. property BtnIndex: Integer read FBtnIndex;
  62. property BtnCaption: string read FBtnCaption;
  63. property BtnRect: TRect read FBtnRect;
  64. procedure AssignBtnInfo(Info: TTBButton);
  65. property IsSysHide: Boolean read FIsSysHide;
  66. property Picture: TBitmap read FPicture;
  67. property Handle: THandle read FHandle;
  68. property Visible: Boolean read FVisible write SetVisible;
  69. property Enabled: Boolean read FEnabled write SetEnabled;
  70. procedure Click;
  71. procedure DbClick;
  72. procedure RClick;
  73. end;
  74. TCnTaskBar = Class(TComponent)
  75. {* 任务栏操作组件}
  76. private
  77. FTrayBtnList, FTaskBtnList: TstringList;
  78. FHigherThenXp: Boolean; //是否为xp以上的系统版本
  79. FTrayBarHandle: THandle;
  80. FTaskBarHandle: THandle;
  81. FStartBtnHandle: THandle;
  82. FQuitLauchHandle: THandle;
  83. FReBarHandle: THandle;
  84. FProgramToolBarHandle: THandle;
  85. FImeRecHandle: THandle;
  86. FProgramContrainerHandle: THandle; //任务栏容器
  87. FHideTrayBtnHandle: THandle;
  88. FTrayNotifyHandle: THandle;
  89. FClockHandle: THandle;
  90. FShowHideBtn: Boolean;
  91. FVisible: Boolean;
  92. FQuickBarVisible: Boolean;
  93. FTaskToolBarVisible: Boolean;
  94. FTaskBarVisible: Boolean;
  95. FRegBarVisible: Boolean;
  96. FStartBtnVisible: Boolean;
  97. FImeBarVisible: Boolean;
  98. FTrayBarVisible: Boolean;
  99. FStartBtnEnabled: Boolean;
  100. function GetTrayBtnCount: Integer;
  101. function IsSysBtnHide(BtnState: Dword): Boolean;
  102. function GetTrayBtns(Index: Integer): TCnSysToolBarBtn;
  103. function GetTaskBtnCount: Integer;
  104. function GetTaskBtns(Index: Integer): TCnSysToolBarBtn;
  105. function GetStartBtnCaption: string;
  106. procedure GetIconList;
  107. procedure GetTaskList;
  108. procedure SetShowHideBtn(const Value: Boolean);
  109. procedure SetVisible(const Value: Boolean);
  110. procedure SetQuickBarVisible(const Value: Boolean);
  111. procedure SetTaskToolBarVisible(const Value: Boolean);
  112. procedure SetTaskBarVisible(const Value: Boolean);
  113. procedure SetReBaVisible(const Value: Boolean);
  114. procedure SetStartBtnVisible(const Value: Boolean);
  115. procedure SetImeBarVisible(const Value: Boolean);
  116. procedure SetTrayBarVisible(const Value: Boolean);
  117. procedure SetStartBtnCaption(const Value: string);
  118. procedure SetStartBtnEnabled(const Value: Boolean);
  119. protected
  120. procedure StartBtnWndProc(var Message: TMessage);
  121. public
  122. Constructor Create(AOwner: TComponent);override;
  123. destructor Destroy;override;
  124. procedure SetTimeDlg; //设置时间对话框
  125. procedure HideTrayBtnClick; //显示隐藏按扭单击
  126. procedure ImeRectBtnClick;//输入法按扭单击
  127. procedure ClearTrayBtnList; //清除托盘区列表
  128. procedure ClearTaskBtnList;
  129. procedure ShowTime;
  130. procedure StartBtnClick;
  131. procedure HideOn;
  132. procedure ShowOn;
  133. property TrayBarHandle: THandle read FTrayBarHandle;//托盘区句柄
  134. property TaskBarHandle: THandle read FTaskBarHandle;//任务栏句柄
  135. property StartBtnHandle: THandle read FStartBtnHandle;//开始按扭句柄
  136. property QuitLauchHandle: THandle read FQuitLauchHandle;//快速启动栏句柄
  137. property ImeRecHandle: THandle read FImeRecHandle;//输入法选择区域句柄
  138. property ProgramToolBarHandle: THandle read FProgramToolBarHandle;//程序最小化按扭容器
  139. property HideTrayBtnHandle: THandle read FHideTrayBtnHandle;//显示隐藏图标的按扭
  140. property ClockHandle: THandle read FClockHandle;//时钟显示区域
  141. property TrayBtnList: TstringList read FTrayBtnList;
  142. property TaskBtnList: TstringList read FTaskBtnList;
  143. property TrayBtnCount: Integer read GetTrayBtnCount;//托盘图标的个数
  144. property TaskBtnCount: Integer read GetTaskBtnCount;//任务栏应用程序按扭个数
  145. property TrayBtns[index: Integer]: TCnSysToolBarBtn read GetTrayBtns; //托盘按扭
  146. Property TaskBtns[index: Integer]: TCnSysToolBarBtn read GetTaskBtns; //任务栏按扭
  147. published
  148. property TrayBarVisible: Boolean read FTrayBarVisible write SetTrayBarVisible; //托盘区域隐藏
  149. property ImeBarVisible: Boolean read FImeBarVisible write SetImeBarVisible; //语言区域隐藏
  150. property ReBarVisible: Boolean read FRegBarVisible write SetReBaVisible;//任务栏按扭隐藏
  151. property TaskToolBarVisible: Boolean read FTaskToolBarVisible write SetTaskToolBarVisible;//任务栏应用程序区域隐藏
  152. property TaskBarVisible: Boolean read FTaskBarVisible write SetTaskBarVisible;//和上面一样
  153. property QuickBarVisible: Boolean read FQuickBarVisible write SetQuickBarVisible;//快速启动栏
  154. property Visible: Boolean read FVisible write SetVisible; //是否隐藏任务栏
  155. property ShowHideBtn: Boolean read FShowHideBtn write SetShowHideBtn;//是否显示系统隐藏的托盘按扭
  156. property StartBtnVisible: Boolean read FStartBtnVisible write SetStartBtnVisible;//开始按扭隐藏
  157. property StartBtnCaption: string read GetStartBtnCaption write SetStartBtnCaption; //开始按扭
  158. property StartBtnEnabled: Boolean read FStartBtnEnabled write SetStartBtnEnabled;//开始按扭
  159. end;
  160. implementation
  161. var
  162. hWndTip: DWORD;
  163. ToolInfo: TToolInfo;
  164. //得到BitNum的二进制位上的第bitPos位上的数字是为1还是为0
  165. function GetBitNum(bitPos: ShortInt; bitNum: Integer): ShortInt;
  166. begin
  167. Result := BitNum shr (BitPos - 1) and 1; //位数从1开始
  168. end;
  169. procedure AddTipTool(hWnd: DWORD; IconType: Integer;
  170. Title, Text: PChar; BackColor, FontColor: TColor);
  171. const
  172. TTS_BALLOON = $0040;
  173. TTM_SETTITLE = WM_USER + 32;
  174. begin
  175. hWndTip:= CreateWindow(TOOLTIPS_CLASS, nil,
  176. WS_POPUP or TTS_NOPREFIX or TTS_BALLOON or TTS_ALWAYSTIP,
  177. 0, 0, 0, 0, hWnd, 0, HInstance, nil);
  178. if hWndTip > 0 then
  179. begin
  180. ToolInfo.cbSize:= SizeOf(ToolInfo);
  181. ToolInfo.uFlags:= TTF_IDISHWND or TTF_SUBCLASS or TTF_TRANSPARENT;
  182. ToolInfo.lpszText:= Text;
  183. ToolInfo.uId:= hWnd;
  184. SendMessage(hWndTip, TTM_SETTIPBKCOLOR, BackColor, 0);
  185. SendMessage(hWndTip, TTM_SETTIPTEXTCOLOR, FontColor, 0);
  186. SendMessage(hWndTip, TTM_ADDTOOL, 0, Integer(@ToolInfo));
  187. SendMessage(hWndTip, TTM_SETTITLE, IconType, Integer(Title));
  188. end;
  189. InitCommonControls();
  190. end;
  191. { TCnTaskBar }
  192. procedure TCnTaskBar.ClearTaskBtnList;
  193. begin
  194. while FTaskBtnList.Count > 0 do
  195. begin
  196. FTaskBtnList.Objects[FTaskBtnList.Count - 1].Free;
  197. FTaskBtnList.Delete(FTaskBtnList.Count - 1);
  198. end;
  199. end;
  200. procedure TCnTaskBar.ClearTrayBtnList;
  201. begin
  202. while FTrayBtnList.Count > 0 do
  203. begin
  204. FTrayBtnList.Objects[FTrayBtnList.Count - 1].Free;
  205. FTrayBtnList.Delete(FTrayBtnList.Count - 1);
  206. end;
  207. end;
  208. constructor TCnTaskBar.Create(AOwner: TComponent);
  209. begin
  210. inherited Create(AOwner);
  211. FTrayBtnList := TstringList.Create;
  212. FTaskBtnList := TstringList.Create;
  213. FHigherThenXp := (Win32MajorVersion > 5) or ((Win32MajorVersion = 5) and (Win32MinorVersion > 0));
  214. FTaskBarHandle := FindWindow('Shell_TrayWnd', nil);
  215. FStartBtnHandle := FindWindowEx(FTaskBarHandle, 0, 'Button', nil);
  216. //if (OS.dwMajorVersion = 4) and (OS.dwMinorVersion = 10) then //98系统
  217. FReBarHandle := FindWindowEx(FTaskBarHandle, 0, 'ReBarWindow32', nil);
  218. FQuitLauchHandle := FReBarHandle;
  219. FProgramContrainerHandle := FindWindowEx(FQuitLauchHandle, 0, 'MSTaskSwWClass', nil);
  220. FImeRecHandle := FindWindowEx(FQuitLauchHandle, 0, 'CiceroUIWndFrame', nil);
  221. if FHigherThenXp then
  222. FProgramToolBarHandle := FindWindowEx(FProgramContrainerHandle, 0, 'ToolbarWindow32', nil)
  223. else FProgramToolBarHandle := FProgramContrainerHandle;
  224. FTrayBarHandle := FindWindowEx(FTaskBarHandle, 0, 'TrayNotifyWnd', nil);
  225. FTrayNotifyHandle := FTrayBarHandle;
  226. FClockHandle := FindWindowEx(FTrayBarHandle, 0, 'TrayClockWClass', nil);
  227. FHideTrayBtnHandle := FindWindowEx(FTrayBarHandle, 0, 'Button', nil);
  228. if FHigherThenXp then
  229. FTrayBarHandle := FindWindowEx(FTrayBarHandle, 0, 'SysPager', nil);
  230. if (Win32MajorVersion = 5) and (Win32MinorVersion >= 0) then
  231. FTrayBarHandle := FindWindowEx(FTrayBarHandle, 0, 'ToolbarWindow32', nil);
  232. FQuitLauchHandle := FindWindowEx(FQuitLauchHandle, 0, 'ToolbarWindow32', nil);//快速启动栏
  233. //SetWindowLong(FStartBtnHandle, GWL_WNDPROC, Longint(MakeObjectInstance(StartBtnWndProc)));
  234. GetIconList;
  235. GetTaskList;
  236. Visible := True;
  237. ReBarVisible := True;
  238. TaskBarVisible := True;
  239. QuickBarVisible := True;
  240. TaskToolBarVisible := True;
  241. StartBtnVisible := True;
  242. TrayBarVisible := True;
  243. ImeBarVisible := True;
  244. end;
  245. destructor TCnTaskBar.Destroy;
  246. begin
  247. ClearTrayBtnList;
  248. FTrayBtnList.Free;
  249. ClearTaskBtnList;
  250. FTaskBtnList.Free;
  251. inherited;
  252. end;
  253. procedure TCnTaskBar.GetIconList;
  254. var
  255. ThreadID: THandle;
  256. ThreadHandle: THandle; //线程句柄
  257. Buff: pchar;
  258. i, BtnCount: Integer;
  259. R: TCnNativeUInt;
  260. BtnInfo: TTBButton;
  261. SysHide: Boolean;
  262. SysToolBtn: TCnSysToolBarBtn;
  263. S: array[0..512] of char;
  264. BtnRect: TRect;
  265. begin
  266. GetWindowThreadProcessId(FTrayBarHandle, @ThreadID);//获取托盘窗口的线程 ID
  267. ThreadHandle := OpenProcess(PROCESS_VM_OPERATION or PROCESS_VM_READ or PROCESS_VM_WRITE, False, ThreadID);//得到线程句柄
  268. Buff := VirtualAllocEx(ThreadHandle, nil, 4096, MEM_RESERVE or MEM_COMMIT, PAGE_READWRITE);//指定进程的虚拟空间保留或提交内存区域,除非指定MEM_RESET参数,否则将该内存区域置0
  269. BtnCount := SendMessage(FTrayBarHandle, TB_BUTTONCOUNT, 0, 0);//得到托盘按扭个数
  270. //SendMessage(FTrayBarHandle, TB_GETIMAGELIST, 0, 0);
  271. //SendMessage(FTrayBarHandle, TB_GETBITMAPFLAGS, 0, 0);
  272. try
  273. for i := 0 to BtnCount - 1 do
  274. begin
  275. WriteProcessMemory(ThreadHandle, Buff, @BtnInfo, SizeOf(BtnInfo), R);
  276. SendMessage(FTrayBarHandle, TB_GETBUTTON, i, Integer(Buff));
  277. ReadProcessMemory(ThreadHandle, Buff, @BtnInfo, SizeOf(BtnInfo), R);
  278. SysHide := IsSysBtnHide(BtnInfo.fsState);
  279. if SysHide and (not FShowHideBtn) then
  280. Continue;
  281. SysToolBtn := TCnSysToolBarBtn.Create;
  282. SysToolBtn.FIsSysHide := SysHide;
  283. SysToolBtn.FVisible := not SysHide;
  284. SysToolBtn.AssignBtnInfo(BtnInfo);
  285. SysToolBtn.FIsTrayBtn := True;
  286. //SysToolBtn.FPicture.Canvas
  287. SysToolBtn.FBtnIndex := BtnInfo.idCommand;
  288. SendMessage(FTrayBarHandle, TB_GETBUTTONTEXT, SysToolBtn.FBtnInfo.idCommand, Integer(Integer(@Buff[0]) + SizeOf(@SysToolBtn.FBtnInfo)));
  289. ReadProcessMemory(ThreadHandle, Pointer(Integer(@Buff[0]) + SizeOf(@SysToolBtn.FBtnInfo)), @S[0], SizeOf(S), R);
  290. //if SysToolBtn.FBtnInfo.fsState = 12 then
  291. SysToolBtn.FBtnCaption := string(s);
  292. SysToolBtn.FHandle := FTrayBarHandle;
  293. if not SysHide then
  294. begin
  295. SendMessage(FTrayBarHandle, TB_GETRECT, BtnInfo.idCommand, Integer(Integer(@Buff[0]) + SizeOf(BtnInfo)));
  296. ReadProcessMemory(ThreadHandle, Pointer(Integer(@Buff[0]) + SizeOf(BtnInfo)), @BtnRect, SizeOf(BtnRect), R);//得到Rect信息
  297. SysToolBtn.FBtnRect := BtnRect;
  298. SysToolBtn.FPicture.Width := BtnRect.Right - BtnRect.Left;
  299. SysToolBtn.FPicture.Height := BtnRect.Bottom - BtnRect.Top;
  300. BitBlt(SysToolBtn.FPicture.Canvas.Handle, 0, 0, SysToolBtn.FPicture.Width, SysToolBtn.FPicture.Height,
  301. GetDc(FTrayBarHandle), BtnRect.Left, BtnRect.Top, SRCCOPY); //抓图
  302. end;
  303. FTrayBtnList.AddObject(SysToolBtn.FBtnCaption, SysToolBtn);
  304. {if BtnInfo.fsState <> TBSTATE_HIDDEN then //如果是隐藏的,则不显示出来
  305. begin
  306. //FTrayBtnList.Add(s)
  307. end;}
  308. end;
  309. finally
  310. VirtualFreeEx(ThreadHandle, Buff, 0, MEM_RELEASE);
  311. CloseHandle(ThreadHandle);
  312. end;
  313. end;
  314. function TCnTaskBar.GetTaskBtnCount: Integer;
  315. begin
  316. Result := FTaskBtnList.Count;
  317. end;
  318. function TCnTaskBar.GetTaskBtns(Index: Integer): TCnSysToolBarBtn;
  319. begin
  320. if (Index > -1 ) and (Index < FTaskBtnList.Count) then
  321. Result := TCnSysToolBarBtn(FTaskBtnList.Objects[Index])
  322. else Result := nil;
  323. end;
  324. procedure TCnTaskBar.GetTaskList;
  325. var
  326. i, BtnCount: Integer;
  327. ThreadId: LongInt;
  328. ThreadHandle: THandle;
  329. vBuffer: array[0..255] of Char;
  330. SysToolBtn: TCnSysToolBarBtn;
  331. BtnInfo: TTBButton;
  332. Buff: pointer;
  333. BtnRect: TRect;
  334. WriteNum: TCnNativeUInt;
  335. SysHide: Boolean;
  336. begin
  337. BtnCount := SendMessage(FProgramToolBarHandle, TB_BUTTONCOUNT, 0, 0);
  338. GetWindowThreadProcessId(FProgramToolBarHandle, @ThreadId);
  339. ThreadHandle := OpenProcess(PROCESS_VM_OPERATION or PROCESS_VM_READ or
  340. PROCESS_VM_WRITE, False, ThreadId);
  341. Buff := VirtualAllocEx(ThreadHandle, nil, 4096, MEM_RESERVE or MEM_COMMIT, PAGE_READWRITE);
  342. try
  343. for i := 0 to BtnCount - 1 do
  344. begin
  345. WriteProcessMemory(ThreadHandle, Buff, @BtnInfo, Sizeof(BtnInfo), WriteNum);
  346. SendMessage(FProgramToolBarHandle, TB_GETBUTTON, i, Integer(Buff));
  347. ReadProcessMemory(ThreadHandle, Buff, @BtnInfo, SizeOf(BtnInfo), WriteNum);
  348. SendMessage(FProgramToolBarHandle, TB_GETRECT, BtnInfo.idCommand, Integer(Integer(Buff) + SizeOf(BtnInfo)));
  349. ReadProcessMemory(ThreadHandle, Pointer(Integer(Buff) + SizeOf(BtnInfo)), @BtnRect, SizeOf(BtnRect), WriteNum);//得到Rect信息
  350. SysHide := (BtnRect.Right - BtnRect.Left = 0) and (BtnRect.Bottom - BtnRect.Top = 0);
  351. SysHide := IsSysBtnHide(BtnInfo.fsState) or SysHide;
  352. if SysHide and (not FShowHideBtn) then
  353. Continue;
  354. SysToolBtn := TCnSysToolBarBtn.Create;
  355. SysToolBtn.FIsSysHide := SysHide;
  356. SysToolBtn.FVisible := not SysHide;
  357. SysToolBtn.AssignBtnInfo(BtnInfo);
  358. SysToolBtn.FIsTrayBtn := false;
  359. //SysToolBtn.FPicture.Canvas
  360. SysToolBtn.FBtnIndex := BtnInfo.idCommand;
  361. SendMessage(FProgramToolBarHandle, TB_GETBUTTONTEXT, SysToolBtn.FBtnInfo.idCommand, Integer(Integer(Buff) + SizeOf(@SysToolBtn.FBtnInfo)));
  362. ReadProcessMemory(ThreadHandle, Pointer(Integer(Buff) + SizeOf(@SysToolBtn.FBtnInfo)), @VBuffer, SizeOf(VBuffer), WriteNum);
  363. SysToolBtn.FBtnCaption := string(VBuffer);
  364. SysToolBtn.FHandle := FProgramToolBarHandle;
  365. SysToolBtn.FBtnRect := BtnRect;
  366. FTaskBtnList.AddObject(SysToolBtn.FBtnCaption, SysToolBtn);
  367. end;
  368. finally
  369. VirtualFreeEx(ThreadHandle, Buff, 0, MEM_RELEASE);
  370. CloseHandle(ThreadHandle);
  371. end;
  372. end;
  373. function TCnTaskBar.GetTrayBtnCount: Integer;
  374. begin
  375. Result := FTrayBtnList.Count;
  376. end;
  377. function TCnTaskBar.GetTrayBtns(Index: Integer): TCnSysToolBarBtn;
  378. begin
  379. if (Index > -1 ) and (Index < FTrayBtnList.Count) then
  380. Result := TCnSysToolBarBtn(FTrayBtnList.Objects[Index])
  381. else Result := nil;
  382. end;
  383. procedure TCnTaskBar.HideTrayBtnClick;
  384. begin
  385. PostMessage(FHideTrayBtnHandle, WM_LButtonDown, 0, 0);
  386. PostMessage(FHideTrayBtnHandle, WM_LButtonUp, 0, 0);
  387. end;
  388. procedure TCnTaskBar.ImeRectBtnClick;
  389. begin
  390. PostMessage(FImeRecHandle, WM_LButtonDown, 0, MakeLParam(4, 5));
  391. PostMessage(FImeRecHandle, WM_LButtonUp, 0, MakeLParam(4, 5));
  392. end;
  393. function TCnTaskBar.IsSysBtnHide(BtnState: Dword): Boolean;
  394. begin
  395. Result := GetBitNum(4, BtnState) = 1;
  396. end;
  397. procedure TCnTaskBar.SetReBaVisible(const Value: Boolean);
  398. begin
  399. if (FRegBarVisible <> Value) and Visible then
  400. begin
  401. FRegBarVisible := Value;
  402. if Value then
  403. ShowWindow(FReBarHandle, SW_Normal)
  404. else
  405. ShowWindow(FReBarHandle, SW_Hide);
  406. end;
  407. end;
  408. procedure TCnTaskBar.SetQuickBarVisible(const Value: Boolean);
  409. begin
  410. if (FQuickBarVisible <> Value) and TaskBarVisible then
  411. begin
  412. FQuickBarVisible := Value;
  413. if Value then
  414. ShowWindow(FQuitLauchHandle, SW_Normal)
  415. else
  416. ShowWindow(FQuitLauchHandle, SW_Hide);
  417. end;
  418. end;
  419. procedure TCnTaskBar.SetShowHideBtn(const Value: Boolean);
  420. begin
  421. if FShowHideBtn <> Value then
  422. begin
  423. FShowHideBtn := Value;
  424. ClearTrayBtnList;
  425. GetIconList;
  426. ClearTaskBtnList;
  427. GetTaskList;
  428. end;
  429. end;
  430. procedure TCnTaskBar.SetTaskBarVisible(const Value: Boolean);
  431. begin
  432. if (FTaskBarVisible <> Value) and FRegBarVisible then
  433. begin
  434. FTaskBarVisible := Value;
  435. if Value then
  436. ShowWindow(FProgramContrainerHandle, SW_Normal)
  437. else
  438. ShowWindow(FProgramContrainerHandle, SW_Hide);
  439. end;
  440. end;
  441. procedure TCnTaskBar.SetTaskToolBarVisible(const Value: Boolean);
  442. begin
  443. if (FTaskToolBarVisible <> Value) and (FTaskBarVisible) then
  444. begin
  445. FTaskToolBarVisible := Value;
  446. if Value then
  447. ShowWindow(FProgramToolBarHandle, SW_Normal)
  448. else
  449. ShowWindow(FProgramToolBarHandle, SW_Hide);
  450. end;
  451. end;
  452. procedure TCnTaskBar.SetTimeDlg;
  453. begin
  454. winexec('rundll32.exe shell32.dll, Control_RunDLL timedate.cpl', 9);
  455. //SendMessage(FClockHandle, WM_LBUTTONDBLCLK, 0, MakeLong(2, 2));
  456. //SendMessage(FClockHandle, WM_LBUTTONUP, 0, MakeLong(2, 2));
  457. end;
  458. procedure TCnTaskBar.SetVisible(const Value: Boolean);
  459. begin
  460. if FVisible <> Value then
  461. begin
  462. FVisible := Value;
  463. if FVisible then
  464. ShowWindow(FTaskBarHandle, SW_NORMAL)
  465. else
  466. ShowWindow(FTaskBarHandle, SW_HIDE);
  467. end;
  468. end;
  469. procedure TCnTaskBar.ShowTime;
  470. begin
  471. AddTipTool(FProgramToolBarHandle, 1, PChar('时间显示'),
  472. PChar(DateToStr(now)), $00FFBFBF, $00A60053);//添加气泡提示
  473. end;
  474. procedure TCnTaskBar.StartBtnClick;
  475. begin
  476. SendMessage(self.FStartBtnHandle, WM_LBUTTONDOWN, 0, 0);
  477. SendMessage(self.FStartBtnHandle, WM_LBUTTONUP, 0, 0);
  478. end;
  479. procedure TCnTaskBar.StartBtnWndProc(var Message: TMessage);
  480. begin
  481. { if Message.Msg = WM_LButtonup then
  482. ShowMessage('sdf');}
  483. end;
  484. procedure TCnTaskBar.SetStartBtnVisible(const Value: Boolean);
  485. begin
  486. if (FStartBtnVisible <> Value) and Visible then
  487. begin
  488. FStartBtnVisible := Value;
  489. if Value then
  490. ShowWindow(FStartBtnHandle, SW_Normal)
  491. else
  492. ShowWindow(FStartBtnHandle, SW_Hide);
  493. end;
  494. end;
  495. procedure TCnTaskBar.SetImeBarVisible(const Value: Boolean);
  496. begin
  497. if (FImeBarVisible <> Value) and FRegBarVisible then
  498. begin
  499. FImeBarVisible := Value;
  500. if Value then
  501. ShowWindow(FImeRecHandle, SW_Normal)
  502. else
  503. ShowWindow(FImeRecHandle, SW_Hide);
  504. end;
  505. end;
  506. procedure TCnTaskBar.SetTrayBarVisible(const Value: Boolean);
  507. begin
  508. if (FTrayBarVisible <> Value) and FVisible then
  509. begin
  510. FTrayBarVisible := Value;
  511. if Value then
  512. ShowWindow(FTrayNotifyHandle, SW_Normal)
  513. else
  514. ShowWindow(FTrayNotifyHandle, SW_Hide);
  515. end;
  516. end;
  517. procedure TCnTaskBar.HideOn;
  518. begin
  519. ReBarVisible := False;
  520. TrayBarVisible := False;
  521. StartBtnVisible := False;
  522. end;
  523. procedure TCnTaskBar.ShowOn;
  524. begin
  525. ReBarVisible := True;
  526. TaskBarVisible := True;
  527. QuickBarVisible := True;
  528. TaskToolBarVisible := True;
  529. StartBtnVisible := True;
  530. TrayBarVisible := True;
  531. ImeBarVisible := True;
  532. end;
  533. { TCnSysToolBarBtn }
  534. procedure TCnSysToolBarBtn.AssignBtnInfo(Info: TTBButton);
  535. begin
  536. FBtnInfo.iBitmap := Info.iBitmap;
  537. FBtnInfo.idCommand := Info.idCommand;
  538. FBtnInfo.fsState := Info.fsState;
  539. FBtnInfo.fsStyle := Info.fsStyle;
  540. FBtnInfo.bReserved := Info.bReserved;
  541. FBtnInfo.dwData := Info.dwData;
  542. FBtnInfo.istring := Info.istring;
  543. end;
  544. procedure TCnSysToolBarBtn.Click;
  545. begin
  546. SendMessage(FHandle, WM_LBUTTONDOWN, 0, MakeLong(FBtnRect.Left + 2, FBtnRect.Top + 2));
  547. SendMessage(FHandle, WM_LBUTTONUP, 0, MakeLong(FBtnRect.Left + 2, FBtnRect.Top + 2));
  548. end;
  549. constructor TCnSysToolBarBtn.Create;
  550. begin
  551. Inherited Create;
  552. FillChar(FBtnInfo, SizeOf(FBtnInfo), 0);
  553. FPicture := TBitMap.Create;
  554. end;
  555. procedure TCnSysToolBarBtn.DbClick;
  556. begin
  557. SendMessage(FHandle, WM_LBUTTONDBLCLK, 0, MakeLong(FBtnRect.Left + 2, FBtnRect.Top + 2));
  558. SendMessage(FHandle, WM_LBUTTONUP, 0, MakeLong(FBtnRect.Left + 2, FBtnRect.Top + 2));
  559. end;
  560. destructor TCnSysToolBarBtn.Destroy;
  561. begin
  562. FPicture.Free;
  563. if (not isSysHide) and (not FVisible) then
  564. Visible := True
  565. else if IsSysHide and FVisible then
  566. Visible := False;
  567. ZeroMemory(Pointer(@FBtnInfo), Sizeof(FBtnInfo));
  568. inherited;
  569. end;
  570. procedure TCnSysToolBarBtn.RClick;
  571. begin
  572. SendMessage(FHandle, WM_RBUTTONDOWN, 0, MakeLong(FBtnRect.Left + 2, FBtnRect.Top + 2));
  573. SendMessage(FHandle, WM_RBUTTONUP, 0, MakeLong(FBtnRect.Left + 2, FBtnRect.Top + 2));
  574. end;
  575. procedure TCnSysToolBarBtn.SetEnabled(const Value: Boolean);
  576. begin
  577. if FVisible <> Value then
  578. begin
  579. FVisible := Value;
  580. EnableWindow(FHandle, Value);
  581. end;
  582. end;
  583. procedure TCnSysToolBarBtn.SetVisible(const Value: Boolean);
  584. begin
  585. if FVisible <> Value then
  586. begin
  587. FVisible := Value;
  588. if FVisible then
  589. SendMessage(FHandle, TB_HIDEBUTTON, BtnInfo.idCommand, 0)
  590. else
  591. SendMessage(FHandle, TB_HIDEBUTTON, BtnInfo.idCommand, 1);
  592. end;
  593. end;
  594. procedure TCnTaskBar.SetStartBtnCaption(const Value: string);
  595. begin
  596. SendMessage(FStartBtnHandle, WM_SETTEXT, 0, Integer(PChar(Value)));
  597. end;
  598. function TCnTaskBar.GetStartBtnCaption: string;
  599. var
  600. buff: array[0..255] of char;
  601. begin
  602. SendMessage(FStartBtnHandle, WM_GETTEXT, 256, Integer(@Buff));
  603. Result := buff;
  604. end;
  605. procedure TCnTaskBar.SetStartBtnEnabled(const Value: Boolean);
  606. begin
  607. if FStartBtnEnabled <> Value then
  608. begin
  609. FStartBtnEnabled := Value;
  610. EnableWindow(FStartBtnHandle, Value);
  611. end;
  612. end;
  613. end.