找回密码
 加入
搜索
查看: 7969|回复: 19

[AU3基础] 有没有好的办法阻止windows关机或者注销命令的?

 火.. [复制链接]
发表于 2011-11-30 22:40:22 | 显示全部楼层 |阅读模式
小弟学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
 楼主| 发表于 2011-11-30 22:54:32 | 显示全部楼层
自启动代码还没有写进去
发表于 2011-11-30 23:14:31 | 显示全部楼层
回复 1# long_road

我记得P版写过这个的.
 楼主| 发表于 2011-11-30 23:41:37 | 显示全部楼层
回复 3# lixiaolong


    好心人能给个链接么?
发表于 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


看看这个吧!!!!!
发表于 2011-12-1 00:18:22 | 显示全部楼层
回复 4# long_road

我以前看的好像是这个.
http://www.autoitx.com/forum.php ... hlight=%D7%E8%D6%B9
 楼主| 发表于 2011-12-1 10:30:18 | 显示全部楼层
回复 3# lixiaolong


    我另外编写一段专门写入timer.txt的程序,发现_FilewritetoLine()这个函数不能写入timer.txt,是不是WIN7下要用别的函数?
 楼主| 发表于 2011-12-1 10:38:09 | 显示全部楼层
还有fileopen这个函数参数一旦设定成非0,就会导致文件打不开,这是怎么回事???
 楼主| 发表于 2011-12-1 10:44:18 | 显示全部楼层
回复 5# nis


    这个代码是不是在WIN7下没作用?我照写但没效果。。。。。
发表于 2011-12-1 15:04:26 | 显示全部楼层
回复 9# long_road
我的是XP 系统,测试成功! win7 没有试!不好意思!!
 楼主| 发表于 2011-12-1 15:37:40 | 显示全部楼层
回复 10# nis


    估计AU3程序的权限拿这个问题没办法了
发表于 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还回什么.
发表于 2011-12-1 22:10:27 | 显示全部楼层
我现在升级
 楼主| 发表于 2011-12-2 22:40:51 | 显示全部楼层
回复 12# lixiaolong


    知道原因了,_FileWriteToLine()这个函数$sText参数不能直接写变量,要以字符串形式写入。
 楼主| 发表于 2011-12-2 22:42:07 | 显示全部楼层

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

回复 12# lixiaolong


    知道原因了,_FileWriteToLine()这个函数$sText参数不能直接写变量,要以字符串形式写入。谢谢你的帮助
您需要登录后才可以回帖 登录 | 加入

本版积分规则

QQ|手机版|小黑屋|AUTOIT CN ( 鲁ICP备19019924号-1 )谷歌 百度

GMT+8, 2024-11-15 18:19 , Processed in 0.082579 second(s), 23 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表