long_road 发表于 2011-11-30 22:40:22

有没有好的办法阻止windows关机或者注销命令的?

小弟学autoit才一周,最近想控制自己用电脑的时间,就着手编一个开机自启动的计时GUI程序,设置alt+q为Hotkey,每次开机启动后从c:\timer.txt文件读取上次保存的数据,设想的保存数据时间点是关机或者注销,但是我最后发现程序不能保存数据的原因是检测到关机,注销命令后不能执行文件写入命令,是不是windows接受到关机的命令后拒绝外部程序对windows的操作了?有什么办法可以在关机前保存数据并且比较节省资源的?下面我贴上自己的代码:#include <GUIConstantsEx.au3>
#include <StaticConstants.au3>
#include <WindowsConstants.au3>
#include "File.au3"
#Region ### START Koda GUI section ### Form=c:\users\litao\desktop\atuoit3\au3小制作\窗口程序\计时器.kxf
$Form1_1 = GUICreate("timer", 499, 108, 224, 176)
$timer = GUICtrlCreateLabel("", 0, 0, 498, 107)
GUICtrlSetFont(-1, 45, 800, 0, "黑体")
GUISetState(@SW_HIDE)
#EndRegion ### END Koda GUI section ###

Local $file=FileOpen("C:\timer.txt")
      If $file=-1 Then
                        MsgBox(0,"错误","打开文件错误")
                  Exit
                EndIf
Local $line=FileReadLine($file)
Local $second=Mod($line,100)
Local $minute=Int(Mod($line,10000)/100)
Local $hour=Int($line/10000)
Local $turn,$key ;$turn是按alt+q热键后计时5s再隐藏窗口 $key是用来检测窗口是否显示的标志位

FileDelete("C:\timer.txt")
HotKeySet("!q","show") ;设置热键alt+q,显示窗口
OnAutoItExitRegister("autoexit")
While 1
        $second+=1
        Sleep(1000) ;延时1秒
        If $second=60 Then
                $second=0
                $minute+=1
                If $minute=60 Then
                        $minute=0
                        $hour+=1
                EndIf
        EndIf
    If $key Then
                $turn+=1
                If $turn=5 Then
                  GUISetState(@SW_HIDE)
                  $turn=0
                  $key=0
                EndIf
        EndIf
    GUICtrlSetData($timer,$hour&"小时"&$minute&"分钟"&$second&"秒")
WEnd

Func show()
        $key=GUISetState(@SW_SHOW)
EndFunc       
               
Func autoexit()
        If @exitMethod=3 Or @exitMethod=4 Then ;系统注销或关机
           $filecopy=FileOpen("C:\timer.txt",8)
           If $filecopy=-1 Then
                   MsgBox(0,"错误","写入失败")
                EndIf
           FileWriteLine($filecopy,"123")
        EndIf
EndFunc

long_road 发表于 2011-11-30 22:54:32

自启动代码还没有写进去

lixiaolong 发表于 2011-11-30 23:14:31

回复 1# long_road

我记得P版写过这个的.

long_road 发表于 2011-11-30 23:41:37

回复 3# lixiaolong


    好心人能给个链接么?

nis 发表于 2011-12-1 00:08:59

$WM_QUERYENDSESSION = 0x0011
GUIRegisterMsg($WM_QUERYENDSESSION, "Cancel")
GUICreate("")
GUISetSTate(@SW_HIDE)
Global $Esc = 0
While 1
If $Esc = 1 then
MsgBox (0, "", "你不能关机!")
$Esc = 0
EndIf
sleep(10)
WEnd

Func Cancel($hWndGUI, $MsgID, $WParam, $LParam)
$Esc = 1
Return False
EndFunc


看看这个吧!!!!!

lixiaolong 发表于 2011-12-1 00:18:22

回复 4# long_road

我以前看的好像是这个.
http://www.autoitx.com/forum.php?mod=viewthread&tid=23297&highlight=%D7%E8%D6%B9

long_road 发表于 2011-12-1 10:30:18

回复 3# lixiaolong


    我另外编写一段专门写入timer.txt的程序,发现_FilewritetoLine()这个函数不能写入timer.txt,是不是WIN7下要用别的函数?

long_road 发表于 2011-12-1 10:38:09

还有fileopen这个函数参数一旦设定成非0,就会导致文件打不开,这是怎么回事???

long_road 发表于 2011-12-1 10:44:18

回复 5# nis


    这个代码是不是在WIN7下没作用?我照写但没效果。。。。。

nis 发表于 2011-12-1 15:04:26

回复 9# long_road
我的是XP 系统,测试成功! win7 没有试!不好意思!!

long_road 发表于 2011-12-1 15:37:40

回复 10# nis


    估计AU3程序的权限拿这个问题没办法了

lixiaolong 发表于 2011-12-1 21:50:50

本帖最后由 lixiaolong 于 2011-12-1 23:41 编辑

回复 7# long_road #include <File.au3>
;示例: 将替换 c:\test.txt 的第三行
_FileWriteToLine("c:\test.txt", 1, "替换原文第三行文本", 1)
MsgBox(0, "", @error)
;示例: 将在 c:\test.txt 的第三行插入一行文本
_FileWriteToLine("c:\test.txt", 2, "文本插入", 0)
MsgBox(0, "", @error)我用win7,试试这个,看@error还回什么.

xgysww 发表于 2011-12-1 22:10:27

我现在升级

long_road 发表于 2011-12-2 22:40:51

回复 12# lixiaolong


    知道原因了,_FileWriteToLine()这个函数$sText参数不能直接写变量,要以字符串形式写入。

long_road 发表于 2011-12-2 22:42:07

RE: 有没有好的办法阻止windows关机或者注销命令的?

回复 12# lixiaolong


    知道原因了,_FileWriteToLine()这个函数$sText参数不能直接写变量,要以字符串形式写入。谢谢你的帮助
页: [1] 2
查看完整版本: 有没有好的办法阻止windows关机或者注销命令的?