plogis()
- это встроенная в R функция для логистической функции (это CDF логистического распределения ). Использование plogis(g*ff, log.p=TRUE)
для получения логарифмической вероятности и plogis(g*ff, log.p=TRUE, lower.tail=FALSE)
для получения дополнительной логарифмической вероятности должно работать:
llh <- sum(y*plogis(g*ff,log.p=TRUE) +
(1-y)*plogis(g*ff, log.p=TRUE, lower.tail=FALSE))
Для менее экстремальных значений (например, g <- 1
) это похоже на ваш подход .
GetForegroundWindow
вместо GetDesktopWindow
. Вы сделали его правильно в своей улучшенной версии.Когда я выполнил Ваш код, мой Delphi, IDE был получен и как это находится на полном экране по умолчанию, он создал иллюзию полноэкранного снимка экрана. (Даже при том, что Ваш код является главным образом правильным),
Рассматривая вышеупомянутые шаги, я успешно смог создать снимок экрана единственного окна с Вашим кодом.
Просто подсказка: Вы можете GetDC
вместо GetWindowDC
если Вы только интересуетесь клиентской областью. (Никакие границы окна)
Править: Вот то, что я сделал с Вашим кодом:
Вы не должны использовать этот код! Посмотрите на улучшенную версию ниже.
procedure TForm1.Button1Click(Sender: TObject);
const
FullWindow = True; // Set to false if you only want the client area.
var
hWin: HWND;
dc: HDC;
bmp: TBitmap;
FileName: string;
r: TRect;
w: Integer;
h: Integer;
begin
form1.Hide;
sleep(500);
hWin := GetForegroundWindow;
if FullWindow then
begin
GetWindowRect(hWin,r);
dc := GetWindowDC(hWin) ;
end else
begin
Windows.GetClientRect(hWin, r);
dc := GetDC(hWin) ;
end;
w := r.Right - r.Left;
h := r.Bottom - r.Top;
bmp := TBitmap.Create;
bmp.Height := h;
bmp.Width := w;
BitBlt(bmp.Canvas.Handle, 0, 0, w, h, DC, 0, 0, SRCCOPY);
form1.Show ;
FileName := 'Screenshot_'+FormatDateTime('mm-dd-yyyy-hhnnss',now());
bmp.SaveToFile(Format('C:\Screenshots\%s.bmp', [FileName]));
ReleaseDC(hwin, DC);
bmp.Free;
end;
РЕДАКТИРОВАНИЕ 2: Согласно просьбе я добавляю лучшую версию кода, но я сохраняю старый как ссылку. Необходимо серьезно рассмотреть использование этого вместо исходного кода. Это будет вести себя намного более хорошее в случае ошибок. (Ресурсы очищены, Ваша форма будет видима снова...),
procedure TForm1.Button1Click(Sender: TObject);
const
FullWindow = True; // Set to false if you only want the client area.
var
Win: HWND;
DC: HDC;
Bmp: TBitmap;
FileName: string;
WinRect: TRect;
Width: Integer;
Height: Integer;
begin
Form1.Hide;
try
Application.ProcessMessages; // Was Sleep(500);
Win := GetForegroundWindow;
if FullWindow then
begin
GetWindowRect(Win, WinRect);
DC := GetWindowDC(Win);
end else
begin
Windows.GetClientRect(Win, WinRect);
DC := GetDC(Win);
end;
try
Width := WinRect.Right - WinRect.Left;
Height := WinRect.Bottom - WinRect.Top;
Bmp := TBitmap.Create;
try
Bmp.Height := Height;
Bmp.Width := Width;
BitBlt(Bmp.Canvas.Handle, 0, 0, Width, Height, DC, 0, 0, SRCCOPY);
FileName := 'Screenshot_' +
FormatDateTime('mm-dd-yyyy-hhnnss', Now());
Bmp.SaveToFile(Format('C:\Screenshots\%s.bmp', [FileName]));
finally
Bmp.Free;
end;
finally
ReleaseDC(Win, DC);
end;
finally
Form1.Show;
end;
end;
Это комбинирует все подходы, описанные до сих пор. Это также обрабатывает сценарии нескольких-мониторов.
Передача в виде снимка экрана, который Вы хотите, и TJpegImage, и он присвоит Ваш требуемый снимок экрана тому изображению.
///////////
uses
Jpeg;
type //define an ENUM to describe the possible screenshot types.
TScreenShotType = (sstActiveWindow, sstActiveClientArea,
sstPrimaryMonitor, sstDesktop);
///////////
procedure TfrmMain.GetScreenShot(shotType: TScreenShotType;
var img: TJpegImage);
var
w,h: integer;
DC: HDC;
hWin: Cardinal;
r: TRect;
tmpBmp: TBitmap;
begin
hWin := 0;
case shotType of
sstActiveWindow:
begin
//only the active window
hWin := GetForegroundWindow;
dc := GetWindowDC(hWin);
GetWindowRect(hWin,r);
w := r.Right - r.Left;
h := r.Bottom - r.Top;
end; //sstActiveWindow
sstActiveClientArea:
begin
//only the active client area (active window minus title bars)
hWin := GetForegroundWindow;
dc := GetDC(hWin);
GetWindowRect(hWin,r);
w := r.Right - r.Left;
h := r.Bottom - r.Top;
end; //sstActiveClientArea
sstPrimaryMonitor:
begin
//only the primary monitor. If 1 monitor, same as sstDesktop.
hWin := GetDesktopWindow;
dc := GetDC(hWin);
w := GetDeviceCaps(DC,HORZRES);
h := GetDeviceCaps(DC,VERTRES);
end; //sstPrimaryMonitor
sstDesktop:
begin
//ENTIRE desktop (all monitors)
dc := GetDC(GetDesktopWindow);
w := Screen.DesktopWidth;
h := Screen.DesktopHeight;
end; //sstDesktop
else begin
Exit;
end; //case else
end; //case
//convert to jpg
tmpBmp := TBitmap.Create;
try
tmpBmp.Width := w;
tmpBmp.Height := h;
BitBlt(tmpBmp.Canvas.Handle,0,0,tmpBmp.Width,
tmpBmp.Height,DC,0,0,SRCCOPY);
img.Assign(tmpBmp);
finally
ReleaseDC(hWin,DC);
FreeAndNil(tmpBmp);
end; //try-finally
end;
Никто здесь не отправил хороший ответ. Решение, которое было до сих пор предложено это для взятия снимка экрана, который 'обрезается' в положении целевого окна. Что, если то окно находится позади другого и в настоящее время не представляется Операционной системой? Вот почему необходимо использовать эту функцию, представленную в Windows XP.
После быстрого Google вот некоторый пример кода: http://delphi.about.com/od/delphitips2008/qt/print_window.htm
JCL приходит на помощь еще раз..
hwnd := GetForegroundWindow;
Windows.GetClientRect(hwnd, r);
JclGraphics.ScreenShot(theBitmap, 0, 0, r.Right - r.Left, r.Bottom - r.Top, hwnd);
// use theBitmap...
Используйте GetForegroundWindow () вместо GetDesktopWindow ().
Необходимо будет сохранить дескриптор, который GetForegroundWindow () возвращают и передают сохраненное значение в ReleaseDC () - чтобы быть уверенными, что GetWindowDC () и ReleaseDC () называют точно для того же окна в случае, если активное окно изменяется между вызовами.
Ваш код мог быть намного более простым. Когда Вы выбрали, какую форму Вы хотите сохранить, попробуйте код, который я использую:
procedure SaveFormBitmapToBMPFile( AForm : TCustomForm; AFileName : string = '' );
// Copies this form's bitmap to the specified file
var
Bitmap: TBitMap;
begin
Bitmap := AForm.GetFormImage;
try
Bitmap.SaveToFile( AFileName );
finally
Bitmap.Free;
end;
end;