質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.49%
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

サービス

サービスとはバックグラウンド上に常駐し、長時間稼動し続ける実行可能ファイルを指します。

VB.NET

Microsoft Visual Basic .NETのことで、Microsoft Visual Basic(VB6)の後継。 .NET環境向けのプログラムを開発することができます。 現在のVB.NETでは、.NET Frameworkを利用して開発を行うことが可能です。

Q&A

解決済

2回答

10883閲覧

【C# サービス】CopyFromScreenで画面キャプチャができない

退会済みユーザー

退会済みユーザー

総合スコア0

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

サービス

サービスとはバックグラウンド上に常駐し、長時間稼動し続ける実行可能ファイルを指します。

VB.NET

Microsoft Visual Basic .NETのことで、Microsoft Visual Basic(VB6)の後継。 .NET環境向けのプログラムを開発することができます。 現在のVB.NETでは、.NET Frameworkを利用して開発を行うことが可能です。

0グッド

1クリップ

投稿2016/02/23 08:40

###前提・実現したいこと

C#でWindowsのサービスを作成しているのですが、CopyFromScreenで画面をキャプチャしようとすると例外が出てしまい、できません。
どうやらスクリーンの幅・高さも正しく取得できていないようです。
(System.Windows.Forms.Screen.PrimaryScreen.Bounds)

CopyFromScreenをOnStartメソッドに書いたりMainメソッドにも書いたりしましたが、同じような例外が発生してしまいます。
サービスではなくフォームアプリケーションやコンソールアプリケーションでプロジェクトを作り、CopyFromScreenのコードを同じように書くときちんと動作するのですが・・・

やはりサービスでは画面キャプチャはできないのでしょうか。
解決方法などをご存じの方はご教示ください。

###ソースコード

Program.cs

c#

1using System.ServiceProcess; 2 3namespace RemotePC { 4 class Program { 5 static void Main(string[] args) { 6 ServiceBase[] services = new ServiceBase[] { new RemotePCService() }; 7 ServiceBase.Run(services); 8 } 9 } 10}

RemotePCService.cs (ここで例外が発生します)

c#

1using System; 2using System.Diagnostics; 3using System.Drawing; 4using System.Drawing.Imaging; 5using System.IO; 6using System.Net; 7using System.ServiceProcess; 8using System.Timers; 9 10namespace RemotePC { 11 public partial class RemotePCService : ServiceBase { 12 Timer timer; 13 Rectangle ScreenBounds; 14 15 public RemotePCService() { 16 InitializeComponent(); 17 } 18 19 protected override void OnStart(string[] args) { 20 base.OnStart(args); 21 22 ScreenBounds = System.Windows.Forms.Screen.PrimaryScreen.Bounds; 23 24 timer = new Timer(); 25 timer.Interval = 2000; 26 timer.Elapsed += timer_Elapsed; 27 28 EventLog.WriteEntry("OnStart", EventLogEntryType.Information); 29 } 30 31 protected override void OnStop() { 32 base.OnStop(); 33 EventLog.WriteEntry("OnStop", EventLogEntryType.Information); 34 } 35 36 #endregion 37 38 private void timer_Elapsed(object sender, ElapsedEventArgs e) { 39 timer.Stop(); 40 41 try { 42 using(Bitmap bmp = new Bitmap(ScreenBounds.Width, ScreenBounds.Height, PixelFormat.Format32bppArgb)) { 43 using(Graphics g = Graphics.FromImage(bmp)) { 44 g.CopyFromScreen(new Point(0, 0), new Point(0, 0), bmp.Size); 45 //????ここで例外が発生しているようです。 46 } 47 48 bmp.Save("C:\Users\...\Desktop\Test.bmp"); 49 } 50 } catch(Exception ex) { 51 EventLog.WriteEntry(ex.ToString(), EventLogEntryType.Warning); 52 } 53 54 timer.Start(); 55 } 56 } 57}

発生する例外

System.ComponentModel.Win32Exception (0x80004005): ハンドルが無効です。 場所 System.Drawing.Graphics.CopyFromScreen(Int32 sourceX, Int32 sourceY, Int32 destinationX, Int32 destinationY, Size blockRegionSize, CopyPixelOperation copyPixelOperation) 場所 System.Drawing.Graphics.CopyFromScreen(Point upperLeftSource, Point upperLeftDestination, Size blockRegionSize) 場所 RemotePC.RemotePCService.timer_Elapsed(Object sender, ElapsedEventArgs e)

###補足情報

  • Visual Studio 2015
  • .NET Framework 4.5
  • C# 6.0

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

サービスと画面が見えている(ユーザがログインしている)セッションは異なっているためそのままではスクリーンショットは取れないはずです。
詳しくはセッション0分離で調べてみてください。

なんとかサービスでやりたい場合は別アプリを噛ませる方法があります。
英語ですがちょうど良さそうなサンプルがあったので載せておきます。
[C# Windows Service] Automatic Screen Capture - Software Laboratory Center Binus University

もしくはサービスが必須でなければWPF等でタスクトレイ常駐型にしてしまうのも有りかと思います。
C# WPF で タスクトレイ 常駐アプリ の 開発

投稿2016/02/23 09:43

sho_cs

総合スコア3541

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2016/02/23 10:14

なるほど、キャプチャができない理由がわかりました。 後日その方法を試してみます。
guest

0

http://dobon.net/vb/dotnet/graphics/screencapture.html

クリップボード経由と、win32 api 経由のお手本があります。

投稿2016/02/23 08:54

ipadcaron

総合スコア1693

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2016/02/23 10:12

回答ありがとうございます。 後日その方法を試してみます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.49%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問