2009-09-18 14 views
5

Windowsサービスからプロセスを実行し、そこからスクリーンショットを取得する必要があります。Windowsサービスでのプロセスのスクリーンショット

BitBltとPrintWindowのWin32呼び出しを試しましたが、どちらも空白(黒色)のビットマップを示します。

通常のユーザープロセスからコードを実行するとうまくいきます。

これも可能ですか?それとも、試してみる別の方法がありますか?私たちが試した

もの:

    ローカルシステムとして実行されている
  1. Windowsサービスは、ローカルシステムとしてプロセスを実行します - >スクリーンショットは、管理者として実行している
  2. Windowsサービスを失敗し、管理者としての処理を実行します - >スクリーンショットが失敗しました。
  3. ユーザーXYZとして実行されているWindowsアプリケーションは、XYZ - > screenshotとしてプロセスを実行し、BitBltまたはPrintWindowの両方で動作します。ウィンドウが他のウィンドウの後ろにある場合我々はまた、PrintWindowは、我々の場合のためにうまく機能することを気づい

ローカルシステムから「デスクトップとの対話をサービスに許可」をチェックしようとしました

  • は、それが動作します。

    その他の要件については、親プロセスと子プロセスの両方が同じユーザーの下になければなりません。あるプロセスから別のプロセスへの偽装を実際に使用することはできません。

  • +1

    サービスがデスクトップとやり取りできるようにしましたか? –

    +0

    非常に良いアイデアだが、うまくいかなかった。私はまた、管理者ユーザーとして実行したときに、これを行うのと同じことだと思います。ユーザーはできず、管理コンソールから「デスクトップと対話するサービスを許可する」チェックボックスをオンにします。無効になっています。 – jonathanpeppers

    +0

    これらを検索するには、[サーバーのデスクトップセッションでキャプチャ画面を表示する]も参照してください。(http://stackoverflow.com/questions/5200341/capture-screen-on-server-desktop-session/12851218) – Theraot

    答えて

    3

    私はこれが可能ではないと思います。

    アプリケーションがサービスから開始されなかったシナリオを変更する必要がありましたが、コーナーにNotifyIconを持つ標準のWindowsプログラムでした。

    まだ誰かが本当の答えを見つけたら、教えてください。

    3

    ローカルシステムとして[デスクトップとの対話を許可する]チェックボックスをオンにしましたか?

    +0

    +1 - これは良い考えです。それは確かに私が考えることができる唯一の解決策です。 – David

    +0

    上記のコメントを参照してください。 – jonathanpeppers

    -1

    それはあなたがこのサンプルコードを使用してプログラム的に設定することができ、「デスクトップとの対話をサービスに許可」

    でローカルシステムを使用して動作します:

    http://www.vbforums.com/showthread.php?t=367177(それはvb.netが、非常に簡単です)

    +0

    これはXP上でのみ動作します。 Vistaや7ではなくXPには2つの欠点があります:1.これを有効にすると、サービス内にネットワーク接続を作成して問題に遭遇することがあります。 2.ログインした最初のユーザーのデスクトップにのみ表示されます。2番目のユーザーにすばやく切り替えると、何も表示されません。 – Oliver

    +0

    Ad.1ネットワーク接続?スクリーンショットを作成することによって? Ad.2はい、セッション0アイソレーションのためVista/7では動作しません – ufoq

    6

    現在、私は対応するリンクを見つけることができませんが、問題は、Windowsサービスが通常のユーザーアプリケーションとは別のセッションで実行されることです。

    XPでは、これは完全に真実ではありませんでした。ここにはセッション0で開始されたすべてのサービスがあり、システムにログインした最初のユーザーもセッション0で実行されます。その場合、のようなトリックがデスクトップと対話できるようにしますしかし、別のユーザーにすばやく切り替えると、セッション1になり、サービスと直接対話する機会はありません。これは、RDPを通じてサーバーバージョン(2003または2008など)に接続する場合にも当てはまります。これらのログインは、0より大きいセッションでも開始されます。

    最後に、デスクトップとのやりとりを使用して別の欠点があります。
    このオプションを有効にして、サービスが(デフォルト)SYSTEMアカウントで実行されている場合、ネットワーク接続を作成できませんもう

    サービスで動作するカスタムGUIを取得する正しい方法は、それらを2つのプロセスに分け、何らかの種類のIPC(プロセス間通信)を行うことです。したがって、マシンが起動し、GUIセッションがユーザセッションで開始されると、サービスが起動します。その場合、GUIはスクリーンショットを作成し、それをサービスに送信し、サービスはあなたが好きなものを使ってそれを行うことができます。

    関連する問題