Делаем окна других приложений прозрачными в Delphi - PullRequest
3 голосов
/ 07 апреля 2011

Добрый день всем

Я искал в Интернете какие-либо указания относительно того, возможно ли это, но безрезультатно.Мне нужно написать приложение, которое позволит мне выбрать другое приложение и тем самым сделать выбранное приложение полупрозрачным и верхним (как наложение призрачного изображения).

Возможно ли это вообще с Delphi?Я использую Delphi XE и Lazarus.Если кто-нибудь может просто указать мне общее направление с чего начать, я буду очень признателен.

Заранее спасибо,

Ответы [ 2 ]

4 голосов
/ 08 апреля 2011

Вы можете сделать это , но это не рекомендуется , потому что этот тип поведения должен обрабатываться собственным приложением.в любом случае, если вы настаиваете на том, что у вас есть очень веская причина для этого , здесь я оставляю код, чтобы установить прозрачность окна и сделать окна самыми верхними, просто чтобы показать, как это можно сделать.

Прозрачность

Вы должны использовать функцию SetWindowLong с флагом WS_EX_LAYERED и функцией SetLayeredWindowAttributesс помощью LWA_ALPHA для установки прозрачности.

Procedure SethWndTrasparent(hWnd: HWND;Transparent:boolean);
var
 l        : Longint;
 lpRect   : TRect;
begin
    if Transparent then
    begin
      l := GetWindowLong(hWnd, GWL_EXSTYLE);
      l := l or WS_EX_LAYERED;
      SetWindowLong(hWnd, GWL_EXSTYLE, l);
      SetLayeredWindowAttributes(hWnd, 0, 180, LWA_ALPHA);
    end
    else
    begin
      l := GetWindowLong(hWnd, GWL_EXSTYLE);
      l := l xor WS_EX_LAYERED;
      SetWindowLong(hWnd, GWL_EXSTYLE, l);
      GetWindowRect(hWnd, lpRect);
      InvalidateRect(hWnd, lpRect, true);
    end;
end;

Создание окон Top Most

Вы должны использовать функцию SetWindowPos, передаваязначение HWND_TOPMOST, которое помещает окно выше всех не верхних окон.Окно сохраняет свое верхнее положение, даже когда оно деактивировано.

Procedure SethWndOnTop(hWnd: HWND);
var
  lpRect   : TRect;
begin
  if GetWindowRect(hWnd,lpRect) then
  SetWindowPos(hWnd , HWND_TOPMOST, lpRect.left, lpRect.top, lpRect.Right-lpRect.left, lpRect.Bottom-lpRect.Top, SWP_SHOWWINDOW);
end;
3 голосов
/ 07 апреля 2011

Windows может сделать это, но у приложения нет надежды сделать это надежно.

...