2011-01-02 8 views

答えて

3

編集:\これは、目に見えないデスクトップのために動作しません、私は私の古いコードを見てきた、と私はなかったアクティブデスクトップ(「WinSta0のスクリーンショットをキャッチするためにことを必要としていることがわかり私はOpenInputDesktopを使用しました。

+1 ThievingSixあなたは正しくです。

ご迷惑をおかけして申し訳ありません。


あなたは(、その後、あなたはSetThreadDesktopに渡すことのハンドルを持っているあなたはCreateDestkopでデスクトップを作成している場合)SetThreadDesktopを使用する必要があります。スレッドをデスクトップに切り替えると、スクリーンショットをキャッチできます。良いアイデアはスレッドのために以前のデスクトップに戻ることです(他の/将来のコードを '中断しない')。

var 
    lOldDesktop: HDESK; 
begin 
    lOldDesktop:= GetThreadDesktop(GetCurrentThreadId); 
    try 
    if not SetThreadDesktop(ADesktop) then // pass handle to your desktop, or dekstop handle obtained from OpenInputDesktop 
     {error handle, like RaiseLastOSError or Exit(False)}; 

    // your screenshot/input/mouse code here 

    finally 
    if lOldDesktop<> 0 then // GetThreadDesktop can fail (I don't know condition when this GetThreadDesktop(GetCurrentThreadId) could fail) 
     SetThreadDesktop(lOldDesktop); // revert thread to previous desktop 
    end; 
end; 

SetThreadDesktopが、その場合には失敗する可能性があるためThievingSixが指摘したようにこのコードは、非メインスレッドで実行する必要があります。安全な方法はスクリーンショットを作るスレッドを生成することです。

PS。私はこれが "入力マウス/キーボードを送信"(それはすべきです)で動作するかどうかは分かりませんが、スクリーンショットの動作についてはわかりません。

編集:セッション、ウィンドウステーション上の

+0

私はsetthreaddesktopと呼ばれるデスクトップを作成したのでスクリーンショットを撮るためのコードを提供できますが、スクリーンショットを撮ろうとするとトレイのみを取得します – opc0de

+0

別の「スクリーンショットコード」は必要ありません。 。あなたの新しいデスクトップ*にはStartMenuはありません。各デスクトップには「独自のウィンドウ」があります。このツールで新しいデスクトップを作成すると、新しいデスクトップ上で実行される新しいexplorer.exeプロセスが作成されます。http://technet.microsoft.com/en-us/sysinternals/cc817881(ThievingSixとSysInternalsデスクトップ) 。 – kibab

+1

最後に試したときにスクリーンショットの黒い画面が表示されるため(作業中のウィンドウが再描画されていないため)、作業コードを見たいと思っています。 SysInternalsがライブサムネイルを行っていないという事実が、その点に追加されています。 – ThievingSix

6

私が見つけた短い答えはということですできません。再描画するための可視ウィンドウがないため、ペイントコールがないため、非アクティブデスクトップのスクリーンショットをとることはできません。

SwitchDesktop()コール、スクリーンショット、SwitchDesktop()を元に戻すことができます。ユーザーはそれに気づくことはありませんが、この短期間にウィンドウが再描画する時間がないため、スクリーンショットではほとんど得られません。

また、SetThreadDesktop()を呼び出すために新しいスレッドを作成する必要があります。メインスレッドを使用してGUIアプリケーションを使用すると、そのスレッドは失敗します。 SetThreadDesktop()は、現在のデスクトップにウィンドウがあるときに失敗します。

SysInternalsには、複数のデスクトップ(Linuxデスクトップスイッチのような)を管理するアプリケーションがあります。デスクトップを選択してそれに切り替えると、デスクトップのサムネイルが表示されます。このサムネイルはライブではなく、ユーザーがそのデスクトップにいるときに最後に認識された完全再描画によって取得されます。要するに、SysInternalsがライブスクリーンショットを行えない場合、私たちのいずれかが疑わしい。

これはもちろん、この正確な機能に関する私自身の研究に基づいています。誰かが実際に働かせてくれたら知りたいので、私もそれを使うことはできません!

+0

[私は新しいデスクトップに切り替えた後に 'Default'デスクトップで自分のプログラムを実行しました](http://stackoverflow.com/questions/41029243/how-send-keys-and-mouse-inputs-to-default-desktop-when- new-desktop-created-is-vi)、私はスクリーンショットをキャプチャすることができますが、マウス/キーボードの操作では成功しません。あなたは私を助けるためにいくつかのsuggesionを持っていますか? – Saulo

関連する問題