2015-03-11 3 views
1

Моя цель - получить снимок экрана из внешнего приложения без его главного меню. Я использую этот код:Как получить границы главного меню окна?

BitBlt(Canvas.Handle, 0, 0, Width, Height, WinDC, xShift, yShift, SRCCOPY); 

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

Так что мой вопрос: как я могу получить координаты нижней левой точки в строке главного меню окна (необходимо для моих xShift и yShift переменных)? Точка показана на рисунке:

This point coordinates are needed

Или, есть ли способ, чтобы получить клиент границы окна без его главного меню непосредственно, без этого шага?

+0

Вы должны выяснить правильную ручку ClientArea формы, чтобы принять screenshoot его. – SilverWarior

+0

Вы хотите сделать это для этого конкретного приложения или всех приложений в целом? –

+0

@SilverWarior, у меня есть только переменная HWND другого окна –

ответ

3

Вы можете получить всю необходимую информацию, если у вас есть ручка окна. GetClientRect функция даст вам область клиентского окна, но верхняя левая координата будет (0,0). Чтобы перевести это в смещение, вы должны получить координаты экрана этой точки с помощью функции ClientToScreen, а затем просто вычесть координаты экрана окна, чтобы получить смещение, которое вам нужно.

var 
    WindowRect, WindowClientRect: TRect; 
    Origin: TPoint; 
    Ofs: TPoint; 

    Windows.GetWindowRect(Handle, WindowRect); 
    Windows.GetClientRect(Handle, WindowClientRect); 
    Origin := WindowClientRect.TopLeft; 
    Windows.ClientToScreen(Handle, Origin); 
    Ofs.X := Origin.X - WindowRect.Left; 
    Ofs.Y := Origin.Y - WindowRect.Top; 

Так называют в вашей BitBlt функции будет выглядеть следующим образом

BitBlt(Canvas.Handle, 0, 0, WindowClientRect.Width, WindowClientRect.Height, WinDC, Ofs.X, Ofs.Y, SRCCOPY); 

Я не уверен, если TRect имеет Width и Height свойства в Delphi 2010, так что вы, возможно, придется рассчитать Width и Height из WindowClientRect самостоятельно.

+0

Да, ваш код отлично работает для моего дела. Большое спасибо! –

0

Благодаря @Dalija Prašnikar, работал код:

function WindowToBMP(WD: HWND): TBitmap; 
var 
    WinDC: HDC; 
    WindowRect, WindowClientRect: TRect; 
    Origin: TPoint; 
    Ofs: TPoint; 
begin 
    Result := TBitmap.Create; 
    GetWindowRect(WD, WindowRect); 
    GetClientRect(WD, WindowClientRect); 
    Origin := WindowClientRect.TopLeft; 
    ClientToScreen(WD, Origin); 
    Ofs.X := Origin.X - WindowRect.Left; 
    Ofs.Y := Origin.Y - WindowRect.Top; 
    with Result, WindowClientRect do 
    begin 
     Width := WindowClientRect.Right - WindowClientRect.Left; 
     Height := WindowClientRect.Bottom - WindowClientRect.Top; 
     WinDC:=GetWindowDC(Wd); 
     ShowWindow(Wd, SW_SHOW); 
     BringWindowToTop(WD); 
     try 
      BitBlt(Canvas.Handle, 0, 0, Width, Height, WinDC, Ofs.X, Ofs.Y, SRCCOPY); 
     finally 
     end; 
    end; 
end; 
Смежные вопросы