仕事用の内部非アクティブ ロガーを作成しています。最初は、これをバックグラウンドで動作する非表示の 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