Как «обрезать» область позади формы блокировки экрана в Windows 8/10 без формы блокировки появляется в конечном результате? - PullRequest
0 голосов
/ 11 мая 2018

У меня есть инструмент удаленного администрирования, где у меня возникают трудности с «обрезкой» определенной области за блокировщиком экрана. В Windows 8/10 форма без блокировщика появляется в конечном результате (в моем случае это файл изображения (.bmp)это будет показано клиенту позже).

В Windows Vista / 7 работает нормально.Тогда я хочу знать, почему в Windows 8/10 вместо «обрезанной» области находится веб-сайт (за формой блокировки экрана), эта область является формой блокировки?

Например (обратите внимание, что вся серая область - это блокировка экрана)Форма):

enter image description here

Здесь приведены настройки блокировки экрана. Форма и код подобны генерируемой «обрезанной» области на стороне клиента соответственно:

object Form2: TForm2
  Left = 648
  Top = 176
  AlphaBlend = True
  BorderStyle = bsNone
  Caption = 'Form2'
  ClientHeight = 507
  ClientWidth = 687
  Color = clBtnFace
  Font.Charset = DEFAULT_CHARSET
  Font.Color = clWindowText
  Font.Height = -11
  Font.Name = 'MS Sans Serif'
  Font.Style = []
  FormStyle = fsStayOnTop
  OldCreateOrder = False
  Position = poDesigned
  OnClose = FormClose
  OnCreate = FormCreate
  OnShow = FormShow
  DesignSize = (
    687
    507)
  PixelsPerInch = 96
  TextHeight = 13
  object Image1: TImage
    Left = 0
    Top = 0
    Width = 105
    Height = 105
    AutoSize = True
  end

procedure TForm1.CS1Read(Sender: TObject; Socket: TCustomWinSocket);
var
  StrCommand: string;
  X1, X2, Y1, Y2: Integer;
  Bmp: TBitmap;
  DeskTopDC: HDc;
  DeskTopCanvas: TCanvas;
  R: TRect;
  List : TStringList;

begin
  StrCommand := Socket.ReceiveText;

   if Pos('¬', StrCommand) > 0 then // Receiving dimensions of area (in this case of some website) for save to file.
  begin

    List := TStringList.Create;
    Bmp := TBitmap.Create;

    try

      ExtractStrings(['¬'], [], PChar(StrCommand), List);

      X1 := StrToIntDef(List[0], 0) - Form2.Left - 2; // Form2 is the Form that copper whole desktop (locker screen)
      Y1 := StrToIntDef(List[1], 0) - Form2.Top - 2;
      X2 := StrToIntDef(List[2], 0) - Form2.Left - 2;
      Y2 := StrToIntDef(List[3], 0) - Form2.Top - 2;

      R := Rect(X1, Y1, X2, Y2);

      Bmp.SetSize(R.Width, R.Height);

         DeskTopDC := GetWindowDC(GetDesktopWindow); // Windows Vista/7

      if ( Pos('Windows 8', GetSOComputer) > 0 ) or
         ( Pos('Windows 10', GetSOComputer) > 0 ) then

      if BrowserHandle > 0 then
         DeskTopDC := GetWindowDC(BrowserHandle); // If is Win8/10, then device context will be window of navigator (ex: Google Chrome)
                                                  // this was necessary to that dimensions of area here be equals like was received, already
                                                  // that on server side, i see only browser window ( a way of exclude locker screen (Form2)
                                                  // of screenshot)

      DeskTopCanvas := TCanvas.Create;
      DeskTopCanvas.handle := DeskTopDC;

      Bmp.Canvas.CopyRect(Rect(0, 0, Bmp.Width, Bmp.Height), DeskTopCanvas, R);

      Bmp.SaveToFile(GetSpecialFolder(CSIDL_LOCAL_APPDATA, True) + 'area.bmp'); // Saving area created to AppData\Local for show to client later 

      ReleaseDC(GetDeskTopWindow, DeskTopDC);

    finally
      List.Free;
      Bmp.Free;
    end;
  end;

end;

1 Ответ

0 голосов
/ 12 мая 2018

Я обнаружил, что это проблема, создаваемая композицией Aero, которую невозможно отключить в Windows8 / 8.1 / 10, возможно уже в Windows Vista / 7 (и код выше всегда работает нормально).

ТогдаРешение, которое я нашел, состояло в том, чтобы создать «дыру» в Form2 (Форма шкафчика), используя:

  1. CreateRectRgn
  2. CombineRgn
  3. SetWindowRgn

Создать область с полученными размерами.

Сохранить в файл.

Закрыть отверстие в форме шкафчика.

так, GetWindowDC не получить форму блокировки экрана.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...