{"id":291,"date":"2009-04-06T12:34:00","date_gmt":"2009-04-06T04:34:00","guid":{"rendered":""},"modified":"2013-11-18T21:01:18","modified_gmt":"2013-11-18T13:01:18","slug":"%e8%8e%b7%e5%8f%96%e7%b3%bb%e7%bb%9f%e6%89%98%e7%9b%98%e5%8c%ba%e5%9b%be%e6%a0%87%e5%9d%90%e6%a0%87","status":"publish","type":"post","link":"https:\/\/kyle.ai\/blog\/291.html","title":{"rendered":"\u83b7\u53d6\u7cfb\u7edf\u6258\u76d8\u533a\u56fe\u6807\u5750\u6807"},"content":{"rendered":"<pre class=\"brush: delphi; title: ; notranslate\" title=\"\">\r\n\/\/\/ \u83b7\u53d6\u7cfb\u7edf\u6258\u76d8\u67d0\u4e2a\u56fe\u6807\u7684\u5750\u6807\u533a\u57df\uff0c\u5982\u679c\u8981\u9690\u85cf\u67d0\u4e2a\u56fe\u6807\u4f8b\u5982\u97f3\u91cf\u7684\u56fe\u6807\uff0c\u4e5f\u5f88\u65b9\u4fbf\uff0c\u6539\u6539\u5c31\u53ef\u4ee5\u4e86\r\nfunction GetSysTrayIconRect(Text: string): TRect;\r\n{\r\n   \u8fd4\u56de\u7cfb\u7edf\u6258\u76d8\u4e2d\u6307\u5b9a\u6587\u5b57\u7684\u56fe\u6807\u7684\u77e9\u5f62\u533a\u57df\u3002\r\n   \u4f8b\u5982\u8fd4\u56de\u97f3\u91cf\u63a7\u5236\u56fe\u6807\u7684\u77e9\u5f62\u533a\u57df\uff1a\r\n   GetSysTrayIconRect(\u2018\u97f3\u91cf\u2019);\r\n}\r\nbegin\r\n   result := GetToolBarButtonRect(GetSysTrayWnd, Text);\r\nend;\r\n\r\nfunction GetSysTrayWnd: HWND;\r\n{\r\n   \u8fd4\u56de\u7cfb\u7edf\u6258\u76d8\u7684\u53e5\u67c4\uff0c\u9002\u5408\u4e8eWinXP\u4ee5\u4e0a\u7248\u672c\r\n}\r\nbegin\r\n   result := FindWindow(\u2018Shell_TrayWnd\u2019, nil);\r\n   result := FindWindowEx(result, 0, \u2018TrayNotifyWnd\u2019, nil);\r\n   result := FindWindowEx(result, 0, \u2018SysPager\u2019, nil);\r\n   result := FindWindowEx(result, 0, \u2018ToolbarWindow32\u2032, nil);\r\nend;\r\n\r\nfunction GetToolBarButtonRect(hWnd: HWND; Title: string): TRect;\r\n{\r\n   \u8fd4\u56de\u6307\u5b9a\u5de5\u5177\u680f\u5bf9\u5e94\u7684\u6309\u94ae\u6307\u5b9a\u6587\u672c\u7684\u77e9\u5f62\u533a\u57df\r\n   hWnd:\u5de5\u5177\u680f\u53e5\u67c4\uff0cTitle\uff1a\u9700\u8981\u8fd4\u56de\u77e9\u5f62\u533a\u57df\u7684\u6309\u94ae\u6587\u5b57\r\n   \u8fd4\u56de\u503c\uff1a\u6307\u5b9a\u6309\u94ae\u7684\u8fb9\u754c\u77e9\u5f62\uff0c\u5c4f\u5e55\u5750\u6807\r\n}\r\nvar\r\n   C, i: integer;\r\n   Inf _TBBUTTON;\r\n   Item: tagTCITEM;\r\n   Buff: PChar;\r\n   S: array&#x5B;0..1024] of char;\r\n   PID: THandle;\r\n   PRC: THandle;\r\n   R: Cardinal;\r\nbegin\r\n   FillChar(result, SizeOf(result), 0);\r\n   if hWnd = 0 then Exit;\r\n   GetWindowThreadProcessId(hWnd, @PID);\r\n   PRC := OpenProcess(PROCESS_VM_OPERATION or PROCESS_VM_READ or PROCESS_VM_WRITE, False, PID);\r\n   Buff := VirtualAllocEx(PRC, nil, 4096, MEM_RESERVE or MEM_COMMIT, PAGE_READWRITE);\r\n\r\n   if Format(\u2018%d.%d\u2019, &#x5B;Win32MajorVersion, Win32MinorVersion]) &gt;= \u20195.1\u2032 then {\/\/ Is Windows XP or Higher}\r\n   begin\r\n     C := SendMessage(hWnd, TB_BUTTONCOUNT, 0, 0);\r\n     for i := 0 to C \u2013 1 do\r\n     begin\r\n       FillChar(Info, SizeOf(Info), 0);\r\n       WriteProcessMemory(PRC, Buff, @Info, SizeOf(Info), R);\r\n\r\n       SendMessage(hWnd, TB_GETBUTTON, i, integer(Buff));\r\n       ReadProcessMemory(PRC, Buff, @Info, SizeOf(Info), R);\r\n\r\n       SendMessage(hWnd, TB_GETBUTTONTEXT, Info.idCommand, integer(integer(@Buff&#x5B;0]) + SizeOf(Info)));\r\n       ReadProcessMemory(PRC, Pointer(integer(@Buff&#x5B;0]) + SizeOf(Info)), @S&#x5B;0], SizeOf(S), R);\r\n       if SameText(StrPas(S), Title) and not Boolean(SendMessage(hWnd, TB_ISBUTTONHIDDEN, Info.idCommand, 0)) then\r\n       begin\r\n         SendMessage(hWnd, TB_GETRECT, Info.idCommand, integer(integer(@Buff&#x5B;0]) + SizeOf(Info)));\r\n         ReadProcessMemory(PRC, Pointer(integer(@Buff&#x5B;0]) + SizeOf(Info)), @result, SizeOf(result), R);\r\n\r\n         Windows.ClientToScreen(hWnd, result.TopLeft);\r\n         Windows.ClientToScreen(hWnd, result.BottomRight);\r\n\r\n         Break;\r\n       end;\r\n     end;\r\n   end\r\n   else\r\n   begin\r\n     C := SendMessage(hWnd, TCM_GETITEMCOUNT, 0, 0);\r\n     for i := 0 to C \u2013 1 do\r\n     begin\r\n       with Item do\r\n       begin\r\n         mask := TCIF_TEXT;\r\n         dwState := 0;\r\n         dwStateMask := 0;\r\n         cchTextMax := 2048;\r\n         pszText := PChar(integer(Buff) + SizeOf(Item) * 4);\r\n         iImage := 0;\r\n         lParam := 0;\r\n       end;\r\n       WriteProcessMemory(PRC, Buff, @Item, SizeOf(Item), R);\r\n       SendMessage(hWnd, TCM_GETITEM, i, Integer(Buff));\r\n\r\n       ReadProcessMemory(PRC, Buff, @Item, SizeOf(Item), R);\r\n       ReadProcessMemory(PRC, PChar(integer(Buff) + SizeOf(Item) * 4), @S&#x5B;0], SizeOf(S), R);\r\n\r\n       if SameText(S, Title) then\r\n       begin\r\n         SendMessage(hWnd, TCM_GETITEMRECT, i, integer(Buff));\r\n         ReadProcessMemory(PRC, Buff, @result, SizeOf(result), R);\r\n\r\n         Windows.ClientToScreen(hWnd, result.TopLeft);\r\n         Windows.ClientToScreen(hWnd, result.BottomRight);\r\n         Break;\r\n       end;\r\n     end;\r\n   end;\r\n\r\n   VirtualFreeEx(PRC, Buff, 0, MEM_RELEASE);\r\n   CloseHandle(PRC);\r\nend;\r\n\r\n<\/pre>\n<pre class=\"brush: plain; title: ; notranslate\" title=\"\">\r\n\r\nTCM_ADJUSTRECT        TB_ADDBITMAP             TB_SETTOOLTIPS\r\nTCM_DELETEALLITEM     TB_ADDBUTTONS            TB_GETMAXSIZE\r\nTCM_DELETEITEM        TB_ADDSTRING             TB_GETOBJECT\r\nTCM_DESELECTALL       TB_AUTOSIZE              TB_GETPADDING\r\nTCM_GETCURFOCUS       TB_BUTTONCOUNT           TB_GETRECT\r\nTCM_GETCURSEL         TB_BUTTONSTRUCTSIZE      TB_GETROWS\r\nTCM_GETEXTENDEDSTYLE TB_CHANGEBITMAP          TB_GETSTATE\r\nTCM_GETIMAGELIST      TB_CHECKBUTTON           TB_GETSTYLE\r\nTCM_GETITEM           TB_COMMANDTOINDEX        TB_GETTEXTROWS\r\nTCM_GETITEMCOUNT      TB_CUSTOMIZE             TB_GETTOOLTIPS\r\nTCM_GETITEMRECT       TB_DELETEBUTTON          TB_HIDEBUTTON\r\nTCM_GETROWCOUNT       TB_ENABLEBUTTON          TB_HITTEST\r\nTCM_GETTOOLTIPS       TB_GETANCHORHIGHLIGHT    TB_INDETERMINATE\r\nTCM_HIGHLISHTITEM     TB_GETBITMAP             TB_INSERTBUTTON\r\nTCM_HITTEST           TB_GETBITMAPFLAGS        TB_INSERTMARKHITTEST\r\nTCM_INSERTITEM        TB_GETBUTTON             TB_ISBUTTONCHECKED\r\nTCM_REMOVEIMAGE       TB_GETBUTTONINFO         TB_ISBUTTONENABLED\r\nTCM_SETCURFOCUS       TB_GETBUTTONSIZE         TB_ISBUTTONHIDDEN\r\nTCM_SETCURSEL         TB_GETBUTTONTEXT         TB_ISBUTTONHIGHLIGHTED\r\nTCM_SETEXTENDEDSTYLE TB_GETDISABLEDIMAGELIST TB_ISBUTTONINDETERMINATE\r\nTCM_SETIMAGELIST      TB_GETEXTENDEDSTYLE      TB_ISBUTTONPRESSED\r\nTCM_SETITEM           TB_GETHOTIMAGELIST       TB_LOADIMAGES\r\nTCM_SETITEMEXTRA      TB_GETHOTITEM            TB_MAPACCELERATOR\r\nTCM_SETITEMSIZE       TB_GETIMAGELIST          TB_MARKBUTTON\r\nTCM_SETMINTABWIDTH    TB_GETINSERTMARK         TB_MOVEBUTTON\r\nTCM_SETPADDING        TB_GETINSERTMARKCOLOR    TB_PRESSBUTTON\r\nTCM_SETTOOLTIPS       TB_GETITEMRECT           TB_REPLACEBITMAP\r\nTB_SAVERESTORE        TB_SETANCHORHIGHLIGHT    TB_SETBITMAPSIZE\r\nTB_SETBUTTONINFO      TB_SETBUTTONSIZE         TB_SETBUTTONWIDTH\r\nTB_SETCMDID           TB_SETDISABLEDIMAGELIST TB_SETEXTENDEDSTYLE\r\nTB_SETHOTIMAGELIST    TB_SETHOTITEM            TB_SETIMAGELIST\r\nTB_SETINDENT          TB_SETINSERTMARK         TB_SETINSERTMARKCOLOR\r\nTB_SETMAXTEXTROWS     TB_SETPADDING            TB_SETPARENT\r\nTB_SETROWS            TB_SETSTATE              TB_SETSTYLE\r\n\r\nuses CommCtrl;\r\n<\/pre>\n","protected":false},"excerpt":{"rendered":"<p>\/\/\/ \u83b7\u53d6\u7cfb\u7edf\u6258\u76d8\u67d0\u4e2a\u56fe\u6807\u7684\u5750\u6807\u533a\u57df\uff0c\u5982\u679c\u8981\u9690\u85cf\u67d0\u4e2a\u56fe\u6807\u4f8b\u5982\u97f3\u91cf\u7684\u56fe\u6807\uff0c\u4e5f\u5f88\u65b9\u4fbf\uff0c\u6539\u6539\u5c31\u53ef\u4ee5\u4e86 functi [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[6],"tags":[],"class_list":["post-291","post","type-post","status-publish","format-standard","hentry","category-code_related"],"_links":{"self":[{"href":"https:\/\/kyle.ai\/blog\/wp-json\/wp\/v2\/posts\/291","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/kyle.ai\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/kyle.ai\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/kyle.ai\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/kyle.ai\/blog\/wp-json\/wp\/v2\/comments?post=291"}],"version-history":[{"count":1,"href":"https:\/\/kyle.ai\/blog\/wp-json\/wp\/v2\/posts\/291\/revisions"}],"predecessor-version":[{"id":4790,"href":"https:\/\/kyle.ai\/blog\/wp-json\/wp\/v2\/posts\/291\/revisions\/4790"}],"wp:attachment":[{"href":"https:\/\/kyle.ai\/blog\/wp-json\/wp\/v2\/media?parent=291"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/kyle.ai\/blog\/wp-json\/wp\/v2\/categories?post=291"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/kyle.ai\/blog\/wp-json\/wp\/v2\/tags?post=291"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}