实现 SPY++ 的 FindWindow Tool 的高亮

CSDN=>FAQ=>FAQ 展示  问题内容:实现 SPY++ 的 FindWindow Tool 的高亮(highlight)一个应用程序的窗体或内部 Object 的边缘
原讨论链接:http://community.csdn.net/expert/topicview1.asp?id=1887333
所属论坛:Windows SDK/API     审核组:Delphi
提问者:shuixin13     解决者:shuixin13
感谢:lion_lh、firetoucher、Intelement
关键字:
答案:
方法一:
通过 SelectObject 来实现

procedure InvertTracker(hwndDest: HWND);
//画边框
var
 hdcDest   : HWND;
 hPen      : HWND;
 hOldPen   : HWND;
 hOldBrush : HWND;
 cr        : HWND;
 rc        : TRect;
begin
 GetWindowRect(hwndDest, rc);
 hdcDest := GetWindowDC(hwndDest);
 SetROP2(hdcDest,R2_NOT);
 cr    := clBlack;
 hPen  := CreatePen(PS_INSIDEFRAME,2,cr);

 hOldPen   := SelectObject(hdcDest, hPen);
 hOldBrush := SelectObject(hdcDest, GetStockObject(NULL_BRUSH));
 Rectangle(hdcDest, 0, 0, rc.Right - rc.Left, rc.Bottom - rc.Top);
 SelectObject(hdcDest, hOldBrush);
 SelectObject(hdcDest, hOldPen);

 ReleaseDC(hwndDest, hdcDest);
 DeleteObject(hPen);
end;  


方法二:
将边框区域颜色取反

procedure HighlightWindow(hWndWindow: HWND);
var hDCWindow: HDC;
   RECT: TRect;
   DINV: Integer;
begin
 if (hWndWindow = 0) or (Not IsWindow(hWndWindow)) then
   Exit
 else begin
   hDCWindow := GetWindowDC(hWndWindow);
   Windows.GetWindowRect(hWndWindow, RECT);
   OffsetRect(RECT, -RECT.Left,-RECT.Top);

   DINV := 4;
   if Not IsRectEmpty(RECT) then
   begin
     PatBlt(hDCWindow, RECT.Left, RECT.Top, RECT.Right - RECT.Left, DINV, DSTINVERT);
     PatBlt(hDCWindow, RECT.left, RECT.bottom - DINV, DINV,
           -(RECT.bottom - RECT.top - 2 * DINV), DSTINVERT);
     PatBlt(hDCWindow, RECT.right - DINV, RECT.top + DINV, DINV,
           RECT.bottom - RECT.top - 2 * DINV, DSTINVERT);
     PatBlt(hDCWindow, RECT.right, RECT.bottom - DINV, -(RECT.right - RECT.left),
           DINV, DSTINVERT);
   end;
   ReleaseDC(hWndWindow, hDCWindow);
 end;
end;


不过这两个都无法实现异型窗体的高亮,

:(

原文地址:https://www.cnblogs.com/kevinzhwl/p/3878954.html