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

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

新規登録して質問してみよう
ただいま回答率
85.48%
VB

VB(ビジュアルベーシック)はマイクロソフトによってつくられたオブジェクト指向プログラミング言語のひとつで、同社のQuickBASICが拡張されたものです。VB6の進化版といわれています。

VB.NET

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

Q&A

解決済

1回答

8296閲覧

一定時間操作がない場合、初期画面に戻る

pon108

総合スコア19

VB

VB(ビジュアルベーシック)はマイクロソフトによってつくられたオブジェクト指向プログラミング言語のひとつで、同社のQuickBASICが拡張されたものです。VB6の進化版といわれています。

VB.NET

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

0グッド

0クリップ

投稿2019/08/09 00:36

前提・実現したいこと

visual studioを使用してWindowsアプリケーションを作成しております。
その中で「一定時間操作(マウスやキーボード入力)が無ければ初期画面に戻る。といった内容を入れたいのですが
どのように実現させればよいか分からず困っています。

発生している問題・エラーメッセージ

いろんなサイトを参考に考えてみましたが どの部分(クラス!?)に記述を行えば良いか分からず、また処理方法も漠然としか分からず製作が止まっています。

該当のソースコード

VB

1 Private Sub Main_Load(sender As Object, e As EventArgs) Handles Me.Load 2 3 '↓この部分に戻りたい 4 5 LoginForm1.ShowDialog() 6 7 'そのほかの処理 8 9 End Sub

試したこと

下記サイトを頼りに読んでみましたが
実際にどの部分に記述すればよいのか。記述箇所も内容も分からない状態です。

 ・参考サイト
参考サイト1
参考サイト2

補足情報(FW/ツールのバージョンなど)

VisualStudio2019
SQLServer2016
開発言語 VB

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

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

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

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

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

YAmaGNZ

2019/08/09 00:38

作成されているアプリケーションへの操作が一定時間無い場合でしょうか? それとも、Windows全体への操作が一定時間無い場合でしょうか?
pon108

2019/08/09 00:41

いつもお世話になっております。 イメージしているのはWindouws全体で考えております。
guest

回答1

0

ベストアンサー

まず、最後に操作された時間を取得する方法にGetLastInputInfoというAPIがあります。

VBNET

1Public Class Form1 2 3 'APIの定義 4 <DllImport("user32.dll")> 5 Shared Function GetLastInputInfo(ByRef plii As LASTINPUTINFO) As Boolean 6 End Function 7 8 <StructLayout(LayoutKind.Sequential)> 9 Structure LASTINPUTINFO 10 Public cbSize As UInteger 11 Public dwTime As UInteger 12 End Structure 13 14 Private timer1 As Timer 15 Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load 16 Timer1 = New Timer With {.Interval = 100, .Enabled = True} 17 AddHandler timer1.Tick, Sub() 18 Dim info As LASTINPUTINFO 19 Dim r As Boolean 20 21 info.cbSize = Marshal.SizeOf(info) 22 r = GetLastInputInfo(info) 23 24 Dim span = New TimeSpan((Environment.TickCount - info.dwTime) * 10000) 25 Me.Text = $"無操作時間 = {span}" 26 End Sub 27 End Sub 28End Class 29

こちらで動作の確認が行えるかと思います。

また、初期状態への戻し方ですが
実行されるソースの場所をMain_Loadにするという考え方ではなく、
・開いているフォームがあれば閉じる。
・最初の状態に表示されているフォームを表示する
・表示されているコントロール等を初期状態に戻す
といった処理を行う関数を作成し、それを実行するという形にするのがよろしいかと思います。
初期状態にするという関数を作成すれば、Main_Loadでもこれを呼べばいいことになります。

追記

MainFormというフォームを作り、ボタンとタイマーを配置してください。
ボタンを押すと、サブフォームが表示され、5秒後に元に戻ります。

VBNET

1Public Class MainForm 2 3 Private Sub MainForm_Load(sender As Object, e As EventArgs) Handles MyBase.Load 4 InitializeApplication() 5 End Sub 6 7 Private Sub Timer1_Tick(sender As Object, e As EventArgs) Handles Timer1.Tick 8 InitializeApplication() 9 End Sub 10 11 Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click 12 Dim form As New Form() With {.Name = $"SubForm", .Text = "サブフォーム"} 13 form.Show() 14 15 Me.Hide() 16 17 Timer1.Interval = 5000 18 Timer1.Enabled = True 19 End Sub 20 21 Private Sub InitializeApplication() 22 23 '自分以外のフォームを閉じる 24 For Each frm As Form In New ArrayList(Application.OpenForms) 25 If frm IsNot Me Then 26 frm.Close() 27 End If 28 Next 29 30 Me.Show() 31 32 End Sub 33 34End Class 35

ただし、サブフォームなどで、ダイアログを連続で表示するような形になっている場合はダイアログが表示されてしまいます。
例)

VBNET

1 Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click 2 MessageBox.Show("テスト") 3 MessageBox.Show("テスト2") 4 End Sub

とあった場合、"テスト"のダイアログで止めている場合、サブフォームが閉じた後に"テスト2"のダイアログが表示されます。

投稿2019/08/09 01:17

編集2019/08/10 04:15
YAmaGNZ

総合スコア10242

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

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

pon108

2019/08/10 02:45

回答ありがとうございます。 質問時の私の説明不足で申し訳ありませんが 現在作成しているアプリケーションには複数のFormがあり、メイン画面より開くFormを選択するようにしております。 どのFormが開いていても一定時間(5分くらい)が経過すると最初のメイン画面に戻るようにしたいと考えています。 この場合教えていただきましたコードをどの部分に記述すればよいのでしょうか?
YAmaGNZ

2019/08/10 03:03

私は貴方のソフトの構造を知りませんので、どこに記述すればよいかは分かりかねます。 ただ、どの画面へ遷移しても常に動く部分へ実装すればいいのではないでしょうか。
pon108

2019/08/10 03:19

確かにその通りですね。 軽率な質問申し訳ありません。 >どの画面へ遷移しても常に動く部分へ実装 現在の私の知識では思い浮かばず、いつもは同じコードを毎回Form単位でそのクラスに記述している状況です。 例えばどのような方法がありますでしょうか?
YAmaGNZ

2019/08/10 03:52

例えば、メイン画面ですが、画面をどのように遷移しているか分かりませんがHideしているだけであれば、見えないだけでイベントなどは発生します。 ですので、タイマーを動かして監視するということはできるでしょう。 簡単な例を追記しておきます。
pon108

2019/08/11 23:46

返信が遅くなってしまい申し訳ありません。 FormはHideしているだけなので、教えていただきましたように メイン画面のLoadイベントでタイマーを動かして監視するようにしてみます。 ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問