注册 登录
编程论坛 VFP论坛

如何实现5分钟未对vfp编的软件操作就退出

tbk_lcy 发布于 2023-01-17 16:23, 2487 次点击
如何实现5分钟未对vfp编的软件操作就退出
31 回复
#2
吹水佬2023-01-17 16:33
“未操作”的定义是什么?
#3
tbk_lcy2023-01-17 16:48
回复 2楼 吹水佬
就是说软件打开后进行相应的功能操作后,有其他事情,离开5分钟,那么软件自动退出。类似几分钟后屏保。
#4
吹水佬2023-01-17 16:59
以下是引用tbk_lcy在2023-1-17 16:48:20的发言:

就是说软件打开后进行相应的功能操作后,有其他事情,离开5分钟,那么软件自动退出。类似几分钟后屏保。

监测键盘鼠标没动作5分钟能否满足要求
#5
kangss2023-01-17 17:26
估计版主猜对了,他就是想要这个效果
#6
吹水佬2023-01-17 17:33
只监视键盘鼠标的话,简单点试试用 API GetLastInputInfo(),看看能否满足要求。
#7
pvm20002023-01-18 00:33
以下是引用吹水佬在2023-1-17 17:33:07的发言:

只监视键盘鼠标的话,简单点试试用 API GetLastInputInfo(),看看能否满足要求。


如果一直在操作别的程序,没有操作VFP程序,这个GetLastInputInfo()也适用吗
#8
sam_jiang2023-01-18 00:37
可以设置一个全局变量X,记录最后操作时间,鼠标移动,或有按键事件就改写这个时间。

再设一个计时器,每隔5分钟就去读取这个X,如果时间差大于5分钟,就退出程序
#9
吹水佬2023-01-18 07:52
以下是引用pvm2000在2023-1-18 00:33:11的发言:



如果一直在操作别的程序,没有操作VFP程序,这个GetLastInputInfo()也适用吗

键盘鼠标是全局的,好象线程或进程独占不了,除非HOOK住。
所以,2、3楼的交流是有必要。
#10
aqyejun2023-01-18 08:49
如果vfp程序有打开的表单没有关闭,或有预览的报表没有关闭,自动退出时会报错,则无法定时退出程序。这个有何解决方法?
#11
tbk_lcy2023-01-18 08:53
回复 8楼 sam_jiang
能否提供一个简单地编码?
#12
aqyejun2023-01-18 09:12
补充回答楼主问题:可以用 MyFll.Fll的idleLoad()函数。
SET library to lib\MyFll.Fll
idleLoad("MessageBox('系统空闲,5分钟后将自动退出!',48,'提示')",300)
idleLoad("do prg\quit.prg",300)

代码加入到主程序中即可。

[此贴子已经被作者于2023-1-18 09:16编辑过]

#13
吹水佬2023-01-18 09:32
以下是引用aqyejun在2023-1-18 08:49:40的发言:

如果vfp程序有打开的表单没有关闭,或有预览的报表没有关闭,自动退出时会报错,则无法定时退出程序。这个有何解决方法?

表单、预览的报表都可以用代码关闭,或者试试QUIT。
#14
吹水佬2023-01-18 09:36
用GetLastInputInfo()的简单示例
程序代码:
DECLARE long GetLastInputInfo IN user32 string@
of = CREATEOBJECT("Form1")
of.show(1)
CLEAR ALL
RETURN

DEFINE CLASS Form1 As Form
    AutoCenter=1
    AllowOutput=0
   
    nLastInputTime = 0
    nLastTime = 0
   
    ADD OBJECT Timer1 AS Timer WITH Interval=1000
    ADD OBJECT Text1 AS TextBox WITH Top=10,Left=10,Value=0

    PROCEDURE Timer1.Timer
        IF INT(thisform.myGetLastInputInfo()/1000) == thisform.nLastInputTime
            IF (INT(SECONDS()) - thisform.nLastTime) > 10
                MESSAGEBOX("鼠标键盘无动作超过10秒关闭退出")
                thisform.Release
            ELSE
                thisform.Text1.Value = thisform.Text1.Value + 1
            ENDIF
        ELSE
            thisform.nLastInputTime = INT(thisform.myGetLastInputInfo()/1000)
            thisform.nLastTime = INT(SECONDS())
            thisform.Text1.Value = 0
        ENDIF
    ENDPROC

    FUNCTION myGetLastInputInfo
        LOCAL lii
        lii = 0h0800000000000000    && struct LASTINPUTINFO
        GetLastInputInfo(@lii)
        RETURN CTOBIN(RIGHT(lii, 4), "4RS")
    ENDFUNC
ENDDEFINE
#15
aqyejun2023-01-18 09:40
以下是引用吹水佬在2023-1-18 09:32:28的发言:


表单、预览的报表都可以用代码关闭,或者试试QUIT。

请教表单、预览的报表可以用什么代码关闭?quit不行。
#16
hu9jj2023-01-18 09:42
8楼的办法可取。定义一个全局的时间变量,在程序中有任何鼠标或键盘操作时则更新这个时间变量,在程序中随时检测这个时间变量与当前时间的差,符合预定值后立即执行关闭程序的代码。
#17
hu9jj2023-01-18 09:44
回复 15楼 aqyejun
可以用close all来关闭已经打开的表、表单、报表等,然后再执行quit。
#18
aqyejun2023-01-18 09:50
回复 17楼 hu9jj
quit.prg使用了:
CLOSE All &&关闭各种类型的文件,但不关闭命令窗口、调试窗口、帮助、跟踪窗口。
CLOSE Database &&关闭所有数据库
Clear Menus &&释放内存中所有的菜单定义。
Release ALL EXTENDED &&释放内存中所有变量。
Clear Popups &&释放内存中所有用DEFINE POPUP命令创建的菜单定义。
Clear Windows &&释放内存中所有用户自定义窗口的定义,并从VFP主窗口或活动的用户自定义窗口中清除窗口。
Clear &&清屏
QUIT &&退出
其中还有其他数据库操作代码,估计有影响自动退出功能!
另说明:
【idleLoad("do prg\quit.prg",300)】中的“300”可以用全局变量替代,程序中可自定义!
#19
aqyejun2023-01-18 09:53
发现预览的报表很难用程序代码关闭!
#20
吹水佬2023-01-18 10:22
以下是引用aqyejun在2023-1-18 09:53:42的发言:

发现预览的报表很难用程序代码关闭!

异步打开应该可以,加个NOWAIT子项试试
#21
sam_jiang2023-01-18 11:43
发出quit命令应该可以关闭所有的,除非没有发出clear event!
#22
sam_jiang2023-01-18 11:58
回复 11楼 tbk_lcy
实现的代码很简单啊。
主程序里加以下代码:
public X
X=datetime()

在你的文本框的interchange以及form的mousemove里加以下代码:
X=datetime()

定时器里的代码:
ntime=datetime()-X
if ntime>300
    clear event
    quit
endif
#23
aqyejun2023-01-27 09:20
*系设定参数a1为自动关闭的秒数,代码加入到主程序中。
SET library to lib\MyFll.Fll
idleLoad("do prg\quittime.prg",a1)

**quittime.prg代码
if _SCREEN.FORMCOUNT>1  &&获取已经打开的预览窗口数量
FOR I = 1 TO _SCREEN.FORMCOUNT
    KEYBOARD '{CTRL+F4}' &&用键盘命令依次关闭预览窗口(包含打印预览)
ENDFOR
else
   clear event
   quit
ENDIF


[此贴子已经被作者于2023-1-27 09:23编辑过]

#24
吹水佬2023-01-27 10:44
以下是引用aqyejun在2023-1-27 09:20:11的发言:

    KEYBOARD '{CTRL+F4}' &&用键盘命令依次关闭预览窗口(包含打印预览)

VFP的form默认好似是用 Alt+F4
#25
aqyejun2023-01-27 12:08
以下是引用吹水佬在2023-1-27 10:44:18的发言:


VFP的form默认好似是用 Alt+F4

Alt+F4 是退出vfp编译的程序,但有时也不行。
Ctrl+F4 是关闭程序打开的窗口而不退出程序。

[此贴子已经被作者于2023-1-27 12:11编辑过]

#26
吹水佬2023-01-27 12:45
回复 25楼 aqyejun
是关闭的窗口,我的VFP是Alt+F4,用Ctrl+F4关闭不了窗口。
只有本站会员才能查看附件,请 登录

#27
aqyejun2023-01-27 13:50
回复 26楼 吹水佬
只有本站会员才能查看附件,请 登录
#28
sam_jiang2023-01-27 21:32
回复 24楼 吹水佬
ctrl+F4是关闭子窗口
#29
jsn10302023-01-30 17:07
myfll里面有个函数可以解决这个问题
#30
倦猫19732023-01-30 17:33
都要强退了,哪有这么多讲究。

Declare Long TerminateProcess In Win32Api Long, Long
Declare Long GetCurrentProcess In Win32Api
TerminateProcess(GetCurrentProcess(), 0)
#31
ynchunge2025-05-28 13:58
学习了!
#32
hsfisher2025-06-14 00:00
学习了
1