C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[11]: 数分間操作がなかった場合のイベントについて


(過去ログ 132 を表示中)

[トピック内 14 記事 (1 - 14 表示)]  << 0 >>

■78005 / inTopicNo.1)  数分間操作がなかった場合のイベントについて
  
□投稿者/ straf (4回)-(2015/12/07(Mon) 13:36:40)

分類:[C#] 

2015/12/07(Mon) 16:12:14 編集(投稿者)

Visual Studio 2015を使いC#で開発を行っております。

数分間カーソルが移動せず、キー入力もされていない場合にフォームを閉じるようにしたいと考えております。

恐らくタイマーで出来るとは思うのですが、カウント方法がよくわかりません。

記述方法がわかる方いらっしゃれば教えていただきたく思います。
引用返信 編集キー/
■78006 / inTopicNo.2)  Re[1]: 数分間操作がなかった場合のイベントについて
□投稿者/ みい (32回)-(2015/12/07(Mon) 14:52:14)
No78005 (straf さん) に返信
> 分類:[C#] 
>
> Visual Studio 2015を使いC#で開発を行っております。
>
> 数分間カーソルが移動せず、キー入力もされていない場合にフォームを閉じるようにしたいと考えております。
>
> 恐らくタイマーで出来るとは思うのですが、カウント方法がよくわかりません。
>
> 記述方法がわかる方いらっしゃれば教えていただきたく思います。
フォームのメンバ変数に
・マウス座標(Point型)
・最新操作時刻(DateTime型)
を用意。
フォーム起動時に現在の日時(DateTime.Now)とマウス座標(Control.MousePosition)をセットしておきます。
・キー入力イベントで日時を更新
・タイマーイベントで現在のマウス座標とメンバ変数を比較し、
座標が変わっていたら、マウス座標と日時を更新
・同じくタイマーイベント内で現在の日時とメンバ変数の日時を比較(TimeSpanで時間差を求める)し、
既定の時間が経過していたらthis.Close()
タイマーのIntervalはどのくらいの精度が必要か次第です
(数分レベルのチェックなら100msとか500msで十分だと思いますが)。
引用返信 編集キー/
■78007 / inTopicNo.3)  Re[2]: 数分間操作がなかった場合のイベントについて
□投稿者/ straf (5回)-(2015/12/07(Mon) 16:11:42)
2015/12/07(Mon) 16:12:59 編集(投稿者)

No78006 (みい さん) に返信
> フォームのメンバ変数に
> ・マウス座標(Point型)
> ・最新操作時刻(DateTime型)
> を用意。
> フォーム起動時に現在の日時(DateTime.Now)とマウス座標(Control.MousePosition)をセットしておきます。
> ・キー入力イベントで日時を更新
> ・タイマーイベントで現在のマウス座標とメンバ変数を比較し、
> 座標が変わっていたら、マウス座標と日時を更新
> ・同じくタイマーイベント内で現在の日時とメンバ変数の日時を比較(TimeSpanで時間差を求める)し、
> 既定の時間が経過していたらthis.Close()
> タイマーのIntervalはどのくらいの精度が必要か次第です
> (数分レベルのチェックなら100msとか500msで十分だと思いますが)。

public partial class Display : Form
{
中略
DateTime dtsave = DateTime.Now;
Point pNow = Control.MousePosition;

中略
private void Display_KeyDown(object sender, KeyEventArgs e)
{

DateTime dtsave = DateTime.Now;
}
}
の後はどのように書けばいいでしょうか?
timerでpointを取得比較、違う場合はpNowに上書きdtsaveの更新だとは思うのですが、比較はPoint.Inequalityというものを使うのでしょうか(記述方法がよくわからないのですがよければ教えていただけ無いでしょうか)

また例えば1分で操作がなければ終了とするときは
DateTime dtNow = DateTime.Now;
で現在時刻を取得しつつ
TimeSpan dts = dtNow - dtsave;
でdtsが1分以上になったときにifで通せばいいのでしょうか



引用返信 編集キー/
■78008 / inTopicNo.4)  Re[3]: 数分間操作がなかった場合のイベントについて
□投稿者/ みい (33回)-(2015/12/07(Mon) 16:31:39)
2015/12/07(Mon) 16:43:17 編集(投稿者)
2015/12/07(Mon) 16:42:39 編集(投稿者)
2015/12/07(Mon) 16:42:26 編集(投稿者)

<pre><pre>■No78007 (straf さん) に返信
「メンバ変数」を更新しましょう。
Point型の比較は難しく考える必要ないです、「!=」で十分。

public partial class Display : Form
{
    private DateTime dtsave;
    private Point pNow;

    private void Display_Load(object sender, EventArgs e)
    {
        dtsave = DateTime.Now;
        pNow = Control.MousePosition;
    }
    private void Display_KeyDown(object sender, KeyEventArgs e)
    {
        dtsave = DateTime.Now
    }
    private void timer1_Tick(object sender, EventArgs e)
    {
        // カーソル移動あり
        if (pNow != Control.MousePosition)
        {
            dtsave = DateTime.Now;
            pNow = Control.MousePosition;
        }

        // 操作なし?
        DateTime dtNow = DateTime.Now;
        TimeSpan dts = dtNow - dtsave;
        if (dts.TotalMinutes >= 1.0)
        {
            this.Close();
        }
    }
}

フォームのKeyPreviewプロパティはTrueにして下さい。
http://dobon.net/vb/dotnet/form/keypreview.html
</pre></pre>

引用返信 編集キー/
■78009 / inTopicNo.5)  Re[4]: 数分間操作がなかった場合のイベントについて
□投稿者/ straf (6回)-(2015/12/07(Mon) 17:12:01)
コードまでありがとうございます。
おかげで理解することが出来ました。

しかし一つ問題が、、作成中のアプリがバックにあり、例えばメモ帳に何か書いているときのkey入力の検出は出来ないのでしょうか?

引用返信 編集キー/
■78010 / inTopicNo.6)  Re[5]: 数分間操作がなかった場合のイベントについて
□投稿者/ kiku (74回)-(2015/12/07(Mon) 18:06:20)

「C# グローバルフック」で検索してみてください。
引用返信 編集キー/
■78011 / inTopicNo.7)  Re[5]: 数分間操作がなかった場合のイベントについて
□投稿者/ みい (34回)-(2015/12/07(Mon) 18:07:09)
No78009 (straf さん) に返信
> コードまでありがとうございます。
> おかげで理解することが出来ました。
>
> しかし一つ問題が、、作成中のアプリがバックにあり、例えばメモ帳に何か書いているときのkey入力の検出は出来ないのでしょうか?
>
キーフック(グローバルフック)が必要です。
「C# キーフック」や「C# グローバルフック」でググるとコードが見つかります。

引用返信 編集キー/
■78012 / inTopicNo.8)  Re[6]: 数分間操作がなかった場合のイベントについて
□投稿者/ PANG2 (96回)-(2015/12/07(Mon) 18:12:10)
GetLastInputInfoかな
http://dobon.net/vb/bbs/log3-33/20115.html
引用返信 編集キー/
■78014 / inTopicNo.9)  Re[7]: 数分間操作がなかった場合のイベントについて
□投稿者/ straf (7回)-(2015/12/07(Mon) 18:34:25)
2015/12/07(Mon) 18:56:17 編集(投稿者)

やはりグローバルフックですかね
しかし、グローバルフックはその気になればキーロガ作れてしまいますし、身内でしか使わないとしてもどうかなといったところですね。

因みにキーロガの検出方法はよくわからないのですが、グローバルフックを使用しただけでアンチウイルス系に引っかかるのでしょうか?
それともバックでネットに繋ごうとしたときに見つかるのでしょうか?

引用返信 編集キー/
■78016 / inTopicNo.10)  Re[7]: 数分間操作がなかった場合のイベントについて
□投稿者/ 魔界の仮面弁士 (590回)-(2015/12/07(Mon) 21:16:52)
No78012 (PANG2 さん) に返信
> GetLastInputInfoかな
> http://dobon.net/vb/bbs/log3-33/20115.html

作ってみた。

using System;
using System.Runtime.InteropServices;
using System.Windows.Forms;

namespace WindowsFormsApplication1
{
    public partial class Form1 : Form
    {
        private Timer timer1;
        private Label label1;
        public Form1()
        {
            InitializeComponent();
            this.label1 = new Label() { Text = "0", AutoSize=true };
            this.Controls.Add(this.label1);
            this.timer1 = new Timer(this.components) { Interval = 50 };
            this.timer1.Tick += delegate
            {
                var last = new LASTINPUTINFO() { cbSize = 8 };
                GetLastInputInfo(ref last);
                var span = new TimeSpan((Environment.TickCount - last.dwTime) * 10000);
                this.label1.Text = span.ToString();
                if (span.TotalMinutes > 1F)
                {
                    this.timer1.Stop();
                    MessageBox.Show("1分経過したので終了します");
                    this.Close();
                }
            };
            this.timer1.Start();
        }

        public struct LASTINPUTINFO
        {
            public uint cbSize;
            public uint dwTime;
        }

        [DllImport("User32")]
        private static extern bool GetLastInputInfo(ref LASTINPUTINFO lastInput);
    }
}

引用返信 編集キー/
■78039 / inTopicNo.11)  Re[8]: 数分間操作がなかった場合のイベントについて
□投稿者/ straf (8回)-(2015/12/09(Wed) 11:10:53)
返信が遅れてしまい申し訳ありません。

わざわざ書いていただきありがとうございます。

少し、理解に時間がかかりそうなので、一度解決済みで終わらせます。
どうしても理解できない場合、再度質問することがあるかもしれないので、その時はどうか宜しくお願いします。

解決済み
引用返信 編集キー/
■78041 / inTopicNo.12)  Re[9]: 数分間操作がなかった場合のイベントについて
□投稿者/ 魔界の仮面弁士 (593回)-(2015/12/09(Wed) 11:50:42)
No78039 (straf さん) に返信
> わざわざ書いていただきありがとうございます。
> 少し、理解に時間がかかりそうなので、一度解決済みで終わらせます。

this.components の null チェックが抜けていたので、修正して再掲。

Timer を自前で new するのではなく、デザイナで貼っている場合は
気にしなくて良いことですが、一応念のため。



using System;
using System.Runtime.InteropServices;
using System.Windows.Forms;

namespace WindowsFormsApplication1
{
 public partial class Form1 : Form
 {
  private Timer timer1;
  private Label label1;
  public Form1()
  {
   InitializeComponent();
   this.label1 = new Label() { Text = "0", AutoSize = true };
   this.Controls.Add(this.label1);
   if (this.components == null) this.components = new System.ComponentModel.Container();
   this.timer1 = new Timer(this.components) { Interval = 50 };
   this.timer1.Tick += delegate
   {
    uint[] last = {8, 0};
    GetLastInputInfo(last);
    var span = new TimeSpan((Environment.TickCount - last[1]) * 10000);
    this.label1.Text = span.ToString();
    if (span.TotalMinutes > 1.0F)
    {
     this.timer1.Stop();
     MessageBox.Show("1分経過したので終了します");
     this.Close();
    }
   };
   this.timer1.Start();
  }

  [DllImport("User32")]
  private static extern bool GetLastInputInfo(uint[] lastInputInfo);
 }
}
解決済み
引用返信 編集キー/
■78043 / inTopicNo.13)  Re[10]: 数分間操作がなかった場合のイベントについて
□投稿者/ furu (42回)-(2015/12/09(Wed) 12:19:12)
横から失礼します。

No78041 (魔界の仮面弁士 さん) に返信
> this.components の null チェックが抜けていたので、修正して再掲。

魔界の仮面弁士さん凄いですね。
this.componentsのnullなんか気づきませんし
必要なことも知りませんでした。

そこで聞きたいのですが
span.TotalMinutesの比較を
doubleの定数ではなく、floatの定数で
行っているのも何か理由があるんですか?

もし、よかったら教えてください。
解決済み
引用返信 編集キー/
■78044 / inTopicNo.14)  Re[11]: 数分間操作がなかった場合のイベントについて
□投稿者/ 魔界の仮面弁士 (594回)-(2015/12/09(Wed) 12:24:40)
No78043 (furu さん) に返信
> span.TotalMinutesの比較を
> doubleの定数ではなく、floatの定数で
> 行っているのも何か理由があるんですか?

あぁ、F じゃなくて D でしたっけ…ただの勘違いです。
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -