-6

仕事用の内部非アクティブ ロガーを作成しています。最初は、これをバックグラウンドで動作する非表示の Windows フォームを持つ Windows フォーム アプリケーションにしたかったのですが、プログラムがタスク マネージャーに表示され、このコードをWindows サービスですが、これが可能かどうか疑問に思っていましたか? もしそうなら、それを実装するのに助けが欲しい=]

これはアプリケーションのコードです

using System;
using System.IO;
using System.Windows.Forms;
using System.ComponentModel;
using AccessEye;
using System.Linq;
using EasyNetQ;
using EasyNetQ.Topology;
using Microsoft.Win32;
using MySql.Data.MySqlClient;
using NLog;
using ProtoBuf;
using System.Threading;
using System.Security.AccessControl;
using System.Security.Principal;
using System.Runtime.InteropServices;
using System.Reflection; 

namespace LogProgram
{

    public partial class AppForm : Form
    {

        public static readonly Logger Logger = LogManager.GetCurrentClassLogger();
        private Screensaver watcher;
        public Inactivity inactivity;
        IAdvancedBus bus;
        IExchange exchange;

        public AppForm()
        {

                InitializeComponent();
                ConfigureForm();

                // todo: should be in setting
                int pollingInterval = 5000;

                inactivity = new Inactivity(pollingInterval);
                inactivity.Inactive += inactivity_Inactive;
                inactivity.Active += inactivity_Active;
                inactivity.InactivityThresholdMs = 5 * 1000; // todo: should be in setting
                inactivity.Start();
                watcher = new Screensaver(pollingInterval);
                watcher.ScreensaverOff += watcher_ScreensaverOff;
                watcher.ScreensaverOn += watcher_ScreensaverOn;
                watcher.Start();
                SystemEvents.SessionEnding += SystemEvents_SessionEnding;
                SystemEvents.SessionSwitch += SystemEvents_SessionSwitch;
                LogManager.ThrowExceptions = true;
                // todo: connection string should be in setting
                bus = RabbitHutch.CreateBus("host=as01.access.local;virtualHost=DEV-Reece;username=reece;password=reece").Advanced;
                exchange = Exchange.DeclareTopic("UserActivity", true, false, null);
                var fanout = Exchange.DeclareFanout("FanoutExchange", true, false, null);
                fanout.BindTo(exchange, new[] { "#" });


        }




        public void ConfigureForm()
        {
            this.Hide();
            TrayDisplayer.Visible = false;
        }

        public void WriteLogDataToDb(LogData data)
        {
            using (var db = new LogService.UserActivityDataContext())
            {
                DbLogData logData = AutoMapper.Mapper.Map<LogData, DbLogData>(data);

                int t = (int)data.EventType;

                EventType eventType = db.EventTypes.FirstOrDefault(r => r.Id == t);

                if (eventType == null)
                {
                    eventType = db.EventTypes.Add(new EventType
                    {
                        Event = GetEnumDescriptionAttributeValue(data.EventType),
                        Id = (int)data.EventType
                    });
                    db.SaveChanges();
                }
                logData.EventTypeId = eventType.Id;
                db.LogEvents.Add(logData);

                db.SaveChanges();
            }
        }

        public static string GetEnumDescriptionAttributeValue(Enum value)
        {
            var fieldInfo = value.GetType().GetField(value.ToString());
            var attributes = (DescriptionAttribute[])fieldInfo.GetCustomAttributes(typeof(DescriptionAttribute), false);
            return attributes.Length > 0 ? attributes[0].Description : value.ToString();
        }

        private void AppForm_Load(object sender, EventArgs e)
        {


        }


        void watcher_ScreensaverOn(object sender, EventArgs e)
        {
            var data = LogDataFactory.CollectData();
            data.EventType = AccessEye.UserStateEvents.ScreensaverOn;
            PublishLogData(data);
        }

        void watcher_ScreensaverOff(object sender, EventArgs e)
        {
            var data = LogDataFactory.CollectData();
            data.EventType = AccessEye.UserStateEvents.ScreensaverOff;
            PublishLogData(data);
        }

        void SystemEvents_SessionSwitch(object sender, SessionSwitchEventArgs e)
        {
            var data = LogDataFactory.CollectData();

            switch (e.Reason)
            {
                case SessionSwitchReason.SessionLock:
                    data.EventType = UserStateEvents.Lock;
                    break;
                case SessionSwitchReason.SessionUnlock:
                    data.EventType = UserStateEvents.Unlock;
                    break;
            }

            PublishLogData(data);
        }

        public void PublishLogData(AccessEye.LogData LogData)
        {
            WriteLogDataToDb(LogData);

            if (!bus.IsConnected) return;

            try
            {
                using (var publishChannel = bus.OpenPublishChannel())
                {
                    publishChannel.Publish(exchange, LogData.EventType.ToString(), new Message<LogData>(LogData));
                }
            }
            catch (EasyNetQException)
            {
                //todo: handle
            }
        }

        public static byte[] Serialize<T>(T instance)
        {
            using (var stream = new MemoryStream())
            {
                Serializer.Serialize(stream, instance);
                return stream.ToArray();
            }
        }

        private static T DeSerialize<T>(byte[] data)
        {
            using (var stream = new MemoryStream(data))
            {
                return Serializer.Deserialize<T>(stream);
            }
        }

        private void Form1_FormClosing(object sender, FormClosingEventArgs e)
        {
            bus.Dispose();
        }

        public void inactivity_Active(object sender, EventArgs e)
        {

            inactivity.Stop();
            var data = LogDataFactory.CollectData();
            data.EventType = UserStateEvents.Active;
            PublishLogData(data);
            inactivity.Start();

        }

        public void inactivity_Inactive(object sender, EventArgs e)
        {
            inactivity.Stop();
            var data = LogDataFactory.CollectData();
            data.EventType = UserStateEvents.Inactive;
            PublishLogData(data);
            inactivity.Start();
        }

        public void SystemEvents_SessionEnding(object sender, EventArgs e)
        {

            var data = LogDataFactory.CollectData();
            data.EventType = UserStateEvents.Logoff;
            PublishLogData(data);
            Logger.Trace("Logged off");
            }



        }


    }

アップデート

エラー 1 } 予想 C:\Users\reece.cottam\Documents\Visual Studio 2010\OsWatch\UserActivityMonitorBackGround\Service1.cs 36 10 UserActivityMonitorBackGround エラー 2 メソッドには戻り値の型が必要です C:\Users\reece.cottam\Documents\Visual Studio 2010\OsWatch\UserActivityMonitorBackGround\Service1.cs 44 16 UserActivityMonitorBackGround エラー 3 クラス、デリゲート、列挙型、インターフェイス、または構造体が必要です C:\Users\reece.cottam\Documents\Visual Studio 2010\OsWatch\UserActivityMonitorBackGround\Service1.cs 230 28 UserActivityMonitorBackGroundエラー 4 型または名前空間の定義、またはファイルの終わりが予想されます C:\Users\reece.cottam\Documents\Visual Studio 2010\OsWatch\UserActivityMonitorBackGround\Service1.cs 233 5 UserActivityMonitorBackGround エラー 5 型または名前空間の名前 'Windows'名前空間 'System' に存在しません (アセンブリ参照がありませんか?) C:\Users\reece.cottam\Documents\Visual Studio 2010\OsWatch\UserActivityMonitorBackGround\Service1.cs 10 14 UserActivityMonitorBackGround エラー 6 タイプまたは名前空間名'AccessEye' が見つかりませんでした (using ディレクティブまたはアセンブリ参照がありませんか?) C:\Users\reece.cottam\Documents\Visual Studio 2010\OsWatch\UserActivityMonitorBackGround\Service1.cs 12 7 UserActivityMonitorBackGround エラー 7 タイプまたは名前空間名 'EasyNetQ' が見つかりませんでした (using ディレクティブまたはアセンブリ参照がありませんか?) C:\Users\reece.cottam\Documents\Visual Studio 2010\OsWatch\UserActivityMonitorBackGround\Service1.cs 14 7 UserActivityMonitorBackGround エラー 8 Theタイプまたは名前空間名「EasyNetQ」C:\Users\reece.cottam\Documents\Visual Studio 2010\OsWatch\UserActivityMonitorBackGround\Service1.cs 15 7 UserActivityMonitorBackGround Error 9 タイプまたは名前空間名 ' MySql' が見つかりませんでした (using ディレクティブまたはアセンブリ参照がありませんか?) C:\Users\reece.cottam\Documents\Visual Studio 2010\OsWatch\UserActivityMonitorBackGround\Service1.cs 17 7 UserActivityMonitorBackGround エラー 10 タイプまたは名前空間name 'NLog' could not be found (using ディレクティブまたはアセンブリ参照がありませんか?) C:\Users\reece.cottam\Documents\Visual Studio 2010\OsWatch\UserActivityMonitorBackGround\Service1.cs 18 7 UserActivityMonitorBackGround エラー 11 タイプまたは名前空間名「ProtoBuf」見つかりませんでした (using ディレクティブまたはアセンブリ参照がありませんか?) C:\Users\reece.cottam\Documents\Visual Studio 2010\OsWatch\UserActivityMonitorBackGround\Service1.cs 19 7 UserActivityMonitorBackGround Error 12 'UserActivityMonitorBackGround.Service1.Logger ' は 'フィールド' ですが、'タイプ' のように使用されます C:\Users\reece.cottam\Documents\Visual Studio 2010\OsWatch\UserActivityMonitorBackGround\Service1.cs 38 36 UserActivityMonitorBackGround Error 13 名前 'LogManager' は存在しません現在のコンテキスト C:\Users\reece.cottam\Documents\Visual Studio 2010\OsWatch\UserActivityMonitorBackGround\Service1.cs 38 52 UserActivityMonitorBackGround エラー 14 タイプまたは名前空間名 'スクリーンセーバー' が見つかりませんでした (using ディレクティブまたはアセンブリ参照?) C:\Users\reece.cottam\Documents\Visual Studio 2010\OsWatch\UserActivityMonitorBackGround\Service1.cs 39 17 UserActivityMonitorBackGround エラー 15 型または名前空間名 'Inactivity' が見つかりませんでした (using ディレクティブまたはアセンブリ参照がありませんか?) C:\Users\reece.cottam\Documents\Visual Studio 2010\OsWatch\UserActivityMonitorBackGround\Service1.cs 40 16 UserActivityMonitorBackGround エラー 16 型または名前空間名 'IAdvancedBus' が見つかりませんでした (using ディレクティブまたはアセンブリ参照がありません) ?) C:\Users\reece.cottam\Documents\Visual Studio 2010\OsWatch\UserActivityMonitorBackGround\Service1.cs 41 9 UserActivityMonitorBackGround エラー 17 タイプまたは名前空間名 'IExchange' が見つかりませんでした (using ディレクティブまたはアセンブリ参照?) C:\Users\reece.cottam\Documents\Visual Studio 2010\OsWatch\UserActivityMonitorBackGround\Service1.cs 42 9 UserActivityMonitorBackGround エラー 18 型または名前空間名 'Inactivity' が見つかりませんでした (using ディレクティブまたはアセンブリ参照がありませんか?) C:\Users\reece.cottam\Documents\Visual Studio 2010\OsWatch\UserActivityMonitorBackGround\Service1.cs 53 34 UserActivityMonitorBackGround エラー 19 タイプまたは名前空間名 'スクリーンセーバー' が見つかりませんでした (using ディレクティブまたはアセンブリ参照がありません) ?) C:\Users\reece.cottam\Documents\Visual Studio 2010\OsWatch\UserActivityMonitorBackGround\Service1.cs 58 31 UserActivityMonitorBackGround エラー 20 名前 'LogManager' は現在のコンテキスト C:\Users\reece に存在しません。cottam\Documents\Visual Studio 2010\OsWatch\UserActivityMonitorBackGround\Service1.cs 64 17 UserActivityMonitorBackGround エラー 21 名前 'RabbitHutch' は現在のコンテキストに存在しません C:\Users\reece.cottam\Documents\Visual Studio 2010\OsWatch\UserActivityMonitorBackGround \Service1.cs 66 23 UserActivityMonitorBackGround エラー 22 名前 'Exchange' は現在のコンテキストに存在しません C:\Users\reece.cottam\Documents\Visual Studio 2010\OsWatch\UserActivityMonitorBackGround\Service1.cs 67 28 UserActivityMonitorBackGround エラー 23 名前'Exchange' は現在のコンテキスト C:\Users\reece.cottam\Documents\Visual Studio 2010\OsWatch\UserActivityMonitorBackGround\Service1.cs に存在しません 68 30 UserActivityMonitorBackGround エラー 24 'UserActivityMonitorBackGround.Service1''Hide' の定義が含まれておらず、'UserActivityMonitorBackGround.Service1' 型の最初の引数を受け入れる拡張メソッド 'Hide' が見つかりませんでした (using ディレクティブまたはアセンブリ参照がありませんか?) C:\Users\reece. cottam\Documents\Visual Studio 2010\OsWatch\UserActivityMonitorBackGround\Service1.cs 79 18 UserActivityMonitorBackGround エラー 25 名前 'TrayDisplayer' は現在のコンテキストに存在しません C:\Users\reece.cottam\Documents\Visual Studio 2010\OsWatch\UserActivityMonitorBackGround \Service1.cs 80 13 UserActivityMonitorBackGround エラー 26 型または名前空間名 'LogData' が見つかりませんでした (using ディレクティブまたはアセンブリ参照がありませんか?) C:\Users\reece.cottam\Documents\Visual Studio 2010\OsWatch \UserActivityMonitorBackGround\Service1.cs 83 38 UserActivityMonitorBackGround エラー 27 型または名前空間名 'LogService' が見つかりませんでした (using ディレクティブまたはアセンブリ参照がありませんか?) C:\Users\reece.cottam\Documents\Visual Studio 2010\OsWatch\UserActivityMonitorBackGround\ Service1.cs 85 33 UserActivityMonitorBackGround エラー 28 型または名前空間名 'DbLogData' が見つかりませんでした (using ディレクティブまたはアセンブリ参照がありませんか?) C:\Users\reece.cottam\Documents\Visual Studio 2010\OsWatch\ UserActivityMonitorBackGround\Service1.cs 87 17 UserActivityMonitorBackGround エラー 29 名前 'AutoMapper' は現在のコンテキスト C:\Users\reece.cottam\Documents\Visual Studio 2010\OsWatch\UserActivityMonitorBackGround\Service1 に存在しません。cs 87 37 UserActivityMonitorBackGround エラー 30 型または名前空間名 'LogData' が見つかりませんでした (using ディレクティブまたはアセンブリ参照がありませんか?) C:\Users\reece.cottam\Documents\Visual Studio 2010\OsWatch\UserActivityMonitorBackGround\ Service1.cs 87 59 UserActivityMonitorBackGround エラー 31 型または名前空間名 'DbLogData' が見つかりませんでした (using ディレクティブまたはアセンブリ参照がありませんか?) C:\Users\reece.cottam\Documents\Visual Studio 2010\OsWatch\ UserActivityMonitorBackGround\Service1.cs 87 68 UserActivityMonitorBackGround エラー 32 型または名前空間名 'EventType' が見つかりませんでした (using ディレクティブまたはアセンブリ参照がありませんか?) C:\Users\reece.cottam\Documents\Visual Studio 2010\ OsWatch\UserActivityMonitorBackGround\Service1.cs 91 17 UserActivityMonitorBackGround エラー 33 型または名前空間名 'EventType' が見つかりませんでした (using ディレクティブまたはアセンブリ参照がありませんか?) C:\Users\reece.cottam\Documents\Visual Studio 2010\OsWatch\UserActivityMonitorBackGround\ Service1.cs 95 55 UserActivityMonitorBackGround エラー 34 名前 'LogDataFactory' は現在のコンテキストに存在しません C:\Users\reece.cottam\Documents\Visual Studio 2010\OsWatch\UserActivityMonitorBackGround\Service1.cs 125 24 UserActivityMonitorBackGround エラー 35 名前 ' AccessEye' は現在のコンテキストに存在しません C:\Users\reece.cottam\Documents\Visual Studio 2010\OsWatch\UserActivityMonitorBackGround\Service1.cs 126 30 UserActivityMonitorBackGround エラー 36 名前 'LogDataFactory' は現在のコンテキストに存在しません C:\Users\reece.cottam\Documents\Visual Studio 2010\OsWatch\UserActivityMonitorBackGround\Service1.cs 132 24 UserActivityMonitorBackGround エラー 37 名前 'AccessEye' は現在のコンテキスト C:\Users\reece.cottam\Documents\Visual Studio に存在しません2010\OsWatch\UserActivityMonitorBackGround\Service1.cs 133 30 UserActivityMonitorBackGround エラー 38 名前 'LogDataFactory' は現在のコンテキストに存在しません C:\Users\reece.cottam\Documents\Visual Studio 2010\OsWatch\UserActivityMonitorBackGround\Service1.cs 139 24 UserActivityMonitorBackGround エラー 39 名前 'UserStateEvents' は現在のコンテキストに存在しません C:\Users\reece.cottam\Documents\Visual Studio 2010\OsWatch\UserActivityMonitorBackGround\Service1.cs 144 38 UserActivityMonitorBackGround エラー 40 名前 'UserStateEvents' は現在のコンテキストに存在しません C:\Users\reece.cottam\Documents\Visual Studio 2010\OsWatch\UserActivityMonitorBackGround\Service1.cs 147 38 UserActivityMonitorBackGround エラー 41 タイプまたは名前空間名 'AccessEye' が見つかりませんでした (あるusing ディレクティブまたはアセンブリ参照がありませんか?) C:\Users\reece.cottam\Documents\Visual Studio 2010\OsWatch\UserActivityMonitorBackGround\Service1.cs 154 36 UserActivityMonitorBackGround エラー 42 型または名前空間名 'LogData' が見つかりませんでした(using ディレクティブまたはアセンブリ参照がありませんか?) C:\Users\reece.cottam\Documents\Visual Studio 2010\OsWatch\UserActivityMonitorBackGround\Service1.cs 164 96 UserActivityMonitorBackGround エラー 43 タイプまたは名前空間名 'Message'見つかりませんでした (using ディレクティブまたはアセンブリ参照がありませんか?) C:\Users\reece.cottam\Documents\Visual Studio 2010\OsWatch\UserActivityMonitorBackGround\Service1.cs 164 88 UserActivityMonitorBackGround エラー 44 タイプまたは名前空間名 ' EasyNetQException' が見つかりませんでした (using ディレクティブまたはアセンブリ参照がありませんか?) C:\Users\reece.cottam\Documents\Visual Studio 2010\OsWatch\UserActivityMonitorBackGround\Service1.cs 167 20 UserActivityMonitorBackGround エラー 45 名前 'Serializer ' は現在のコンテキスト C:\Users\reece.cottam\Documents\Visual Studio 2010\OsWatch\UserActivityMonitorBackGround\Service1.cs に存在しません 177 17 UserActivityMonitorBackGround エラー 46 名前 'Serializer' は現在のコンテキスト C:\ に存在しませんユーザー\リース。cottam\Documents\Visual Studio 2010\OsWatch\UserActivityMonitorBackGround\Service1.cs 186 24 UserActivityMonitorBackGround エラー 47 型または名前空間名 'FormClosingEventArgs' が見つかりませんでした (using ディレクティブまたはアセンブリ参照がありませんか?) C:\Users\ reece.cottam\Documents\Visual Studio 2010\OsWatch\UserActivityMonitorBackGround\Service1.cs 190 55 UserActivityMonitorBackGround エラー 48 名前 'LogDataFactory' は現在のコンテキストに存在しません C:\Users\reece.cottam\Documents\Visual Studio 2010\OsWatch \UserActivityMonitorBackGround\Service1.cs 199 24 UserActivityMonitorBackGround エラー 49 名前 'UserStateEvents' は、現在のコンテキスト C:\Users\reece.cottam\Documents\Visual Studio 2010\OsWatch\UserActivityMonitorBackGround\Service1 に存在しません。cs 200 30 UserActivityMonitorBackGround エラー 50 名前 'LogDataFactory' は現在のコンテキストに存在しません C:\Users\reece.cottam\Documents\Visual Studio 2010\OsWatch\UserActivityMonitorBackGround\Service1.cs 209 24 UserActivityMonitorBackGround エラー 51 名前 'UserStateEvents'現在のコンテキストに存在しません C:\Users\reece.cottam\Documents\Visual Studio 2010\OsWatch\UserActivityMonitorBackGround\Service1.cs 210 30 UserActivityMonitorBackGround エラー 52 名前 'LogDataFactory' は現在のコンテキスト C:\Users に存在しません\reece.cottam\Documents\Visual Studio 2010\OsWatch\UserActivityMonitorBackGround\Service1.cs 218 24 UserActivityMonitorBackGround エラー 53 名前 'UserStateEvents' は現在のコンテキスト C:\Users\reece に存在しません。cottam\Documents\Visual Studio 2010\OsWatch\UserActivityMonitorBackGround\Service1.cs 219 30 UserActivityMonitorBackGround

4

1 に答える 1

1

いいえ、これはうまくいきません..

サービスには UI コンポーネントがありません。そのため、サービス内を表示することはできませんform。ユーザー インターフェイスの表示には使用されません。


タスクバーからwinformを隠したい場合は、これを行うだけです

yourForm.ShowInTaskBar=false;

winform を taskmanager から非表示にすることもできますが、実装方法がわかりません。Google で検索できます。

于 2013-07-11T13:18:32.000 に答える