現在開発中のアプリケーションで、一定時間操作しないとロックが掛かるようにしたいのですが、タイマーコントロールだけで実現できるのでしょうか。
いろいろ試してみたのですが、うまくいかないので悩んでいます。
「ユーザーがアプリケーションにまったく触っていない」というのを取得できるようなものはあるのでしょうか。

このQ&Aに関連する最新のQ&A

A 回答 (4件)

考え方によっては、MouseOver、Keypressイベントも


取得したほうがいいですね。

話ははずれますが、Windowsのスクリーンセーバー自体が
もともと、操作しなければロックを掛けられる仕組みに
なってます。

この回答への補足

< 話ははずれますが、Windowsのスクリーンセーバー自体が
< もともと、操作しなければロックを掛けられる仕組みに
< なってます。

そうですね。 ということはAPIを駆使して判断しているのでしょうか。
簡単そうで難しいVBのプログラミングにはいつも泣かされます。

補足日時:2001/07/15 22:27
    • good
    • 0

田吾作7です・・・



50以上ですか・・・?
うむそれは厳しい・・・コントロール配列になっているならば多少は楽なんでしょうけど。。。

そうなると、APIを駆使して作って、各コントロールのハンドルを取り出し、それぞれのプロセスを再起的に監視したほうがいいかも?コントロールを一つ追加するたびに、同じ関数を呼び出すプログラムは、スマートではないですね。

σ( ̄ー ̄ ボク ホントはタイマー嫌い


ちなみにスクリーンセーバーは基本的にWM_MOUSEMOVEに反応するようですね。

でわでわ

この回答への補足

たびたび・・・です。
VBって本当に簡単そうで難しいですね。
今まで(VB6)を購入するまでは、DOSベースで業務用アプリケーションを開発していましたので、CUIプログラムならこんなこと簡単にできるのに、このGUIベースのVBはどうしてもなじめなくて困りものです。いまだにDOSベースで活躍する業務用アプリケーションの需要はあるのですが一部にはVBで作ってソースを頂戴・・・ってのも多くなってきましたのでVBに乗り換えました。
DOSユーザー泣かせのVBですが、がんばっていきますのでよろしくお願いします。

補足日時:2001/07/15 23:56
    • good
    • 0

たびたび田吾作7です。



うーんそうですねー。
出来たらフラグを立てたほうがいいと思いますよ。
フラグがなかったら、操作中にロックがかかるという事態が起こる可能性がありますね。
それとWINDOWの位置も監視したほうがいいと思います。プロセス監視をしないでも、もう一つタイマーを用意しておいて、ウィンドウのLEFTとTOPを監視したほうがいいかも知れません。そのタイマーイベントにはDOEVENTSをわすれないようにしてください。

>いろいろ試してみたのですが、うまくいかないので悩んでいます

でわでわ

この回答への補足

やはり、各コントロール全てにフラグを立てるしかないようですね。
しかし、フォーム上に50以上あるコントロール全てに設定するとなればかなり時間と労力の無駄になりそうで、こうなったら、タイマーコントロールだけで強制的にロックを掛けてしまおうか・・・なんて短絡的なことを考えてしまいます。

補足日時:2001/07/15 22:23
    • good
    • 0

どもども田吾作7です。



処理ロジックとしては、、、

フォームのResizeやフォームと各コントロールのMOSEDOWN、KEYDOWNなどのイベントにそれぞれフラグを立てる必要があります。

もしフォームの移動もイベントの認識をしたいのであれば、プロセス監視が必要になります。
Spyって使ったことありますか?
VBアプリケーションだけでなく、Windowsの各ウィンドウやアプリケーション、またはアプリケーションの中の各コントロールは、Windowsからのメッセージを受けて、そのメッセージの種類により、動作します。もちろんフォームの位置の移動にも、フォームのサイズの変更開始、変更中、変更終了にもWindows特有のメッセージがあります。(SendMessageというのをMSDNで検索してください。)
SpyというソフトはVisualStudioに付属してあると思いますが、そのWindowsが送るメッセージをデバッグすることができます。

xiaolong_gooさんが、何が行われたら操作してないとするかがわかったら、もっと詳しく言えるのですが・・・・
そこら辺の仕様を教えてもらえませんか?

この回答への補足

毎度、毎度お世話になります。
基本的にはフォーム上のtextboxなどのコントロールに一定時間入力がなかったりした場合にロックをしたいのです。
ロックといっても、アプリケーションモーダルのメッセージボックスを出してパスワードの入力を求めるだけのものなのですが。
印刷やファイルの読み書きなど、仮に数時間の時間がかかったとしても、それは、アプリケーションがユーザーからの指示を受けて自動実行しているものですよね。私の考え方では、この場合「入力がないもの」と考えています。
こういった場合は、やはり各コントロール全てにフラグを立てて判断するのでしょうか。

補足日時:2001/07/15 14:53
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aと関連する良く見られている質問

Qカウントダウンタイマーでのタイマーの表示方法

VBを始めたばかりなです。
プログラムで-していく、カウントダウンタイマーを作成したのですが、1:30と設定すると90秒表示となり、どうしても01:30という分と秒の表示が出来ません。
カウントされる数字が、何分何秒という表示にさせる方法を教えて下さい
表示のプログラムは以下の通りです。
hyouji.Text = Format(waitsecond, "##:##")
※hyouji.textはタイマーを表示させる部分の名前です。

Aベストアンサー

Format(waitsecond,"##:##")ですと 単に数値を桁あわせするだけです
1:30 1:29 といった形で表示するなら waitSecondを DateTime型に変換して 書式を"mm:ss"といった具合にして見ましょう
hyouji.Text = Format(TimeSerial(0,0,waitsecond), "mm:ss")

Qボタンってコントロール?ツールストリップメニューアイテムもコントロール?

スミマセン...教えて頂けますか?
メソッド命名のためにボタンとツールストリップメニューアイテムを一くくりにしたいのですが両方ともコントロールといって間違いないですか?
それとも他に適切な表現がありますか?
大変申し訳ありません。よろしくお願いします。

Aベストアンサー

いわゆるプッシュボタンはコントロールです。
ツールストリップメニューアイテムもコントロールですね。

メソッド命名ならそんなこだわる必要も無いですが、
UIItem(ユーザインターフェースアイテム)などでも可笑しくはないと思います。

Q普通のコントロールをコントロール配列に変更する方法

ボタンがたくさんあるプログラムを作っていて、拡張していくうちにますますボタンの数が増えてしまいました。
最初からコントロール配列にしておけばよかったと後悔していますが、
いまからコントロール配列に変更する方法はありますか。
プロパティ設定なども細かく行っているので、最初から作り直すのはつらいです。

Aベストアンサー

オブジェクト名をコントロール配列にしたいものに変更すると
コントロール配列にするかきいてきますので、はいと すれば いいです。
そうすれば、コントロール配列になります。

Qタブコントロールに貼り付けられたコントロールの移動

VB2008でタブコントロールに貼り付けられたテキストボックス等の移動について悩んでいます。

現在、タブコントロール内にタブが3ページありますが、
1ページ目に貼り付けたコントロール(ラベルやテキストボックスなど)を2ページ目にプログラム的に移動するにはどうすればいいのでしょうか。
デザイナであれば簡単なのですが、プログラムで行おうとすると
「move」に相当するようなものが見あたらず、困っています。

移動したものをプログラム終了後も保存しておく必要は無く、起動時にユーザーの好みのタブに表示させたいという目的で使用するつもりです。

Aベストアンサー

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
  If Me.TextBox1.Parent Is Me.TabPage1 Then
    Call 親変更(Me.TabPage1, TabPage2, Me.TextBox1)
  Else
    Call 親変更(Me.TabPage2, TabPage1, Me.TextBox1)
  End If

End Sub

Sub 親変更(ByVal 元 As TabPage, ByVal 先 As TabPage, ByVal コントロール As Control)
  '元ページからコントロールを引き離す
  元.Controls.Remove(コントロール)

  '先ページへコントロールを登録
  先.Controls.Add(コントロール)
End Sub

Qタイマー機能について

初めての投稿です.よろしくお願いいたします.

.NET 2003のMFCを使用しています.
インターフェース上にボタンを設置し,1つのボタンで,
左シングルクリックと左ダブルクリックの両方でメッセージボックスを出したいと考えています.
以前に出ていた質問に同じようなものがあり,(http://oshiete1.goo.ne.jp/qa647244.htmlを参照)
タイマー機能を使えばよいということはわかったのですが,実際どうプログラミングを組んだらいいのかわかりません.

OnLButtonDown内で,
if(数秒以内にもう一度クリックされたら){
ダブルクリックの処理
}else{
シングルクリックの処理
}
というのしか思いつかないのですが,これは無理ですよね(^_^;)
ダブルクリックの処理はOnLButtonDblClk内で行なっていて…

頭がこんがらがってしまいました.
ぜひアドバイスいただければと思います.
よろしくお願いいたします.

Aベストアンサー

当方VB2005なのでそちらで動くか分かりませんが、こちらで動作確認が取れましたので参考になれば幸いです。
尚、参考URLのソースコードをVB2005に直したものです。

Private Declare Function GetDoubleClickTime Lib "USER32" () As Integer
Private Declare Function SetTimer Lib "user32.dll" _
(ByVal hWnd As Integer, ByVal uElapse As Integer, _
ByVal lpTimerFunc As Integer, ByVal lpTimerProc As Integer) As Integer
Private Declare Function KillTimer Lib "user32.dll" _
(ByVal hWnd As Integer, ByVal uIDEvent As Integer) As Integer


Protected Overrides Sub WndProc(ByRef m As System.Windows.Forms.Message)
Const WM_LBUTTONDOWN = &H201
Const WM_RBUTTONDOWN = &H204
Const WM_LBUTTONDBLCLK = &H203
Const WM_RBUTTONDBLCLK = &H206
Const WM_TIMER = &H113

Select Case m.Msg
Case WM_LBUTTONDOWN, WM_RBUTTONDOWN
SetTimer(Me.Handle, m.Msg, GetDoubleClickTime(), Nothing)
Exit Sub
Case WM_LBUTTONDBLCLK
KillTimer(Me.Handle, WM_LBUTTONDOWN)
MessageBox.Show("左ダブルクリック")
Exit Sub
Case WM_RBUTTONDBLCLK
KillTimer(Me.Handle, WM_RBUTTONDOWN)
MessageBox.Show("右ダブルクリック")
Exit Sub
Case WM_TIMER

KillTimer(Me.Handle, m.WParam.ToInt32)
If m.WParam = WM_LBUTTONDOWN Then
MessageBox.Show("左シングルクリック")
ElseIf m.WParam = WM_RBUTTONDOWN Then
MessageBox.Show("右シングルクリック")
End If
Exit Sub
End Select
MyBase.WndProc(m)
End Sub

参考URL:http://www.daccho-it.com/program/WinApi/sdclk.htm

当方VB2005なのでそちらで動くか分かりませんが、こちらで動作確認が取れましたので参考になれば幸いです。
尚、参考URLのソースコードをVB2005に直したものです。

Private Declare Function GetDoubleClickTime Lib "USER32" () As Integer
Private Declare Function SetTimer Lib "user32.dll" _
(ByVal hWnd As Integer, ByVal uElapse As Integer, _
ByVal lpTimerFunc As Integer, ByVal lpTimerProc As Integer) As Integer
Private Declare Function KillTimer Lib "user...続きを読む


このカテゴリの人気Q&Aランキング

おすすめ情報