2

c#でwinServiceを使用したWin 7のスクリーンショットに関する古い質問であることは知っています。これに関するすべての記事をスタック オーバーフローで読み、CodeProject で多くの記事を読みました... Win Vista 以降のサービスの 0 セッションと、デスクトップ チェックとの対話をサービスに許可することについて知っています...しかし、私は立ち往生しています (できる表示画像(画面)がどこに保存されているかわからないため、サービスからスクリーンショットを取得しないでください。

   using System;
   using System.Collections.Generic;
   using System.ComponentModel;
   using System.Data;
   using System.Diagnostics;
   using System.Linq;
   using System.ServiceProcess;
   using System.Text;
   using System.Timers;

   namespace MyThirdTry
   {
public partial class Third : ServiceBase
{
    private static MyTimer aTimer;
    public Third()
    {
        InitializeComponent();
        if (!System.Diagnostics.EventLog.SourceExists("MySource"))
        {
            System.Diagnostics.EventLog.CreateEventSource(
                "MySource", "MyNewLog");
        }
        eventLog1.Source = "MySource";
        eventLog1.Log = "MyNewLog";
        aTimer = new MyTimer();
        aTimer.Elapsed += new System.Timers.ElapsedEventHandler(aTimer_Elapsed);
        aTimer.Interval = 10000;
    }

    protected override void OnStart(string[] args)
    {
        eventLog1.WriteEntry("Started\t" + DateTime.Now.ToString("G"));
        aTimer.Enabled = true;
    }

    protected override void OnStop()
    {
        aTimer.Enabled = false;
        eventLog1.WriteEntry("Stopped\t" + DateTime.Now.ToString("G"));
    }
    protected override void OnPause()
    {
        aTimer.Enabled = false;
        eventLog1.WriteEntry("Paused\t" + DateTime.Now.ToString("G"));
        base.OnPause();
    }
    protected override void OnContinue()
    {
        base.OnContinue();
        aTimer.Enabled = true;
        eventLog1.WriteEntry("Continued\t" + DateTime.Now.ToString("G"));
    }
    protected override void OnShutdown()
    {
        aTimer.Enabled = false;
        eventLog1.WriteEntry("Shutted down\t" + DateTime.Now.ToString("G"));
        base.OnShutdown();
    }
    private void aTimer_Elapsed(object sender, ElapsedEventArgs e)
    {
        eventLog1.WriteEntry("Evented\t" + aTimer.TimeTaker() + "\t" + Environment.CurrentDirectory);
        aTimer.TakeScreenShot();
    }
}
}

これは MyTimer クラスです:

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Timers;
    using System.Drawing;
    using System.Drawing.Imaging;
    using System.Security.Principal;
    using System.IO;

    namespace MyThirdTry
    {
class MyTimer:Timer
{
    Bitmap mainBit;
    System.Windows.Forms.Screen main;

    public string TimeTaker()
    {
        return DateTime.Now.ToString("G");
    }

    public void TakeScreenShot()
    {
        string PathToSave = @"c:\results";
        System.IO.Directory.CreateDirectory(PathToSave);

        main = System.Windows.Forms.Screen.PrimaryScreen;
        mainBit = new Bitmap(main.Bounds.Width, main.Bounds.Height, PixelFormat.Format32bppArgb);
        Graphics gScreenShot = Graphics.FromImage(mainBit);

        gScreenShot.CopyFromScreen(main.Bounds.X,
                                   main.Bounds.Y,
                                   0, 0,
                                   main.Bounds.Size,
                                   CopyPixelOperation.SourceCopy);

        string fileName = "result" + Directory.GetFiles(PathToSave).Count().ToString().Trim() + ".png";
        mainBit.Save(System.IO.Path.Combine(PathToSave, fileName), System.Drawing.Imaging.ImageFormat.Png);
    }
}
}

そして、このコードはブラインド(空の)スクリーンショットを返します...すべて動作しますが、サービスは0セッションにあるためスクリーンショットを取得できません...現在ログインしているユーザーのセッションからGUIを取得するにはどうすればよいですか?

4

1 に答える 1

1

セッション 0 以外のデスクトップにアクセスする必要があるため、Windows サービスの代わりにタスク スケジューラのタスクを使用してスクリーンショットをキャプチャすることを検討してください。TS により、ユーザーのセッション内でのプロセスの開始がはるかに簡単になります。タスクは、ユーザーがログインしたときに起動するように構成する必要があります。タスクを実行するユーザー アカウントを などのグループに設定しUsers、ユーザーがログオンしている場合にのみタスクを実行する必要があります。これら 2 つのセキュリティ オプションは、ユーザーのデスクトップ セッションにアクセスするプロセスを作成するために不可欠です。スクリーンショットを撮るための User32 / Gdi32 API 呼び出しを使用して、過去にこれを成功させることができました。

Windows サービスを使用して何らかの方法でスクリーンショットを集約する場合は、WCF を使用して、タスク プロセスから Windows サービスにスクリーンショットを送信します。

于 2013-03-13T01:33:23.733 に答える