this質問に答えると、作成されたランダムなデスクトップが表示されているかどうかを知ることができますか?WinSta0で作成した「ランダムデスクトップ」が表示されている(最小化されていない)かどうかを確認するにはどうすればよいですか?
新しいデスクトップを最小化すると、「空の」ビットマップ(白いキャプチャ)が生成されます。OpenDesktop
新しいデスクトップ(以下のコードでは「default_set」と呼ばれます)が最小化されるとapiが失敗します。だから、:-(
、それを解決する方法があります?
はどんな提案でいただきありがとうございます。
program Project1;
{$R *.res}
uses
Winapi.Windows,
System.SysUtils,
vcl.Graphics;
function fillstrL (s: string; l: byte; c:char): string;
begin
while length(s) < l do
s:= c+s;
result:= s;
end;
procedure PrintSCR;
var
hWin: HWND;
dc: HDC;
bmp: TBitmap;
FileName: string;
r: TRect;
w: Integer;
h: Integer;
begin
hWin := GetDesktopWindow;
GetWindowRect(hWin,r);
dc := GetWindowDC(hWin) ;
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);
FileName := 'Screenshot_'+FormatDateTime('mm-dd-yyyy-hhnnss',now());
bmp.SaveToFile(Format('%s.bmp', [FileName]));
ReleaseDC(hwin, DC);
bmp.Free;
end;
var
hSaveDesktop, hDesktop: HDESK;
////////////////////////////////////////////////////////////////////////////////
begin
try
while True do
begin
hSaveDesktop := GetThreadDesktop(GetCurrentThreadId);
Win32Check(hSaveDesktop <> 0);
hDesktop := OpenDesktop('default_set', 0, True, GENERIC_ALL);
Win32Check(hDesktop <> 0);
try
Win32Check(SetThreadDesktop(hDesktop));
try
PrintSCR;
finally
Win32Check(SetThreadDesktop(hSaveDesktop));
end;
finally
Win32Check(CloseDesktop(hDesktop));
end;
Sleep(1000);
PrintSCR;
Sleep(5000);
end;
except
on E: Exception do
Writeln(E.ClassName, ': ', E.Message);
end;
Readln;
end.
表示されるデスクトップは常にアクティブデスクトップです。その一方で、他のすべてのデスクトップは、最小化/隠蔽されています。 OpenInputDesktopは、アクティブなデスクトップへのハンドルを与えます。 –
あなたはキャプチャの仕組みを診断していないと思いますが、それは不規則ですがシンプルです。最小化/非表示、アクティブのいずれでも、いつでもデフォルトのデスクトップをキャプチャできます。他のデスクトップは、アクティブなときにのみキャプチャできます。 –
@Sertac、yes !,デフォルトのデスクトップは可能です。「新しいデスクトップ」が表示されている場合は表示されていてもキャプチャは正常ですが、それが最小化された後は白い画面がキャプチャされます([hデスクトップは "新しいデスクトップは最小化されていますが、これは正しいですか?](http://pastebin.com/qwRnMdYT))。だから、私は彼が本当にユーザーに見えるときだけ "新しいデスクトップ"をキャプチャしたいと思っています。 – Saulo