Gør andre applikationsvinduer gennemsigtige i Delphi

Indlæg af Hanne Mølgaard Plasc

Problem



God dag alle


Jeg søgte på internettet for nogen retninger om, om dette er muligt, men til ingen nytte. Jeg skal skrive en applikation, der giver mig mulighed for at vælge en anden applikation og dermed gøre det valgte program gennemskinneligt og på toppen (som et spøgelsesbilledoverlay).


Er det overhovedet muligt med Delphi? Jeg bruger Delphi XE og Lazarus. Hvis nogen bare kunne snakke mig i den generelle retning af hvor jeg skal starte, vil jeg være meget forpligtet.


Tak på forhånd,

Bedste reference


Du kan gøre dette , men anbefales ikke , fordi denne type adfærd skal håndteres af den egen applikation. alligevel, hvis du insisterer på, at har du en meget god grund til at gøre dette , her forlader jeg koden for at indstille gennemsigtigheden i et vindue og Lav et vindue Top mest, bare for at vise, hvordan det kan gøres.


Gennemsigtighed


Du skal bruge funktionen SetWindowLong med WS\_EX\_LAYERED flag og funktionen SetLayeredWindowAttributes med LWA\_ALPHA for at indstille gennemsigtigheden. [9] [10]


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;


Lav et vindue Top mest


Du skal bruge funktionen SetWindowPos, der overfører værdien HWND\_TOPMOST, som placerer vinduet frem for alt ikke-øverste vinduer. Vinduet opretholder sin øverste position, selv når den er deaktiveret. [11]


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;

Andre referencer 1


Windows kan gøre dette, men en app har intet håb om at gøre dette robust.