2016-12-11 4 views
-1

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. 
+2

表示されるデスクトップは常にアクティブデスクトップです。その一方で、他のすべてのデスクトップは、最小化/隠蔽されています。 OpenInputDesktopは、アクティブなデスクトップへのハンドルを与えます。 –

+1

あなたはキャプチャの仕組みを診断していないと思いますが、それは不規則ですがシンプルです。最小化/非表示、アクティブのいずれでも、いつでもデフォルトのデスクトップをキャプチャできます。他のデスクトップは、アクティブなときにのみキャプチャできます。 –

+0

@Sertac、yes !,デフォルトのデスクトップは可能です。「新しいデスクトップ」が表示されている場合は表示されていてもキャプチャは正常ですが、それが最小化された後は白い画面がキャプチャされます([hデスクトップは "新しいデスクトップは最小化されていますが、これは正しいですか?](http://pastebin.com/qwRnMdYT))。だから、私は彼が本当にユーザーに見えるときだけ "新しいデスクトップ"をキャプチャしたいと思っています。 – Saulo

答えて

3

あなたはOpenInputDesktopを使用して、アクティブデスクトップへのハンドルを取得することができます。他のすべてのデスクトップがINACTありますive(または最小化された、または隠された、...)。

ハンドルを開くと便利ではない場合は、ハンドルを開いてデスクトップの名前を取得し、ハンドルを閉じて、入力したデスクトップの名前と興味のあるデスクトップを比較できます。以下の例では、GetUserObjectInformationアクティブ/入力デスクトップの名前。

function GetDesktopName(Desktop: HDESK): string; 
var 
    BufSize: DWORD; 
begin 
    BufSize := 0; 
    GetUserObjectInformation(Desktop, UOI_NAME, nil, 0, BufSize); 
    Win32Check(BufSize <> 0); 
    SetLength(Result, (BufSize) div SizeOf(Char)); 
    Win32Check(GetUserObjectInformation(Desktop, UOI_NAME, Pointer(Result), 
     Length(Result) * SizeOf(Char), BufSize)); 
    Win32Check(BufSize <> 0); 
    SetLength(Result, Length(Result) - 1); 
end; 

.. 

var 
    Desktop: HDESK; 
begin 
    Desktop := OpenInputDesktop(0, False, GENERIC_READ); 
    Win32Check(Desktop <> 0); 
    try 
    // don't use ShowMessage if this is not main VCL thread 
    ShowMessage(GetDesktopName(Desktop)); 
    finally 
    Win32Check(CloseDesktop(Desktop)); 
    end; 

あなたはすでにそれが入力されたデスクトップがGetUserObjectInformation(Vistaおよびそれ以降)と簡単ですある場合の照会、任意のデスクトップへのハンドルを持っている場合。

function IsIODesktop(Desktop: HDESK): BOOL; 
var 
    BufSize: DWORD; 
begin 
    BufSize := SizeOf(Result); 
    GetUserObjectInformation(Desktop, UOI_IO, @Result, BufSize, BufSize); 
    Win32Check(BufSize <> 0); 
end; 
+0

非常に良い!上記のソリューションを完璧に動作させます。 – Saulo

関連する問題