#事象
プログラム動かす環境が一定時間ユーザの無操作状態が続くと、強制ログオフするようになっております。ユーザが業務終了後に、大容量のファイル(6GBくらい)をダウンロードするために、ダウンロードを予約し、また、予約を画面からキャンセルできるようにしたいと考えております。一定時間放置後にも予約をキャンセルできるようにしたいため、強制ログオフしないように、プログラムからマウス操作イベントを定期的に出力するようにしております。また、ダウンロード処理も同プログラム内で実行するようします。検証でおこなったところ、ダウンロード処理を走らせない場合は、一定時間放置しても、ディスプレイ電源offや強制ログオフは起こらなかったんですが、ダウンロード処理を走らせますと、プログラムが応答なしとなり、一定時間放置しますと、ディスプレイ電源がoffになりました。しかし、ダウンロード処理は時間がかかりますが、正常に終了します。ファイル容量が小さい場合は強制ログオフをかいひしつ
#アドバイスいただきたいこと
0. 事象に挙げた内容を踏まえ、強制ログオフが起きないようにしつつ、ダウンロード処理を行うにはどのようにすればよいでしょうか?
0. ダウンロード処理にファイル共有し、コピーを行っているのですが、ftpダウンロードの方が負荷が少ないでしょうか?
0. タイマースレッドを用いて、マウスイベントを定期的に出力しているのですが、以下のコードの書き方があまりよくないのでしょうか。
#Form
using System; using System.Diagnostics; using System.IO; using System.Windows.Forms; namespace AidleStatusDisableApp { public partial class Form1 : Form { public Form1() { InitializeComponent(); } private void button1_Click(object sender, EventArgs e) { const string commandMount = @"/c net use \servername\kyouyu password /user:user /PERSISTENT:NO"; ExecuteCommand(commandMount); CopyFiles(@".\test.txt", @"\servername\kyouyu\testbigfile"); } private void button2_Click(object sender, EventArgs e) { } public void ExecuteCommand(string command) { using (var p = new Process()) { //ComSpec(cmd.exe)のパスを取得して、FileNameプロパティに指定 p.StartInfo.FileName = System.Environment.GetEnvironmentVariable("ComSpec"); ////ウィンドウを表示しないようにする p.StartInfo.CreateNoWindow = true; //コマンドラインを指定("/c"は実行後閉じるために必要) p.StartInfo.Arguments = command; //起動 p.Start(); p.WaitForExit(); } } public void CopyFiles(string srcfile, string dstfile) { File.AppendAllText(@".\log.txt", "コピーを開始します。" + DateTime.Now + Environment.NewLine); System.IO.File.Copy(srcfile, dstfile, true); File.AppendAllText(@".\log.txt", "コピーを終了します。" + DateTime.Now + Environment.NewLine); } } }
#Program
using System; using System.Runtime.InteropServices; using System.Threading; using System.Windows.Forms; using System.Threading.Timer namespace AidleStatusDisableApp { public static class Program { const int MOUSEEVENTF_MOVED = 0x0001; [STAThread] public static void Main() { TimerCallback callback = state => { INPUT[] input = new INPUT[1]; // イベントを格納 // ドラッグ操作の準備 (イベントの定義 = 相対座標へ移動) input[0].mi.dx = 0; // 相対座標で0 つまり動かさない input[0].mi.dy = 0; // 相対座標で0 つまり動かさない input[0].mi.dwFlags = MOUSEEVENTF_MOVED; // ドラッグ操作の実行 (イベントの生成) SendInput(1, input, Marshal.SizeOf(input[0])); }; // タイマー起動(0.5秒後に処理実行、1秒おきに繰り返し) Timer MyTimer = new System.Threading.Timer(callback, null, 500, 1000); Application.EnableVisualStyles(); Application.SetCompatibleTextRenderingDefault(false); Application.Run(new Form1()); } [DllImport("user32.dll")] extern static uint SendInput( uint nInputs, // INPUT 構造体の数(イベント数) INPUT[] pInputs, // INPUT 構造体 int cbSize // INPUT 構造体のサイズ ); [StructLayout(LayoutKind.Sequential)] struct INPUT { public int type; // 0 = INPUT_MOUSE(デフォルト), 1 = INPUT_KEYBOARD public MOUSEINPUT mi; } [StructLayout(LayoutKind.Sequential)] struct MOUSEINPUT { public int dx; public int dy; public int mouseData; // amount of wheel movement public int dwFlags; public int time; // time stamp for the event public IntPtr dwExtraInfo; } } }
##環境
.Net Framework 4.6
Windows 10
回答1件
あなたの回答
tips
プレビュー