Wywłaszczanie ekranu pod aplikację

0

Cześć,

widziałem ostatnio u klienta pulpit na którym był uruchomiony program w trybie wywłaszczania ekranu. Polegało to na tym że w tym miejscu nic innego nie mogło się pojawić - tylko okno tego programu. Dla reszty systemu obszar ten był tak jakby niewidoczny.

Wiecie coś na ten temat jak to można zrealizować w Delphi. Nawet nie wiem jak to poszukać po angielsku?

0

Ten ficzer nazywa się chyba topmost window, ale to nie jest tak, że w tym miejscu nie może się nic innego pojawić - na blogu oldnewthing mają nawet posta na ten temat:
https://devblogs.microsoft.com/oldnewthing/20110310-00/?p=11253

0

Mi to bardziej wygląda na tzw. Kiosk mode, który stosowany jest wszędzie tam, gdzie użytkownik ma korzystać z danej aplikacji, jednocześnie nie być w stanie używać czegokolwiek innego (innych aplikacji) i nie widzieć powłoki systemu. Jest to standardowy ficzer Windowsów, istniejący od bardzo dawna.

3

Jeśli chodzi tylko o część ekranu to obaj nie macie racji - musisz formę ustawić jako AppBar

unit AppBar;

interface

uses
  ShellAPI,
  Forms,
  
  Windows,
  Messages;

const
  APPBAR_CALLBACK = WM_USER + 6438;

type
  TAppBar = class
  private
    FAppBarData: TAppBarData;
    FEdge:       UINT;
    FRect:       TRect;
    FAppForm:    TForm;
    FRegistered: Boolean;
    procedure AppBarRegister;
    procedure AppBarSetPos;
    procedure AppBarPosChanged;
  public
    constructor Create(AForm: TForm);
    destructor Destroy; override;

    procedure RegisterAppBar(uEdge: UINT);
    procedure AppBarCallback(hwndAccessBar: HWND; uNotifyMsg: UINT; lParam: 
      LPARAM);
  end;

implementation

{ TAppBar }

procedure TAppBar.AppBarCallback(hwndAccessBar: HWND; uNotifyMsg: UINT; lParam: LPARAM);
var
  uState: Cardinal;
begin
  FAppBarData.hWnd := hwndAccessBar;
  uState := SHAppBarMessage(ABM_GETSTATE, FAppBarData);
  case uNotifyMsg of
    ABN_STATECHANGE:
    begin
      SetWindowPos(hwndAccessBar,
        (ABS_ALWAYSONTOP and uState) or HWND_TOPMOST or HWND_BOTTOM,
        0, 0, 0, 0, SWP_NOMOVE or SWP_NOSIZE or SWP_NOACTIVATE);
    end;
    ABN_FULLSCREENAPP:
    begin
      if lParam > 0 then
        SetWindowPos(hwndAccessBar,
          (ABS_ALWAYSONTOP and uState) or HWND_TOPMOST or HWND_BOTTOM,
          0, 0, 0, 0, SWP_NOMOVE or SWP_NOSIZE or SWP_NOACTIVATE)
      else
      begin
        uState := SHAppBarMessage(ABM_GETSTATE, FAppBarData);
        if (uState <> 0 and ABS_ALWAYSONTOP) then
          SetWindowPos(hwndAccessBar, HWND_TOPMOST,
            0, 0, 0, 0,
            SWP_NOMOVE or SWP_NOSIZE or SWP_NOACTIVATE);
      end;
    end;
    ABN_POSCHANGED:
      AppBarPosChanged;
  end;
end;

procedure TAppBar.AppBarPosChanged;
var
  AppBArWidth, AppBarHeight: integer;
begin
  with FAppBarData do
  begin
    GetWindowRect(hWnd, FRect);
    AppBarWidth := rc.Right - rc.Left;
    AppBarHeight := rc.Bottom - rc.Top;

    FRect.Top := 0;
    FRect.Left := 0;
    FRect.Right := GetSystemMetrics(SM_CXSCREEN);
    FRect.Bottom := GetSystemMetrics(SM_CYSCREEN);

    case FEdge of
      ABE_LEFT: rc.Right := rc.Left + AppBarWidth;
      ABE_RIGHT: rc.Left := rc.Right - AppBarWidth;
      ABE_TOP: rc.Bottom := rc.Top + AppBarHeight;
      ABE_BOTTOM: rc.Top := rc.Bottom - AppBarHeight;
    end;

    AppBarSetPos;
  end;
end;

procedure TAppBar.AppBarRegister;
begin
  SHAppBarMessage(ABM_NEW, FAppBarData);
  FRegistered := True;
  AppBarSetPos;
end;

procedure TAppBar.AppBarSetPos;
var
  AppBArWidth, AppBarHeight: integer;
begin
  with FAppBarData do
  begin
    AppBArWidth  := 0;
    AppBarHeight := 0;

    rc.Top := 0;
    rc.Left := 0;
    rc.Right := GetSystemMetrics(SM_CXSCREEN);
    rc.Bottom := GetSystemMetrics(SM_CYSCREEN);

    uEdge := FEdge;

    if FEdge in [ABE_LEFT, ABE_RIGHT] then
    begin
      AppBarWidth := FRect.Right - FRect.Left;
      rc.Top := 0;
      rc.Bottom := GetSystemMetrics(SM_CYSCREEN);
    end
    else
    begin
      AppBarHeight := FRect.Bottom - FRect.Top;
      rc.Left  := 0;
      rc.Right := GetSystemMetrics(SM_CXSCREEN);
    end;

    SHAppBarMessage(ABM_QUERYPOS, FAppBarData);

    case FEdge of
      ABE_LEFT: rc.Right := rc.Left + AppBarWidth;
      ABE_RIGHT: rc.Left := rc.Right - AppBarWidth;
      ABE_TOP: rc.Bottom := rc.Top + AppBarHeight;
      ABE_BOTTOM: rc.Top := rc.Bottom - AppBarHeight;
    end;

    SHAppBarMessage(ABM_SETPOS, FAppBarData);
    Application.ProcessMessages;

    MoveWindow(hWnd, rc.Left, rc.Top, rc.Right - rc.Left, rc.Bottom - rc.Top, True);

    FAppForm.BoundsRect := rc;
  end;
end;

constructor TAppBar.Create(AForm: TForm);
begin
  FAppForm := AForm;
  FRect := AForm.BoundsRect;
  FAppBarData.cbSize := SizeOf(APPBARDATA);
  FAppBarData.hWnd := FAppForm.Handle;
  FAppBarData.uCallbackMessage := APPBAR_CALLBACK;
  FRegistered := False;
end;

destructor TAppBar.Destroy;
begin
  if FRegistered then
    SHAppBarMessage(ABM_REMOVE, FAppBarData);
  inherited;
end;

procedure TAppBar.RegisterAppBar(uEdge: UINT);
begin
  FEdge := uEdge;
  AppBarRegister;
end;

end.

a potem np. w konstruktorze formy

  FAppBar := TAppBar.Create(Self);
  FAppBar.RegisterAppBar(ABE_BOTTOM);
0

nagrałem próbkę pulpitu z tym oprogramowaniem (dołączam do postu spakowany filmik mkv zipem). Dodatkowo rozmawiałem z twórcą tej aplikacji. Nazywa on ten efekt właśnie wywłaszczaniem ekranu. Pisał to w c# i konsultował z Microsoftem jak to zrobić.
Zobaczcie że to wygląda jak by to była najwyższa warstwa?2022-12-16_15-34-30.zip

0

Da się to zarejestrować jako dodatkowy pasek zadań.

1 użytkowników online, w tym zalogowanych: 0, gości: 1